]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'for-linus' of git://git.kernel.dk/data/git/linux-2.6-block
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Mon, 16 Jul 2007 17:48:20 +0000 (10:48 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Mon, 16 Jul 2007 17:48:20 +0000 (10:48 -0700)
* 'for-linus' of git://git.kernel.dk/data/git/linux-2.6-block:
  splice: direct splicing updates ppos twice
  more ACSI removal
  umem: Fix match of pci_ids in umem driver
  umem: Remove references to dead CONFIG_MM_MAP_MEMORY variable
  remove the documentation for the legacy CDROM drivers

713 files changed:
.gitignore
Documentation/00-INDEX
Documentation/CodingStyle
Documentation/DocBook/procfs-guide.tmpl
Documentation/RCU/checklist.txt
Documentation/SubmitChecklist
Documentation/SubmittingPatches
Documentation/accounting/getdelays.c
Documentation/accounting/taskstats-struct.txt
Documentation/fault-injection/failcmd.sh [deleted file]
Documentation/fault-injection/failmodule.sh [deleted file]
Documentation/fault-injection/fault-injection.txt
Documentation/feature-removal-schedule.txt
Documentation/filesystems/proc.txt
Documentation/filesystems/vfs.txt
Documentation/hrtimer/timer_stats.txt
Documentation/ioctl-number.txt
Documentation/kernel-parameters.txt
Documentation/oops-tracing.txt
Documentation/sound/oss/AD1816 [deleted file]
Documentation/sound/oss/NM256 [deleted file]
Documentation/sound/oss/OPL3-SA2 [deleted file]
Documentation/sound/oss/VIA-chipset [deleted file]
Documentation/sound/oss/cs46xx [deleted file]
Documentation/spinlocks.txt
Documentation/sysctl/ctl_unnumbered.txt [new file with mode: 0644]
Documentation/sysctl/vm.txt
Documentation/vm/hugetlbpage.txt
Documentation/vm/slub.txt
MAINTAINERS
Makefile
arch/alpha/kernel/srmcons.c
arch/alpha/kernel/sys_marvel.c
arch/alpha/kernel/time.c
arch/arm26/Kconfig
arch/arm26/defconfig
arch/arm26/mm/init.c
arch/avr32/kernel/traps.c
arch/cris/arch-v10/defconfig
arch/cris/arch-v32/drivers/cryptocop.c
arch/cris/arch-v32/drivers/i2c.c
arch/cris/arch-v32/drivers/pcf8563.c
arch/frv/kernel/entry.S
arch/frv/kernel/gdb-stub.c
arch/frv/kernel/setup.c
arch/h8300/Kconfig
arch/h8300/Makefile
arch/h8300/boot/compressed/Makefile
arch/h8300/boot/compressed/head.S
arch/h8300/boot/compressed/vmlinux.lds [new file with mode: 0644]
arch/h8300/boot/compressed/vmlinux.scr [new file with mode: 0644]
arch/h8300/kernel/Makefile
arch/h8300/kernel/entry.S [moved from arch/h8300/platform/h8s/entry.S with 62% similarity]
arch/h8300/kernel/ints.c [deleted file]
arch/h8300/kernel/ptrace.c
arch/h8300/kernel/signal.c
arch/h8300/platform/h8300h/Makefile
arch/h8300/platform/h8300h/entry.S [deleted file]
arch/h8300/platform/h8s/Makefile
arch/i386/Kconfig
arch/i386/kernel/head.S
arch/i386/kernel/process.c
arch/i386/kernel/traps.c
arch/ia64/ia32/binfmt_elf32.c
arch/ia64/ia32/ia32_entry.S
arch/ia64/kernel/setup.c
arch/m32r/Kconfig
arch/m68knommu/kernel/process.c
arch/m68knommu/kernel/setup.c
arch/m68knommu/mm/memory.c
arch/parisc/kernel/traps.c
arch/powerpc/Kconfig
arch/powerpc/kernel/traps.c
arch/ppc/kernel/traps.c
arch/s390/kernel/traps.c
arch/sh/Kconfig
arch/sh/Kconfig.debug
arch/sh/Makefile
arch/sh/boards/dreamcast/setup.c
arch/sh/boards/hp6xx/mach.c [deleted file]
arch/sh/boards/hp6xx/setup.c
arch/sh/boards/landisk/setup.c
arch/sh/boards/lboxre2/setup.c
arch/sh/boards/mpc1211/setup.c
arch/sh/boards/renesas/edosk7705/setup.c
arch/sh/boards/renesas/hs7751rvoip/setup.c
arch/sh/boards/renesas/r7780rp/Kconfig
arch/sh/boards/renesas/r7780rp/setup.c
arch/sh/boards/renesas/rts7751r2d/setup.c
arch/sh/boards/renesas/sh7710voipgw/setup.c
arch/sh/boards/renesas/systemh/setup.c
arch/sh/boards/saturn/Makefile [deleted file]
arch/sh/boards/saturn/io.c [deleted file]
arch/sh/boards/saturn/irq.c [deleted file]
arch/sh/boards/saturn/setup.c [deleted file]
arch/sh/boards/saturn/smp.c [deleted file]
arch/sh/boards/se/7206/setup.c
arch/sh/boards/se/7300/setup.c
arch/sh/boards/se/73180/setup.c
arch/sh/boards/se/7343/setup.c
arch/sh/boards/se/7619/setup.c
arch/sh/boards/se/770x/irq.c
arch/sh/boards/se/770x/setup.c
arch/sh/boards/se/7722/irq.c
arch/sh/boards/se/7722/setup.c
arch/sh/boards/se/7751/irq.c
arch/sh/boards/se/7751/setup.c
arch/sh/boards/se/7780/irq.c
arch/sh/boards/se/7780/setup.c
arch/sh/boards/sh03/setup.c
arch/sh/boards/shmin/setup.c
arch/sh/boards/snapgear/setup.c
arch/sh/boards/superh/microdev/setup.c
arch/sh/boards/titan/setup.c
arch/sh/boards/unknown/Makefile [deleted file]
arch/sh/boards/unknown/setup.c [deleted file]
arch/sh/cchips/Kconfig
arch/sh/configs/dreamcast_defconfig
arch/sh/configs/r7780mp_defconfig [new file with mode: 0644]
arch/sh/configs/r7785rp_defconfig
arch/sh/configs/se7206_defconfig
arch/sh/configs/se7619_defconfig
arch/sh/configs/se7722_defconfig
arch/sh/configs/shx3_defconfig [new file with mode: 0644]
arch/sh/drivers/dma/Kconfig
arch/sh/drivers/pci/Kconfig
arch/sh/kernel/Makefile
arch/sh/kernel/cf-enabler.c
arch/sh/kernel/cpu/init.c
arch/sh/kernel/cpu/irq/intc2.c
arch/sh/kernel/cpu/irq/ipr.c
arch/sh/kernel/cpu/sh2/entry.S
arch/sh/kernel/cpu/sh2/probe.c
arch/sh/kernel/cpu/sh2/setup-sh7619.c
arch/sh/kernel/cpu/sh2a/setup-sh7206.c
arch/sh/kernel/cpu/sh3/entry.S
arch/sh/kernel/cpu/sh3/setup-sh7705.c
arch/sh/kernel/cpu/sh3/setup-sh7709.c
arch/sh/kernel/cpu/sh3/setup-sh7710.c
arch/sh/kernel/cpu/sh4/Makefile
arch/sh/kernel/cpu/sh4/probe.c
arch/sh/kernel/cpu/sh4/setup-sh7750.c
arch/sh/kernel/cpu/sh4/setup-sh7760.c
arch/sh/kernel/cpu/sh4a/Makefile
arch/sh/kernel/cpu/sh4a/clock-shx3.c [new file with mode: 0644]
arch/sh/kernel/cpu/sh4a/setup-sh7722.c
arch/sh/kernel/cpu/sh4a/setup-sh7780.c
arch/sh/kernel/cpu/sh4a/setup-sh7785.c
arch/sh/kernel/cpu/sh4a/setup-shx3.c [new file with mode: 0644]
arch/sh/kernel/irq.c
arch/sh/kernel/machvec.c [new file with mode: 0644]
arch/sh/kernel/process.c
arch/sh/kernel/ptrace.c
arch/sh/kernel/setup.c
arch/sh/kernel/sh_ksyms.c
arch/sh/kernel/signal.c
arch/sh/kernel/syscalls.S
arch/sh/kernel/timers/timer-tmu.c
arch/sh/kernel/topology.c [new file with mode: 0644]
arch/sh/kernel/traps.c
arch/sh/kernel/vmlinux.lds.S
arch/sh/lib/div64-generic.c
arch/sh/lib/div64.S
arch/sh/math-emu/math.c
arch/sh/mm/Kconfig
arch/sh/mm/Makefile
arch/sh/mm/fault.c
arch/sh/mm/init.c
arch/sh/mm/numa.c [new file with mode: 0644]
arch/sh/mm/pg-dma.c [deleted file]
arch/sh/tools/Makefile
arch/sh/tools/mach-types
arch/sparc/mm/srmmu.c
arch/sparc/mm/sun4c.c
arch/sparc64/Kconfig
arch/sparc64/kernel/Makefile
arch/sparc64/kernel/ds.c [new file with mode: 0644]
arch/sparc64/kernel/hvtramp.S [new file with mode: 0644]
arch/sparc64/kernel/irq.c
arch/sparc64/kernel/ldc.c [new file with mode: 0644]
arch/sparc64/kernel/mdesc.c
arch/sparc64/kernel/power.c
arch/sparc64/kernel/process.c
arch/sparc64/kernel/prom.c
arch/sparc64/kernel/setup.c
arch/sparc64/kernel/smp.c
arch/sparc64/kernel/sparc64_ksyms.c
arch/sparc64/kernel/sysfs.c
arch/sparc64/kernel/time.c
arch/sparc64/kernel/vio.c [new file with mode: 0644]
arch/sparc64/kernel/viohs.c [new file with mode: 0644]
arch/sparc64/lib/Makefile
arch/sparc64/lib/delay.c [deleted file]
arch/sparc64/prom/misc.c
arch/sparc64/prom/p1275.c
arch/sparc64/prom/tree.c
arch/um/Kconfig.debug
arch/um/config.release [deleted file]
arch/um/defconfig
arch/um/drivers/chan_kern.c
arch/um/drivers/chan_user.c
arch/um/drivers/cow_sys.h
arch/um/drivers/daemon_user.c
arch/um/drivers/fd.c
arch/um/drivers/harddog_user.c
arch/um/drivers/line.c
arch/um/drivers/mcast_user.c
arch/um/drivers/mconsole_user.c
arch/um/drivers/net_user.c
arch/um/drivers/port_user.c
arch/um/drivers/pty.c
arch/um/drivers/slip_user.c
arch/um/drivers/slirp_user.c
arch/um/drivers/ssl.c
arch/um/drivers/stdio_console.c
arch/um/drivers/tty.c
arch/um/drivers/ubd_kern.c
arch/um/drivers/ubd_user.c
arch/um/drivers/xterm.c
arch/um/drivers/xterm_kern.c
arch/um/include/chan_kern.h
arch/um/include/chan_user.h
arch/um/include/common-offsets.h
arch/um/include/os.h
arch/um/include/um_malloc.h
arch/um/kernel/irq.c
arch/um/kernel/process.c
arch/um/os-Linux/aio.c
arch/um/os-Linux/drivers/ethertap_user.c
arch/um/os-Linux/drivers/tuntap_user.c
arch/um/os-Linux/helper.c
arch/um/os-Linux/main.c
arch/um/os-Linux/sigio.c
arch/um/os-Linux/skas/process.c
arch/um/os-Linux/user_syms.c
arch/x86_64/ia32/ia32entry.S
arch/x86_64/kernel/head.S
arch/x86_64/kernel/traps.c
crypto/proc.c
drivers/atm/Kconfig
drivers/auxdisplay/Kconfig
drivers/base/dmapool.c
drivers/block/Kconfig
drivers/block/Makefile
drivers/block/nbd.c
drivers/block/pktcdvd.c
drivers/block/sunvdc.c [new file with mode: 0644]
drivers/block/z2ram.c
drivers/char/Kconfig
drivers/char/Makefile
drivers/char/amiserial.c
drivers/char/consolemap.c
drivers/char/cyclades.c
drivers/char/esp.c
drivers/char/generic_serial.c
drivers/char/genrtc.c
drivers/char/hw_random/intel-rng.c
drivers/char/ip2/i2ellis.c
drivers/char/ipmi/Kconfig
drivers/char/ipmi/ipmi_poweroff.c
drivers/char/ipmi/ipmi_si_intf.c
drivers/char/istallion.c
drivers/char/keyboard.c
drivers/char/misc.c
drivers/char/mspec.c
drivers/char/mxser.c
drivers/char/mxser_new.c
drivers/char/n_hdlc.c
drivers/char/n_r3964.c
drivers/char/n_tty.c
drivers/char/nvram.c
drivers/char/rocket.c
drivers/char/rtc.c
drivers/char/selection.c
drivers/char/sonypi.c
drivers/char/synclink.c
drivers/char/synclink_gt.c
drivers/char/synclinkmp.c
drivers/char/tpm/Kconfig
drivers/char/tty_audit.c [new file with mode: 0644]
drivers/char/tty_io.c
drivers/char/tty_ioctl.c
drivers/connector/Kconfig
drivers/crypto/Kconfig
drivers/dma/Kconfig
drivers/edac/Kconfig
drivers/firmware/edd.c
drivers/firmware/pcdp.c
drivers/macintosh/adb.c
drivers/message/i2o/Kconfig
drivers/message/i2o/device.c
drivers/message/i2o/exec-osm.c
drivers/message/i2o/iop.c
drivers/misc/Kconfig
drivers/misc/sony-laptop.c
drivers/net/Kconfig
drivers/net/Makefile
drivers/net/sunvnet.c [new file with mode: 0644]
drivers/net/sunvnet.h [new file with mode: 0644]
drivers/net/wan/Kconfig
drivers/parport/Kconfig
drivers/parport/parport_pc.c
drivers/pci/pci-sysfs.c
drivers/pci/probe.c
drivers/pci/proc.c
drivers/pci/search.c
drivers/pnp/Kconfig
drivers/pnp/isapnp/Kconfig
drivers/pnp/isapnp/core.c
drivers/pnp/pnpbios/Kconfig
drivers/sbus/char/cpwatchdog.c
drivers/scsi/Kconfig
drivers/serial/68360serial.c
drivers/serial/8250.c
drivers/serial/8250_early.c
drivers/serial/Kconfig
drivers/serial/atmel_serial.c
drivers/serial/ip22zilog.c
drivers/serial/serial_core.c
drivers/serial/sh-sci.c
drivers/serial/sh-sci.h
drivers/serial/sn_console.c
drivers/serial/sunhv.c
drivers/serial/sunsab.c
drivers/serial/sunsu.c
drivers/serial/sunzilog.c
drivers/telephony/Kconfig
drivers/video/pvr2fb.c
drivers/w1/Kconfig
drivers/w1/masters/Kconfig
drivers/w1/slaves/Kconfig
fs/Kconfig
fs/afs/Makefile
fs/afs/afs.h
fs/afs/afs_fs.h
fs/afs/callback.c
fs/afs/dir.c
fs/afs/file.c
fs/afs/flock.c [new file with mode: 0644]
fs/afs/fsclient.c
fs/afs/internal.h
fs/afs/main.c
fs/afs/misc.c
fs/afs/proc.c
fs/afs/super.c
fs/afs/vnode.c
fs/anon_inodes.c
fs/binfmt_elf.c
fs/block_dev.c
fs/buffer.c
fs/compat_ioctl.c
fs/drop_caches.c
fs/ext2/file.c
fs/ext2/super.c
fs/ext3/inode.c
fs/ext3/namei.c
fs/ext3/super.c
fs/ext4/balloc.c
fs/ext4/namei.c
fs/ext4/super.c
fs/fat/dir.c
fs/fat/fatent.c
fs/fat/inode.c
fs/freevxfs/vxfs_dir.h
fs/gfs2/eaops.c
fs/hfsplus/btree.c
fs/hfsplus/dir.c
fs/hfsplus/hfsplus_fs.h
fs/hfsplus/inode.c
fs/hfsplus/super.c
fs/hfsplus/unicode.c
fs/hugetlbfs/inode.c
fs/ioctl.c
fs/isofs/dir.c
fs/isofs/inode.c
fs/isofs/joliet.c
fs/isofs/namei.c
fs/jbd/commit.c
fs/jbd/revoke.c
fs/jbd2/commit.c
fs/jbd2/revoke.c
fs/namespace.c
fs/ncpfs/file.c
fs/nfs/client.c
fs/nls/Makefile
fs/open.c
fs/partitions/acorn.c
fs/proc/array.c
fs/proc/base.c
fs/proc/generic.c
fs/proc/inode.c
fs/proc/proc_misc.c
fs/proc/proc_tty.c
fs/quota.c
fs/reiserfs/file.c
fs/seq_file.c
fs/super.c
fs/udf/crc.c
fs/udf/ialloc.c
fs/udf/inode.c
fs/ufs/super.c
include/asm-alpha/io.h
include/asm-alpha/pgtable.h
include/asm-arm/pgtable.h
include/asm-arm26/dma-mapping.h [deleted file]
include/asm-arm26/ioctls.h
include/asm-arm26/pgtable.h
include/asm-arm26/termbits.h
include/asm-arm26/termios.h
include/asm-avr32/pgtable.h
include/asm-cris/ioctls.h
include/asm-cris/pgtable.h
include/asm-cris/termbits.h
include/asm-cris/termios.h
include/asm-frv/pgtable.h
include/asm-frv/unistd.h
include/asm-generic/dma-mapping-broken.h
include/asm-generic/fcntl.h
include/asm-h8300/dma-mapping.h [deleted file]
include/asm-h8300/ioctls.h
include/asm-h8300/termbits.h
include/asm-h8300/termios.h
include/asm-h8300/thread_info.h
include/asm-i386/fixmap.h
include/asm-i386/ide.h
include/asm-i386/io.h
include/asm-i386/pgtable-2level.h
include/asm-i386/pgtable-3level.h
include/asm-i386/pgtable.h
include/asm-i386/processor.h
include/asm-i386/thread_info.h
include/asm-ia64/compat.h
include/asm-ia64/pgtable.h
include/asm-m32r/dma-mapping.h [deleted file]
include/asm-m32r/ioctls.h
include/asm-m32r/pgtable.h
include/asm-m32r/termbits.h
include/asm-m32r/termios.h
include/asm-m68k/motorola_pgtable.h
include/asm-m68k/sun3_pgtable.h
include/asm-mips/compat.h
include/asm-mips/pgtable.h
include/asm-parisc/compat.h
include/asm-parisc/fcntl.h
include/asm-parisc/pgtable.h
include/asm-powerpc/compat.h
include/asm-powerpc/pgtable-ppc32.h
include/asm-powerpc/pgtable-ppc64.h
include/asm-ppc/pgtable.h
include/asm-s390/compat.h
include/asm-s390/dma-mapping.h [deleted file]
include/asm-s390/pgtable.h
include/asm-sh/bugs.h
include/asm-sh/cache.h
include/asm-sh/cpu-sh2/cache.h
include/asm-sh/cpu-sh3/timer.h
include/asm-sh/cpu-sh4/freq.h
include/asm-sh/cpu-sh4/timer.h
include/asm-sh/futex-irq.h [new file with mode: 0644]
include/asm-sh/futex.h
include/asm-sh/hd64461.h
include/asm-sh/hw_irq.h
include/asm-sh/irq.h
include/asm-sh/machvec.h
include/asm-sh/machvec_init.h [deleted file]
include/asm-sh/mmzone.h [new file with mode: 0644]
include/asm-sh/page.h
include/asm-sh/parport.h [new file with mode: 0644]
include/asm-sh/pgtable.h
include/asm-sh/processor.h
include/asm-sh/rwsem.h
include/asm-sh/saturn/io.h [deleted file]
include/asm-sh/saturn/smpc.h [deleted file]
include/asm-sh/sections.h
include/asm-sh/setup.h
include/asm-sh/sh03/io.h
include/asm-sh/smp.h
include/asm-sh/snapgear.h
include/asm-sh/sparsemem.h [new file with mode: 0644]
include/asm-sh/system.h
include/asm-sh/topology.h
include/asm-sh/uaccess.h
include/asm-sh/ubc.h
include/asm-sh64/pgtable.h
include/asm-sparc/pgtable.h
include/asm-sparc64/bugs.h
include/asm-sparc64/compat.h
include/asm-sparc64/cpudata.h
include/asm-sparc64/delay.h
include/asm-sparc64/hvtramp.h [new file with mode: 0644]
include/asm-sparc64/hypervisor.h
include/asm-sparc64/irq.h
include/asm-sparc64/ldc.h [new file with mode: 0644]
include/asm-sparc64/mdesc.h
include/asm-sparc64/mmu_context.h
include/asm-sparc64/pgtable.h
include/asm-sparc64/power.h [new file with mode: 0644]
include/asm-sparc64/smp.h
include/asm-sparc64/vio.h [new file with mode: 0644]
include/asm-um/pgtable.h
include/asm-um/thread_info.h
include/asm-v850/ioctls.h
include/asm-v850/termbits.h
include/asm-v850/termios.h
include/asm-x86_64/compat.h
include/asm-x86_64/fixmap.h
include/asm-x86_64/io.h
include/asm-x86_64/pgtable.h
include/asm-xtensa/pgtable.h
include/linux/Kbuild
include/linux/attribute_container.h
include/linux/audit.h
include/linux/backing-dev.h
include/linux/bug.h
include/linux/capability.h
include/linux/cdrom.h
include/linux/cobalt-nvram.h [deleted file]
include/linux/console.h
include/linux/consolemap.h
include/linux/cpu.h
include/linux/dma-mapping.h
include/linux/ds17287rtc.h
include/linux/ext2_fs_sb.h
include/linux/ext3_fs_sb.h
include/linux/ext4_fs_sb.h
include/linux/file.h
include/linux/fs.h
include/linux/fuse.h
include/linux/hrtimer.h
include/linux/i2o.h
include/linux/idr.h
include/linux/init.h
include/linux/init_task.h
include/linux/io.h
include/linux/ipc.h
include/linux/irq.h
include/linux/leds.h
include/linux/lzo.h
include/linux/mm.h
include/linux/mmzone.h
include/linux/mnt_namespace.h
include/linux/module.h
include/linux/msdos_fs.h
include/linux/ncp_fs.h
include/linux/nsproxy.h
include/linux/pci.h
include/linux/percpu.h
include/linux/percpu_counter.h
include/linux/pid_namespace.h
include/linux/prctl.h
include/linux/prefetch.h
include/linux/proc_fs.h
include/linux/sched.h
include/linux/scx200_gpio.h
include/linux/seccomp.h
include/linux/serial.h
include/linux/serial_8250.h
include/linux/signal.h
include/linux/slab.h
include/linux/slab_def.h
include/linux/slob_def.h [new file with mode: 0644]
include/linux/slub_def.h
include/linux/smp_lock.h
include/linux/socket.h
include/linux/sonypi.h
include/linux/spinlock.h
include/linux/taskstats.h
include/linux/time.h
include/linux/timer.h
include/linux/tty.h
include/linux/uio.h
include/linux/user_namespace.h [new file with mode: 0644]
include/linux/utsname.h
include/linux/workqueue.h
init/Kconfig
init/do_mounts.c
init/main.c
ipc/msg.c
ipc/sem.c
ipc/shm.c
ipc/util.c
ipc/util.h
kernel/Makefile
kernel/audit.c
kernel/audit.h
kernel/auditsc.c
kernel/cpuset.c
kernel/exit.c
kernel/fork.c
kernel/futex.c
kernel/irq/spurious.c
kernel/kallsyms.c
kernel/kfifo.c
kernel/kthread.c
kernel/module.c
kernel/nsproxy.c
kernel/pid.c
kernel/printk.c
kernel/ptrace.c
kernel/rtmutex-debug.c
kernel/rtmutex.c
kernel/rtmutex_common.h
kernel/seccomp.c
kernel/signal.c
kernel/softirq.c
kernel/stop_machine.c
kernel/sys.c
kernel/sys_ni.c
kernel/sysctl.c
kernel/taskstats.c
kernel/time.c
kernel/time/clockevents.c
kernel/time/ntp.c
kernel/time/timekeeping.c
kernel/time/timer_stats.c
kernel/timer.c
kernel/user.c
kernel/user_namespace.c [new file with mode: 0644]
kernel/utsname.c
kernel/utsname_sysctl.c
kernel/workqueue.c
lib/Kconfig.debug
lib/Makefile
lib/bug.c
lib/check_signature.c [new file with mode: 0644]
lib/idr.c
lib/percpu_counter.c
lib/vsprintf.c
mm/Kconfig
mm/backing-dev.c
mm/filemap.c
mm/hugetlb.c
mm/madvise.c
mm/memory.c
mm/mempolicy.c
mm/mempool.c
mm/mlock.c
mm/mmap.c
mm/nommu.c
mm/page-writeback.c
mm/page_alloc.c
mm/slab.c
mm/slob.c
mm/slub.c
mm/swap_state.c
mm/swapfile.c
mm/truncate.c
net/compat.c
net/core/scm.c
net/netlabel/netlabel_user.c
net/socket.c
net/sunrpc/auth_gss/auth_gss.c
scripts/checkpatch.pl
scripts/decodecode [new file with mode: 0644]
security/selinux/nlmsgtab.c
sound/oss/Kconfig
sound/oss/Makefile
sound/oss/ac97.c [deleted file]
sound/oss/ac97.h [deleted file]
sound/oss/aci.c [deleted file]
sound/oss/aci.h [deleted file]
sound/oss/ad1816.c [deleted file]
sound/oss/ad1889.c [deleted file]
sound/oss/ad1889.h [deleted file]
sound/oss/adlib_card.c [deleted file]
sound/oss/cs461x.h [deleted file]
sound/oss/cs461x_image.h [deleted file]
sound/oss/cs46xx.c [deleted file]
sound/oss/cs46xx_wrapper-24.h [deleted file]
sound/oss/cs46xxpm.h [deleted file]
sound/oss/emu10k1/8010.h [deleted file]
sound/oss/emu10k1/Makefile [deleted file]
sound/oss/emu10k1/audio.c [deleted file]
sound/oss/emu10k1/audio.h [deleted file]
sound/oss/emu10k1/cardmi.c [deleted file]
sound/oss/emu10k1/cardmi.h [deleted file]
sound/oss/emu10k1/cardmo.c [deleted file]
sound/oss/emu10k1/cardmo.h [deleted file]
sound/oss/emu10k1/cardwi.c [deleted file]
sound/oss/emu10k1/cardwi.h [deleted file]
sound/oss/emu10k1/cardwo.c [deleted file]
sound/oss/emu10k1/cardwo.h [deleted file]
sound/oss/emu10k1/ecard.c [deleted file]
sound/oss/emu10k1/ecard.h [deleted file]
sound/oss/emu10k1/efxmgr.c [deleted file]
sound/oss/emu10k1/efxmgr.h [deleted file]
sound/oss/emu10k1/emuadxmg.c [deleted file]
sound/oss/emu10k1/hwaccess.c [deleted file]
sound/oss/emu10k1/hwaccess.h [deleted file]
sound/oss/emu10k1/icardmid.h [deleted file]
sound/oss/emu10k1/icardwav.h [deleted file]
sound/oss/emu10k1/irqmgr.c [deleted file]
sound/oss/emu10k1/irqmgr.h [deleted file]
sound/oss/emu10k1/main.c [deleted file]
sound/oss/emu10k1/midi.c [deleted file]
sound/oss/emu10k1/midi.h [deleted file]
sound/oss/emu10k1/mixer.c [deleted file]
sound/oss/emu10k1/passthrough.c [deleted file]
sound/oss/emu10k1/passthrough.h [deleted file]
sound/oss/emu10k1/recmgr.c [deleted file]
sound/oss/emu10k1/recmgr.h [deleted file]
sound/oss/emu10k1/timer.c [deleted file]
sound/oss/emu10k1/timer.h [deleted file]
sound/oss/emu10k1/voicemgr.c [deleted file]
sound/oss/emu10k1/voicemgr.h [deleted file]
sound/oss/mpu401.c
sound/oss/nm256.h [deleted file]
sound/oss/nm256_audio.c [deleted file]
sound/oss/nm256_coeff.h [deleted file]
sound/oss/opl3.c
sound/oss/opl3.h [deleted file]
sound/oss/opl3sa2.c [deleted file]
usr/.gitignore

index 060a71d41ad7ccc3214065a182e6f67568420071..8d15830b883d8f715b06aa5f028e5013d637acb3 100644 (file)
@@ -45,3 +45,6 @@ series
 
 # cscope files
 cscope.*
+
+*.orig
+*.rej
index f08ca953573392ec710a27db0f7f87f14ad54527..8b056363344299c3822cd38427429007bb1c44b7 100644 (file)
@@ -12,6 +12,8 @@ Following translations are available on the WWW:
 
 00-INDEX
        - this file.
+ABI/
+       - info on kernel <-> userspace ABI and relative interface stability.
 BUG-HUNTING
        - brute force method of doing binary search of patches to find bug.
 Changes
@@ -25,37 +27,57 @@ DMA-mapping.txt
 DocBook/
        - directory with DocBook templates etc. for kernel documentation.
 HOWTO
-       - The process and procedures of how to do Linux kernel development.
+       - the process and procedures of how to do Linux kernel development.
 IO-mapping.txt
        - how to access I/O mapped memory from within device drivers.
 IPMI.txt
        - info on Linux Intelligent Platform Management Interface (IPMI) Driver.
 IRQ-affinity.txt
        - how to select which CPU(s) handle which interrupt events on SMP.
+IRQ.txt
+       - description of what an IRQ is.
 ManagementStyle
        - how to (attempt to) manage kernel hackers.
 MSI-HOWTO.txt
        - the Message Signaled Interrupts (MSI) Driver Guide HOWTO and FAQ.
+PCIEBUS-HOWTO.txt
+       - a guide describing the PCI Express Port Bus driver.
 RCU/
        - directory with info on RCU (read-copy update).
 README.DAC960
        - info on Mylex DAC960/DAC1100 PCI RAID Controller Driver for Linux.
+README.cycladesZ
+       - info on Cyclades-Z firmware loading.
 SAK.txt
        - info on Secure Attention Keys.
+SecurityBugs
+       - procedure for reporting security bugs found in the kernel.
+SubmitChecklist
+       - Linux kernel patch submission checklist.
 SubmittingDrivers
        - procedure to get a new driver source included into the kernel tree.
 SubmittingPatches
        - procedure to get a source patch included into the kernel tree.
 VGA-softcursor.txt
        - how to change your VGA cursor from a blinking underscore.
+accounting/
+       - documentation on accounting and taskstats.
+aoe/
+       - description of AoE (ATA over Ethernet) along with config examples.
 applying-patches.txt
        - description of various trees and how to apply their patches.
 arm/
        - directory with info about Linux on the ARM architecture.
+atomic_ops.txt
+       - semantics and behavior of atomic and bitmask operations.
+auxdisplay/
+       - misc. LCD driver documentation (cfag12864b, ks0108).
 basic_profiling.txt
        - basic instructions for those who wants to profile Linux kernel.
 binfmt_misc.txt
        - info on the kernel support for extra binary formats.
+blackfin/
+       - directory with documentation for the Blackfin arch.
 block/
        - info on the Block I/O (BIO) layer.
 cachetlb.txt
@@ -68,16 +90,32 @@ cli-sti-removal.txt
        - cli()/sti() removal guide.
 computone.txt
        - info on Computone Intelliport II/Plus Multiport Serial Driver.
+connector/
+       - docs on the netlink based userspace<->kernel space communication mod.
+console/
+       - documentation on Linux console drivers.
 cpqarray.txt
        - info on using Compaq's SMART2 Intelligent Disk Array Controllers.
 cpu-freq/
        - info on CPU frequency and voltage scaling.
+cpu-hotplug.txt
+       - document describing CPU hotplug support in the Linux kernel.
+cpu-load.txt
+       - document describing how CPU load statistics are collected.
+cpusets.txt
+       - documents the cpusets feature; assign CPUs and Mem to a set of tasks.
+cputopology.txt
+       - documentation on how CPU topology info is exported via sysfs.
 cris/
        - directory with info about Linux on CRIS architecture.
 crypto/
        - directory with info on the Crypto API.
+dcdbas.txt
+       - information on the Dell Systems Management Base Driver.
 debugging-modules.txt
        - some notes on debugging modules after Linux 2.6.3.
+dell_rbu.txt
+       - document demonstrating the use of the Dell Remote BIOS Update driver.
 device-mapper/
        - directory with info on Device Mapper.
 devices.txt
@@ -86,32 +124,52 @@ digiepca.txt
        - info on Digi Intl. {PC,PCI,EISA}Xx and Xem series cards.
 dnotify.txt
        - info about directory notification in Linux.
+dontdiff
+       - file containing a list of files that should never be diff'ed.
 driver-model/
        - directory with info about Linux driver model.
+drivers/
+       - directory with driver documentation (currently only EDAC).
 dvb/
        - info on Linux Digital Video Broadcast (DVB) subsystem.
 early-userspace/
        - info about initramfs, klibc, and userspace early during boot.
+ecryptfs.txt
+       - docs on eCryptfs: stacked cryptographic filesystem for Linux.
 eisa.txt
        - info on EISA bus support.
 exception.txt
        - how Linux v2.2 handles exceptions without verify_area etc.
+fault-injection/
+       - dir with docs about the fault injection capabilities infrastructure.
 fb/
        - directory with info on the frame buffer graphics abstraction layer.
+feature-removal-schedule.txt
+       - list of files and features that are going to be removed.
 filesystems/
        - directory with info on the various filesystems that Linux supports.
 firmware_class/
        - request_firmware() hotplug interface info.
 floppy.txt
        - notes and driver options for the floppy disk driver.
+fujitsu/
+       - Fujitsu FR-V Linux documentation.
+gpio.txt
+       - overview of GPIO (General Purpose Input/Output) access conventions.
 hayes-esp.txt
        - info on using the Hayes ESP serial driver.
 highuid.txt
        - notes on the change from 16 bit to 32 bit user/group IDs.
 hpet.txt
        - High Precision Event Timer Driver for Linux.
+hrtimer/
+       - info on the timer_stats debugging facility for timer (ab)use.
+hrtimers/
+       - info on the hrtimers subsystem for high-resolution kernel timers.
 hw_random.txt
        - info on Linux support for random number generator in i8xx chipsets.
+hwmon/
+       - directory with docs on various hardware monitoring drivers.
 i2c/
        - directory with info about the I2C bus/protocol (2 wire, kHz speed).
 i2o/
@@ -122,16 +180,22 @@ ia64/
        - directory with info about Linux on Intel 64 bit architecture.
 ide.txt
        - important info for users of ATA devices (IDE/EIDE disks and CD-ROMS).
+infiniband/
+       - directory with documents concerning Linux InfiniBand support.
 initrd.txt
        - how to use the RAM disk as an initial/temporary root filesystem.
 input/
        - info on Linux input device support.
 io_ordering.txt
        - info on ordering I/O writes to memory-mapped addresses.
+ioctl/
+       - directory with documents describing various IOCTL calls.
 ioctl-number.txt
        - how to implement and register device/driver ioctl calls.
 iostats.txt
        - info on I/O statistics Linux kernel provides.
+irqflags-tracing.txt
+       - how to use the irq-flags tracing feature.
 isapnp.txt
        - info on Linux ISA Plug & Play support.
 isdn/
@@ -140,26 +204,40 @@ java.txt
        - info on the in-kernel binary support for Java(tm).
 kbuild/
        - directory with info about the kernel build process.
-kdumpt.txt
-       - mini HowTo on getting the crash dump code to work.
+kdump/
+       - directory with mini HowTo on getting the crash dump code to work.
 kernel-doc-nano-HOWTO.txt
        - mini HowTo on generation and location of kernel documentation files.
 kernel-docs.txt
        - listing of various WWW + books that document kernel internals.
 kernel-parameters.txt
        - summary listing of command line / boot prompt args for the kernel.
+keys-request-key.txt
+       - description of the kernel key request service.
+keys.txt
+       - description of the kernel key retention service.
 kobject.txt
        - info of the kobject infrastructure of the Linux kernel.
+kprobes.txt
+       - documents the kernel probes debugging feature.
+kref.txt
+       - docs on adding reference counters (krefs) to kernel objects.
 laptop-mode.txt
-       - How to conserve battery power using laptop-mode.
+       - how to conserve battery power using laptop-mode.
 ldm.txt
        - a brief description of LDM (Windows Dynamic Disks).
+leds-class.txt
+       - documents LED handling under Linux.
+local_ops.txt
+       - semantics and behavior of local atomic operations.
+lockdep-design.txt
+       - documentation on the runtime locking correctness validator.
 locks.txt
        - info on file locking implementations, flock() vs. fcntl(), etc.
 logo.gif
-       - Full colour GIF image of Linux logo (penguin).
+       - full colour GIF image of Linux logo (penguin - Tux).
 logo.txt
-       - Info on creator of above logo & site to get additional images from.
+       - info on creator of above logo & site to get additional images from.
 m68k/
        - directory with info about Linux on Motorola 68k architecture.
 magic-number.txt
@@ -170,6 +248,8 @@ mca.txt
        - info on supporting Micro Channel Architecture (e.g. PS/2) systems.
 md.txt
        - info on boot arguments for the multiple devices driver.
+memory-barriers.txt
+       - info on Linux kernel memory barriers.
 memory.txt
        - info on typical Linux memory problems.
 mips/
@@ -177,9 +257,11 @@ mips/
 mono.txt
        - how to execute Mono-based .NET binaries with the help of BINFMT_MISC.
 moxa-smartio
-       - info on installing/using Moxa multiport serial driver.
+       - file with info on installing/using Moxa multiport serial driver.
 mtrr.txt
        - how to use PPro Memory Type Range Registers to increase performance.
+mutex-design.txt
+       - info on the generic mutex subsystem.
 nbd.txt
        - info on a TCP implementation of a network block device.
 netlabel/
@@ -190,6 +272,8 @@ nfsroot.txt
        - short guide on setting up a diskless box with NFS root filesystem.
 nmi_watchdog.txt
        - info on NMI watchdog for SMP systems.
+nommu-mmap.txt
+       - documentation about no-mmu memory mapping support.
 numastat.txt
        - info on how to read Numa policy hit/miss statistics in sysfs.
 oops-tracing.txt
@@ -202,8 +286,16 @@ parport.txt
        - how to use the parallel-port driver.
 parport-lowlevel.txt
        - description and usage of the low level parallel port functions.
+pci-error-recovery.txt
+       - info on PCI error recovery.
 pci.txt
        - info on the PCI subsystem for device driver authors.
+pcieaer-howto.txt
+       - the PCI Express Advanced Error Reporting Driver Guide HOWTO.
+pcmcia/
+       - info on the Linux PCMCIA driver.
+pi-futex.txt
+       - documentation on lightweight PI-futexes.
 pm.txt
        - info on Linux power management support.
 pnp.txt
@@ -214,18 +306,32 @@ powerpc/
        - directory with info on using Linux with the PowerPC.
 preempt-locking.txt
        - info on locking under a preemptive kernel.
+prio_tree.txt
+       - info on radix-priority-search-tree use for indexing vmas.
 ramdisk.txt
        - short guide on how to set up and use the RAM disk.
+rbtree.txt
+       - info on what red-black trees are and what they are for.
 riscom8.txt
        - notes on using the RISCom/8 multi-port serial driver.
+robust-futex-ABI.txt
+       - documentation of the robust futex ABI.
+robust-futexes.txt
+       - a description of what robust futexes are.
 rocket.txt
        - info on the Comtrol RocketPort multiport serial driver.
 rpc-cache.txt
        - introduction to the caching mechanisms in the sunrpc layer.
+rt-mutex-design.txt
+       - description of the RealTime mutex implementation design.
+rt-mutex.txt
+       - desc. of RT-mutex subsystem with PI (Priority Inheritance) support.
 rtc.txt
        - notes on how to use the Real Time Clock (aka CMOS clock) driver.
 s390/
        - directory with info on using Linux on the IBM S390.
+sched-arch.txt
+       - CPU Scheduler implementation hints for architecture specific code.
 sched-coding.txt
        - reference for various scheduler-related methods in the O(1) scheduler.
 sched-design.txt
@@ -240,22 +346,32 @@ serial/
        - directory with info on the low level serial API.
 serial-console.txt
        - how to set up Linux with a serial line console as the default.
+sgi-ioc4.txt
+       - description of the SGI IOC4 PCI (multi function) device.
 sgi-visws.txt
        - short blurb on the SGI Visual Workstations.
 sh/
        - directory with info on porting Linux to a new architecture.
+sharedsubtree.txt
+       - a description of shared subtrees for namespaces.
 smart-config.txt
        - description of the Smart Config makefile feature.
 smp.txt
        - a few notes on symmetric multi-processing.
+sony-laptop.txt
+       - Sony Notebook Control Driver (SNC) Readme.
 sonypi.txt
        - info on Linux Sony Programmable I/O Device support.
 sound/
        - directory with info on sound card support.
 sparc/
        - directory with info on using Linux on Sparc architecture.
+sparse.txt
+       - info on how to obtain and use the sparse tool for typechecking.
 specialix.txt
        - info on hardware/driver for specialix IO8+ multiport serial card.
+spi/
+       - overview of Linux kernel Serial Peripheral Interface (SPI) support.
 spinlocks.txt
        - info on using spinlocks to provide exclusive access in kernel.
 stable_api_nonsense.txt
@@ -274,24 +390,32 @@ sysrq.txt
        - info on the magic SysRq key.
 telephony/
        - directory with info on telephony (e.g. voice over IP) support.
+thinkpad-acpi.txt
+       - information on the (IBM and Lenovo) ThinkPad ACPI Extras driver.
 time_interpolators.txt
        - info on time interpolators.
 tipar.txt
        - information about Parallel link cable for Texas Instruments handhelds.
 tty.txt
        - guide to the locking policies of the tty layer.
-unicode.txt
-       - info on the Unicode character/font mapping used in Linux.
 uml/
        - directory with information about User Mode Linux.
+unicode.txt
+       - info on the Unicode character/font mapping used in Linux.
+unshare.txt
+       - description of the Linux unshare system call.
 usb/
        - directory with info regarding the Universal Serial Bus.
+video-output.txt
+       - sysfs class driver interface to enable/disable a video output device.
 video4linux/
        - directory with info regarding video/TV/radio cards and linux.
 vm/
        - directory with info on the Linux vm code.
 voyager.txt
        - guide to running Linux on the Voyager architecture.
+w1/
+       - directory with documents regarding the 1-wire (w1) subsystem.
 watchdog/
        - how to auto-reboot Linux if it has "fallen and can't get up". ;-)
 x86_64/
index b49b92edb396835632781470f18bb31ab0055387..a667eb1fc26e2dfca7ac7b46b8a93f1eb22867e8 100644 (file)
@@ -218,6 +218,18 @@ no space after the prefix increment & decrement unary operators:
 
 and no space around the '.' and "->" structure member operators.
 
+Do not leave trailing whitespace at the ends of lines.  Some editors with
+"smart" indentation will insert whitespace at the beginning of new lines as
+appropriate, so you can start typing the next line of code right away.
+However, some such editors do not remove the whitespace if you end up not
+putting a line of code there, such as if you leave a blank line.  As a result,
+you end up with lines containing trailing whitespace.
+
+Git will warn you about patches that introduce trailing whitespace, and can
+optionally strip the trailing whitespace for you; however, if applying a series
+of patches, this may make later patches in the series fail by changing their
+context lines.
+
 
                Chapter 4: Naming
 
@@ -726,6 +738,33 @@ need them.  Feel free to peruse that header file to see what else is already
 defined that you shouldn't reproduce in your code.
 
 
+               Chapter 18:  Editor modelines and other cruft
+
+Some editors can interpret configuration information embedded in source files,
+indicated with special markers.  For example, emacs interprets lines marked
+like this:
+
+-*- mode: c -*-
+
+Or like this:
+
+/*
+Local Variables:
+compile-command: "gcc -DMAGIC_DEBUG_FLAG foo.c"
+End:
+*/
+
+Vim interprets markers that look like this:
+
+/* vim:set sw=8 noet */
+
+Do not include any of these in source files.  People have their own personal
+editor configurations, and your source files should not override them.  This
+includes markers for indentation and mode configuration.  People may use their
+own custom mode, or may have some other magic method for making indentation
+work correctly.
+
+
 
                Appendix I: References
 
index 45cad23efefa9f85c6a973d6612ff60d496c1fd6..2de84dc195a8b46e52735a60bb9ce4097d4f7d67 100644 (file)
@@ -352,49 +352,93 @@ entry->write_proc = write_proc_foo;
       <funcsynopsis>
        <funcprototype>
          <funcdef>int <function>read_func</function></funcdef>
-         <paramdef>char* <parameter>page</parameter></paramdef>
+         <paramdef>char* <parameter>buffer</parameter></paramdef>
          <paramdef>char** <parameter>start</parameter></paramdef>
          <paramdef>off_t <parameter>off</parameter></paramdef>
          <paramdef>int <parameter>count</parameter></paramdef>
-         <paramdef>int* <parameter>eof</parameter></paramdef>
+         <paramdef>int* <parameter>peof</parameter></paramdef>
          <paramdef>void* <parameter>data</parameter></paramdef>
        </funcprototype>
       </funcsynopsis>
 
       <para>
         The read function should write its information into the
-        <parameter>page</parameter>. For proper use, the function
-        should start writing at an offset of
-        <parameter>off</parameter> in <parameter>page</parameter> and
-        write at most <parameter>count</parameter> bytes, but because
-        most read functions are quite simple and only return a small
-        amount of information, these two parameters are usually
-        ignored (it breaks pagers like <literal>more</literal> and
-        <literal>less</literal>, but <literal>cat</literal> still
-        works).
+        <parameter>buffer</parameter>, which will be exactly
+        <literal>PAGE_SIZE</literal> bytes long.
       </para>
 
       <para>
-        If the <parameter>off</parameter> and
-        <parameter>count</parameter> parameters are properly used,
-        <parameter>eof</parameter> should be used to signal that the
+        The parameter
+        <parameter>peof</parameter> should be used to signal that the
         end of the file has been reached by writing
         <literal>1</literal> to the memory location
-        <parameter>eof</parameter> points to.
+        <parameter>peof</parameter> points to.
       </para>
 
       <para>
-        The parameter <parameter>start</parameter> doesn't seem to be
-        used anywhere in the kernel. The <parameter>data</parameter>
+        The <parameter>data</parameter>
         parameter can be used to create a single call back function for
         several files, see <xref linkend="usingdata"/>.
       </para>
 
       <para>
-        The <function>read_func</function> function must return the
-        number of bytes written into the <parameter>page</parameter>.
+        The rest of the parameters and the return value are described
+       by a comment in <filename>fs/proc/generic.c</filename> as follows:
       </para>
 
+      <blockquote>
+        <para>
+       You have three ways to return data:
+               </para>
+        <orderedlist>
+          <listitem>
+            <para>
+             Leave <literal>*start = NULL</literal>.  (This is the default.)
+             Put the data of the requested offset at that
+             offset within the buffer.  Return the number (<literal>n</literal>)
+             of bytes there are from the beginning of the
+             buffer up to the last byte of data.  If the
+             number of supplied bytes (<literal>= n - offset</literal>) is
+             greater than zero and you didn't signal eof
+             and the reader is prepared to take more data
+             you will be called again with the requested
+             offset advanced by the number of bytes
+             absorbed.  This interface is useful for files
+             no larger than the buffer.
+           </para>
+         </listitem>
+         <listitem>
+            <para>
+             Set <literal>*start</literal> to an unsigned long value less than
+             the buffer address but greater than zero.
+             Put the data of the requested offset at the
+             beginning of the buffer.  Return the number of
+             bytes of data placed there.  If this number is
+             greater than zero and you didn't signal eof
+             and the reader is prepared to take more data
+             you will be called again with the requested
+             offset advanced by <literal>*start</literal>.  This interface is
+             useful when you have a large file consisting
+             of a series of blocks which you want to count
+             and return as wholes.
+             (Hack by Paul.Russell@rustcorp.com.au)
+           </para>
+         </listitem>
+         <listitem>
+            <para>
+             Set <literal>*start</literal> to an address within the buffer.
+             Put the data of the requested offset at <literal>*start</literal>.
+             Return the number of bytes of data placed there.
+             If this number is greater than zero and you
+             didn't signal eof and the reader is prepared to
+             take more data you will be called again with the
+             requested offset advanced by the number of bytes
+             absorbed.
+           </para>
+         </listitem>
+       </orderedlist>
+      </blockquote>
+
       <para>
         <xref linkend="example"/> shows how to use a read call back
         function.
index f4dffadbcb00af44b40b99dd55649731b57cb21d..42b01bc2e1b4f01f414b340a6204fb3ea1087953 100644 (file)
@@ -222,7 +222,15 @@ over a rather long period of time, but improvements are always welcome!
        deadlock as soon as the RCU callback happens to interrupt that
        acquisition's critical section.
 
-13.    SRCU (srcu_read_lock(), srcu_read_unlock(), and synchronize_srcu())
+13.    RCU callbacks can be and are executed in parallel.  In many cases,
+       the callback code simply wrappers around kfree(), so that this
+       is not an issue (or, more accurately, to the extent that it is
+       an issue, the memory-allocator locking handles it).  However,
+       if the callbacks do manipulate a shared data structure, they
+       must use whatever locking or other synchronization is required
+       to safely access and/or modify that data structure.
+
+14.    SRCU (srcu_read_lock(), srcu_read_unlock(), and synchronize_srcu())
        may only be invoked from process context.  Unlike other forms of
        RCU, it -is- permissible to block in an SRCU read-side critical
        section (demarked by srcu_read_lock() and srcu_read_unlock()),
index 6ebffb57e3dbf326c6db594da4206c2f30bf1050..19e7f65c269f21616347effd9035caeee4d2cb60 100644 (file)
@@ -1,4 +1,4 @@
-Linux Kernel patch sumbittal checklist
+Linux Kernel patch submission checklist
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Here are some basic things that developers should do if they want to see their
@@ -9,7 +9,6 @@ Documentation/SubmittingPatches and elsewhere regarding submitting Linux
 kernel patches.
 
 
-
 1: Builds cleanly with applicable or modified CONFIG options =y, =m, and
    =n.  No gcc warnings/errors, no linker warnings/errors.
 
index 0958e97d4bf4326ad0f6bc6418263f403d168eda..3f9a7912e69bcbe46f551e614d3f0b90af138999 100644 (file)
@@ -464,9 +464,25 @@ section Linus Computer Science 101.
 Nuff said.  If your code deviates too much from this, it is likely
 to be rejected without further review, and without comment.
 
+Once significant exception is when moving code from one file to
+another in this case you should not modify the moved code at all in
+the same patch which moves it.  This clearly delineates the act of
+moving the code and your changes.  This greatly aids review of the
+actual differences and allows tools to better track the history of
+the code itself.
+
 Check your patches with the patch style checker prior to submission
-(scripts/checkpatch.pl).  You should be able to justify all
-violations that remain in your patch.
+(scripts/checkpatch.pl).  The style checker should be viewed as
+a guide not as the final word.  If your code looks better with
+a violation then its probably best left alone.
+
+The checker reports at three levels:
+ - ERROR: things that are very likely to be wrong
+ - WARNING: things requiring careful review
+ - CHECK: things requiring thought
+
+You should be able to justify all violations that remain in your
+patch.
 
 
 
index 71acc28ed0d1b8b6b3692362bcf9d6ef4d7fcd02..24c5aade89987998260f956bfc16dacfe3d48841 100644 (file)
@@ -49,6 +49,7 @@ char name[100];
 int dbg;
 int print_delays;
 int print_io_accounting;
+int print_task_context_switch_counts;
 __u64 stime, utime;
 
 #define PRINTF(fmt, arg...) {                  \
@@ -195,7 +196,7 @@ void print_delayacct(struct taskstats *t)
               "IO    %15s%15s\n"
               "      %15llu%15llu\n"
               "MEM   %15s%15s\n"
-              "      %15llu%15llu\n\n",
+              "      %15llu%15llu\n"
               "count", "real total", "virtual total", "delay total",
               t->cpu_count, t->cpu_run_real_total, t->cpu_run_virtual_total,
               t->cpu_delay_total,
@@ -204,6 +205,14 @@ void print_delayacct(struct taskstats *t)
               "count", "delay total", t->swapin_count, t->swapin_delay_total);
 }
 
+void task_context_switch_counts(struct taskstats *t)
+{
+       printf("\n\nTask   %15s%15s\n"
+              "       %15lu%15lu\n",
+              "voluntary", "nonvoluntary",
+              t->nvcsw, t->nivcsw);
+}
+
 void print_ioacct(struct taskstats *t)
 {
        printf("%s: read=%llu, write=%llu, cancelled_write=%llu\n",
@@ -235,7 +244,7 @@ int main(int argc, char *argv[])
        struct msgtemplate msg;
 
        while (1) {
-               c = getopt(argc, argv, "diw:r:m:t:p:vl");
+               c = getopt(argc, argv, "qdiw:r:m:t:p:vl");
                if (c < 0)
                        break;
 
@@ -248,6 +257,10 @@ int main(int argc, char *argv[])
                        printf("printing IO accounting\n");
                        print_io_accounting = 1;
                        break;
+               case 'q':
+                       printf("printing task/process context switch rates\n");
+                       print_task_context_switch_counts = 1;
+                       break;
                case 'w':
                        logfile = strdup(optarg);
                        printf("write to file %s\n", logfile);
@@ -389,6 +402,8 @@ int main(int argc, char *argv[])
                                                        print_delayacct((struct taskstats *) NLA_DATA(na));
                                                if (print_io_accounting)
                                                        print_ioacct((struct taskstats *) NLA_DATA(na));
+                                               if (print_task_context_switch_counts)
+                                                       task_context_switch_counts((struct taskstats *) NLA_DATA(na));
                                                if (fd) {
                                                        if (write(fd, NLA_DATA(na), na->nla_len) < 0) {
                                                                err(1,"write error\n");
index 661c797eaf79dc791997fa31a4b3823132735244..8aa7529f8258a12725f6d34b5a7b349aa104a48a 100644 (file)
@@ -22,6 +22,8 @@ There are three different groups of fields in the struct taskstats:
     /* Extended accounting fields end */
     Their values are collected if CONFIG_TASK_XACCT is set.
 
+4) Per-task and per-thread context switch count statistics
+
 Future extension should add fields to the end of the taskstats struct, and
 should not change the relative position of each field within the struct.
 
@@ -158,4 +160,8 @@ struct taskstats {
 
        /* Extended accounting fields end */
 
+4) Per-task and per-thread statistics
+       __u64   nvcsw;                  /* Context voluntary switch counter */
+       __u64   nivcsw;                 /* Context involuntary switch counter */
+
 }
diff --git a/Documentation/fault-injection/failcmd.sh b/Documentation/fault-injection/failcmd.sh
deleted file mode 100644 (file)
index 63177ab..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-
-echo 1 > /proc/self/make-it-fail
-exec $*
diff --git a/Documentation/fault-injection/failmodule.sh b/Documentation/fault-injection/failmodule.sh
deleted file mode 100644 (file)
index 474a8b9..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/bash
-#
-# Usage: failmodule <failname> <modulename> [stacktrace-depth]
-#
-#      <failname>: "failslab", "fail_alloc_page", or "fail_make_request"
-#
-#      <modulename>: module name that you want to inject faults.
-#
-#      [stacktrace-depth]: the maximum number of stacktrace walking allowed
-#
-
-STACKTRACE_DEPTH=5
-if [ $# -gt 2 ]; then
-       STACKTRACE_DEPTH=$3
-fi
-
-if [ ! -d /debug/$1 ]; then
-       echo "Fault-injection $1 does not exist" >&2
-       exit 1
-fi
-if [ ! -d /sys/module/$2 ]; then
-       echo "Module $2 does not exist" >&2
-       exit 1
-fi
-
-# Disable any fault injection
-echo 0 > /debug/$1/stacktrace-depth
-
-echo `cat /sys/module/$2/sections/.text` > /debug/$1/require-start
-echo `cat /sys/module/$2/sections/.exit.text` > /debug/$1/require-end
-echo $STACKTRACE_DEPTH > /debug/$1/stacktrace-depth
index b7ca560b93407ca94848ced9304a52b2365c9559..4bc374a14345da10f666d67745aa151231c10c92 100644 (file)
@@ -103,6 +103,11 @@ configuration of fault-injection capabilities.
        default is 'N', setting it to 'Y' will inject failures
        only into non-sleep allocations (GFP_ATOMIC allocations).
 
+- /debug/fail_page_alloc/min-order:
+
+       specifies the minimum page allocation order to be injected
+       failures.
+
 o Boot option
 
 In order to inject faults while debugfs is not available (early boot time),
@@ -156,70 +161,77 @@ o add a hook to insert failures
 Application Examples
 --------------------
 
-o inject slab allocation failures into module init/cleanup code
+o Inject slab allocation failures into module init/exit code
 
-------------------------------------------------------------------------------
 #!/bin/bash
 
-FAILCMD=Documentation/fault-injection/failcmd.sh
-BLACKLIST="root_plug evbug"
-
-FAILNAME=failslab
-echo Y > /debug/$FAILNAME/task-filter
-echo 10 > /debug/$FAILNAME/probability
-echo 100 > /debug/$FAILNAME/interval
-echo -1 > /debug/$FAILNAME/times
-echo 2 > /debug/$FAILNAME/verbose
-echo 1 > /debug/$FAILNAME/ignore-gfp-wait
+FAILTYPE=failslab
+echo Y > /debug/$FAILTYPE/task-filter
+echo 10 > /debug/$FAILTYPE/probability
+echo 100 > /debug/$FAILTYPE/interval
+echo -1 > /debug/$FAILTYPE/times
+echo 0 > /debug/$FAILTYPE/space
+echo 2 > /debug/$FAILTYPE/verbose
+echo 1 > /debug/$FAILTYPE/ignore-gfp-wait
 
-blacklist()
+faulty_system()
 {
-       echo $BLACKLIST | grep $1 > /dev/null 2>&1
+       bash -c "echo 1 > /proc/self/make-it-fail && exec $*"
 }
 
-oops()
-{
-       dmesg | grep BUG > /dev/null 2>&1
-}
+if [ $# -eq 0 ]
+then
+       echo "Usage: $0 modulename [ modulename ... ]"
+       exit 1
+fi
+
+for m in $*
+do
+       echo inserting $m...
+       faulty_system modprobe $m
 
-find /lib/modules/`uname -r` -name '*.ko' -exec basename {} .ko \; |
-       while read i
-       do
-               oops && exit 1
-
-               if ! blacklist $i
-               then
-                       echo inserting $i...
-                       bash $FAILCMD modprobe $i
-               fi
-       done
-
-lsmod | awk '{ if ($3 == 0) { print $1 } }' |
-       while read i
-       do
-               oops && exit 1
-
-               if ! blacklist $i
-               then
-                       echo removing $i...
-                       bash $FAILCMD modprobe -r $i
-               fi
-       done
+       echo removing $m...
+       faulty_system modprobe -r $m
+done
 
 ------------------------------------------------------------------------------
 
-o inject slab allocation failures only for a specific module
+o Inject page allocation failures only for a specific module
 
-------------------------------------------------------------------------------
 #!/bin/bash
 
-FAILMOD=Documentation/fault-injection/failmodule.sh
+FAILTYPE=fail_page_alloc
+module=$1
 
-echo injecting errors into the module $1...
+if [ -z $module ]
+then
+       echo "Usage: $0 <modulename>"
+       exit 1
+fi
 
-modprobe $1
-bash $FAILMOD failslab $1 10
-echo 25 > /debug/failslab/probability
+modprobe $module
 
-------------------------------------------------------------------------------
+if [ ! -d /sys/module/$module/sections ]
+then
+       echo Module $module is not loaded
+       exit 1
+fi
+
+cat /sys/module/$module/sections/.text > /debug/$FAILTYPE/require-start
+cat /sys/module/$module/sections/.data > /debug/$FAILTYPE/require-end
+
+echo N > /debug/$FAILTYPE/task-filter
+echo 10 > /debug/$FAILTYPE/probability
+echo 100 > /debug/$FAILTYPE/interval
+echo -1 > /debug/$FAILTYPE/times
+echo 0 > /debug/$FAILTYPE/space
+echo 2 > /debug/$FAILTYPE/verbose
+echo 1 > /debug/$FAILTYPE/ignore-gfp-wait
+echo 1 > /debug/$FAILTYPE/ignore-gfp-highmem
+echo 10 > /debug/$FAILTYPE/stacktrace-depth
+
+trap "echo 0 > /debug/$FAILTYPE/probability" SIGINT SIGTERM EXIT
+
+echo "Injecting errors into the module $module... (interrupt to stop)"
+sleep 1000000
 
index 092c65dd35c2e9dd4fdf4f24cd6a6b1f8e64bc84..18bd2ddccb156aef5175533e084625a50e8827eb 100644 (file)
@@ -41,14 +41,6 @@ Who: Pavel Machek <pavel@suse.cz>
 
 ---------------------------
 
-What:  RAW driver (CONFIG_RAW_DRIVER)
-When:  December 2005
-Why:   declared obsolete since kernel 2.6.3
-       O_DIRECT can be used instead
-Who:   Adrian Bunk <bunk@stusta.de>
-
----------------------------
-
 What:  old NCR53C9x driver
 When:  October 2007
 Why:   Replaced by the much better esp_scsi driver.  Actual low-level
@@ -119,13 +111,6 @@ Who:    Adrian Bunk <bunk@stusta.de>
 
 ---------------------------
 
-What:  drivers depending on OSS_OBSOLETE_DRIVER
-When:  options in 2.6.20, code in 2.6.22
-Why:   OSS drivers with ALSA replacements
-Who:   Adrian Bunk <bunk@stusta.de>
-
----------------------------
-
 What:  Unused EXPORT_SYMBOL/EXPORT_SYMBOL_GPL exports
        (temporary transition config option provided until then)
        The transition config option will also be removed at the same time.
@@ -264,6 +249,14 @@ Who:       Jean Delvare <khali@linux-fr.org>
 
 ---------------------------
 
+What:  'time' kernel boot parameter
+When:  January 2008
+Why:   replaced by 'printk.time=<value>' so that printk timestamps can be
+       enabled or disabled as needed
+Who:   Randy Dunlap <randy.dunlap@oracle.com>
+
+---------------------------
+
 What:  drivers depending on OSS_OBSOLETE
 When:  options in 2.6.23, code in 2.6.25
 Why:   obsolete OSS drivers
index 8756a07f4dc34abf3368935f5abb7a1adee228ef..460b892d089e526945275cf283c7b56950bfbe3b 100644 (file)
@@ -171,7 +171,9 @@ read the file /proc/PID/status:
 This shows you nearly the same information you would get if you viewed it with
 the ps  command.  In  fact,  ps  uses  the  proc  file  system  to  obtain its
 information. The  statm  file  contains  more  detailed  information about the
-process memory usage. Its seven fields are explained in Table 1-2.
+process memory usage. Its seven fields are explained in Table 1-2.  The stat
+file contains details information about the process itself.  Its fields are
+explained in Table 1-3.
 
 
 Table 1-2: Contents of the statm files (as of 2.6.8-rc3)
@@ -188,16 +190,65 @@ Table 1-2: Contents of the statm files (as of 2.6.8-rc3)
  dt       number of dirty pages                        (always 0 on 2.6)
 ..............................................................................
 
+
+Table 1-3: Contents of the stat files (as of 2.6.22-rc3)
+..............................................................................
+ Field          Content
+  pid           process id
+  tcomm         filename of the executable
+  state         state (R is running, S is sleeping, D is sleeping in an
+                uninterruptible wait, Z is zombie, T is traced or stopped)
+  ppid          process id of the parent process
+  pgrp          pgrp of the process
+  sid           session id
+  tty_nr        tty the process uses
+  tty_pgrp      pgrp of the tty
+  flags         task flags
+  min_flt       number of minor faults
+  cmin_flt      number of minor faults with child's
+  maj_flt       number of major faults
+  cmaj_flt      number of major faults with child's
+  utime         user mode jiffies
+  stime         kernel mode jiffies
+  cutime        user mode jiffies with child's
+  cstime        kernel mode jiffies with child's
+  priority      priority level
+  nice          nice level
+  num_threads   number of threads
+  start_time    time the process started after system boot
+  vsize         virtual memory size
+  rss           resident set memory size
+  rsslim        current limit in bytes on the rss
+  start_code    address above which program text can run
+  end_code      address below which program text can run
+  start_stack   address of the start of the stack
+  esp           current value of ESP
+  eip           current value of EIP
+  pending       bitmap of pending signals (obsolete)
+  blocked       bitmap of blocked signals (obsolete)
+  sigign        bitmap of ignored signals (obsolete)
+  sigcatch      bitmap of catched signals (obsolete)
+  wchan         address where process went to sleep
+  0             (place holder)
+  0             (place holder)
+  exit_signal   signal to send to parent thread on exit
+  task_cpu      which CPU the task is scheduled on
+  rt_priority   realtime priority
+  policy        scheduling policy (man sched_setscheduler)
+  blkio_ticks   time spent waiting for block IO
+..............................................................................
+
+
 1.2 Kernel data
 ---------------
 
 Similar to  the  process entries, the kernel data files give information about
 the running kernel. The files used to obtain this information are contained in
-/proc and  are  listed  in Table 1-3. Not all of these will be present in your
+/proc and  are  listed  in Table 1-4. Not all of these will be present in your
 system. It  depends  on the kernel configuration and the loaded modules, which
 files are there, and which are missing.
 
-Table 1-3: Kernel info in /proc 
+Table 1-4: Kernel info in /proc
 ..............................................................................
  File        Content                                           
  apm         Advanced power management info                    
@@ -473,10 +524,10 @@ IDE devices:
 
 More detailed  information  can  be  found  in  the  controller  specific
 subdirectories. These  are  named  ide0,  ide1  and  so  on.  Each  of  these
-directories contains the files shown in table 1-4.
+directories contains the files shown in table 1-5.
 
 
-Table 1-4: IDE controller info in  /proc/ide/ide? 
+Table 1-5: IDE controller info in  /proc/ide/ide?
 ..............................................................................
  File    Content                                 
  channel IDE channel (0 or 1)                    
@@ -486,11 +537,11 @@ Table 1-4: IDE controller info in  /proc/ide/ide?
 ..............................................................................
 
 Each device  connected  to  a  controller  has  a separate subdirectory in the
-controllers directory.  The  files  listed in table 1-5 are contained in these
+controllers directory.  The  files  listed in table 1-6 are contained in these
 directories.
 
 
-Table 1-5: IDE device information 
+Table 1-6: IDE device information
 ..............................................................................
  File             Content                                    
  cache            The cache                                  
index a47cc819f37bb7f5535afbf2bf720766ae51dfdd..045f3e055a28932c76864a19696732311a4f9838 100644 (file)
@@ -3,7 +3,7 @@
 
        Original author: Richard Gooch <rgooch@atnf.csiro.au>
 
-                 Last updated on October 28, 2005
+                 Last updated on June 24, 2007.
 
   Copyright (C) 1999 Richard Gooch
   Copyright (C) 2005 Pekka Enberg
@@ -107,7 +107,7 @@ file /proc/filesystems.
 struct file_system_type
 -----------------------
 
-This describes the filesystem. As of kernel 2.6.13, the following
+This describes the filesystem. As of kernel 2.6.22, the following
 members are defined:
 
 struct file_system_type {
@@ -119,6 +119,8 @@ struct file_system_type {
         struct module *owner;
         struct file_system_type * next;
         struct list_head fs_supers;
+       struct lock_class_key s_lock_key;
+       struct lock_class_key s_umount_key;
 };
 
   name: the name of the filesystem type, such as "ext2", "iso9660",
@@ -137,11 +139,12 @@ struct file_system_type {
 
   next: for internal VFS use: you should initialize this to NULL
 
+  s_lock_key, s_umount_key: lockdep-specific
+
 The get_sb() method has the following arguments:
 
-  struct super_block *sb: the superblock structure. This is partially
-       initialized by the VFS and the rest must be initialized by the
-       get_sb() method
+  struct file_system_type *fs_type: decribes the filesystem, partly initialized
+       by the specific filesystem code
 
   int flags: mount flags
 
@@ -150,12 +153,13 @@ The get_sb() method has the following arguments:
   void *data: arbitrary mount options, usually comes as an ASCII
        string
 
-  int silent: whether or not to be silent on error
+  struct vfsmount *mnt: a vfs-internal representation of a mount point
 
 The get_sb() method must determine if the block device specified
-in the superblock contains a filesystem of the type the method
-supports. On success the method returns the superblock pointer, on
-failure it returns NULL.
+in the dev_name and fs_type contains a filesystem of the type the method
+supports. If it succeeds in opening the named block device, it initializes a
+struct super_block descriptor for the filesystem contained by the block device.
+On failure it returns an error.
 
 The most interesting member of the superblock structure that the
 get_sb() method fills in is the "s_op" field. This is a pointer to
@@ -193,7 +197,7 @@ struct super_operations
 -----------------------
 
 This describes how the VFS can manipulate the superblock of your
-filesystem. As of kernel 2.6.13, the following members are defined:
+filesystem. As of kernel 2.6.22, the following members are defined:
 
 struct super_operations {
         struct inode *(*alloc_inode)(struct super_block *sb);
@@ -216,8 +220,6 @@ struct super_operations {
         void (*clear_inode) (struct inode *);
         void (*umount_begin) (struct super_block *);
 
-        void (*sync_inodes) (struct super_block *sb,
-                                struct writeback_control *wbc);
         int (*show_options)(struct seq_file *, struct vfsmount *);
 
         ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t);
@@ -300,9 +302,6 @@ or bottom half).
 
   umount_begin: called when the VFS is unmounting a filesystem.
 
-  sync_inodes: called when the VFS is writing out dirty data associated with
-       a superblock.
-
   show_options: called by the VFS to show mount options for /proc/<pid>/mounts.
 
   quota_read: called by the VFS to read from filesystem quota file.
@@ -324,7 +323,7 @@ struct inode_operations
 -----------------------
 
 This describes how the VFS can manipulate an inode in your
-filesystem. As of kernel 2.6.13, the following members are defined:
+filesystem. As of kernel 2.6.22, the following members are defined:
 
 struct inode_operations {
        int (*create) (struct inode *,struct dentry *,int, struct nameidata *);
@@ -348,6 +347,7 @@ struct inode_operations {
        ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
        ssize_t (*listxattr) (struct dentry *, char *, size_t);
        int (*removexattr) (struct dentry *, const char *);
+       void (*truncate_range)(struct inode *, loff_t, loff_t);
 };
 
 Again, all methods are called without any locks being held, unless
@@ -444,6 +444,9 @@ otherwise noted.
   removexattr: called by the VFS to remove an extended attribute from
        a file. This method is called by removexattr(2) system call.
 
+  truncate_range: a method provided by the underlying filesystem to truncate a
+       range of blocks , i.e. punch a hole somewhere in a file.
+
 
 The Address Space Object
 ========================
@@ -522,7 +525,7 @@ struct address_space_operations
 -------------------------------
 
 This describes how the VFS can manipulate mapping of a file to page cache in
-your filesystem. As of kernel 2.6.16, the following members are defined:
+your filesystem. As of kernel 2.6.22, the following members are defined:
 
 struct address_space_operations {
        int (*writepage)(struct page *page, struct writeback_control *wbc);
@@ -543,6 +546,7 @@ struct address_space_operations {
                        int);
        /* migrate the contents of a page to the specified target */
        int (*migratepage) (struct page *, struct page *);
+       int (*launder_page) (struct page *);
 };
 
   writepage: called by the VM to write a dirty page to backing store.
@@ -689,6 +693,10 @@ struct address_space_operations {
        transfer any private data across and update any references
         that it has to the page.
 
+  launder_page: Called before freeing a page - it writes back the dirty page. To
+       prevent redirtying the page, it is kept locked during the whole
+       operation.
+
 The File Object
 ===============
 
@@ -699,9 +707,10 @@ struct file_operations
 ----------------------
 
 This describes how the VFS can manipulate an open file. As of kernel
-2.6.17, the following members are defined:
+2.6.22, the following members are defined:
 
 struct file_operations {
+       struct module *owner;
        loff_t (*llseek) (struct file *, loff_t, int);
        ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
        ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
@@ -728,10 +737,8 @@ struct file_operations {
        int (*check_flags)(int);
        int (*dir_notify)(struct file *filp, unsigned long arg);
        int (*flock) (struct file *, int, struct file_lock *);
-       ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, size_t, unsigned 
-int);
-       ssize_t (*splice_read)(struct file *, struct pipe_inode_info *, size_t, unsigned  
-int);
+       ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, size_t, unsigned int);
+       ssize_t (*splice_read)(struct file *, struct pipe_inode_info *, size_t, unsigned int);
 };
 
 Again, all methods are called without any locks being held, unless
index 22b0814d0ad0927024de028303a4af9cce0afc11..20d368c59814206d82dfa2236bdf6764fd5bee85 100644 (file)
@@ -67,3 +67,7 @@ executed on expiry.
 
     Thomas, Ingo
 
+Added flag to indicate 'deferrable timer' in /proc/timer_stats. A deferrable
+timer will appear as follows
+  10D,     1 swapper          queue_delayed_work_on (delayed_work_timer_fn)
+
index 3de7d379cf077d3c933c931133b5f17132d1fa3a..5c7fbf9d96b40a32d674446a6120d206990d7d76 100644 (file)
@@ -67,7 +67,7 @@ Code  Seq#    Include File            Comments
 0x00   00-1F   linux/wavefront.h       conflict!
 0x02   all     linux/fd.h
 0x03   all     linux/hdreg.h
-0x04   all     linux/umsdos_fs.h
+0x04   D2-DC   linux/umsdos_fs.h       Dead since 2.6.11, but don't reuse these.
 0x06   all     linux/lp.h
 0x09   all     linux/md.h
 0x12   all     linux/fs.h
index 3078f14830dde2125d1b8f9fc756b5b2c76a6ce3..8363ad3ba0187f9abc65ab75c989e80bd0e70eed 100644 (file)
@@ -237,16 +237,9 @@ and is between 256 and 4096 characters. It is defined in the file
                        Disable PIN 1 of APIC timer
                        Can be useful to work around chipset bugs.
 
-       ad1816=         [HW,OSS]
-                       Format: <io>,<irq>,<dma>,<dma2>
-                       See also Documentation/sound/oss/AD1816.
-
        ad1848=         [HW,OSS]
                        Format: <io>,<irq>,<dma>,<dma2>,<type>
 
-       adlib=          [HW,OSS]
-                       Format: <io>
-
        advansys=       [HW,SCSI]
                        See header of drivers/scsi/advansys.c.
 
@@ -451,13 +444,20 @@ and is between 256 and 4096 characters. It is defined in the file
                        Documentation/networking/netconsole.txt for an
                        alternative.
 
-               uart,io,<addr>[,options]
-               uart,mmio,<addr>[,options]
+               uart[8250],io,<addr>[,options]
+               uart[8250],mmio,<addr>[,options]
                        Start an early, polled-mode console on the 8250/16550
                        UART at the specified I/O port or MMIO address,
                        switching to the matching ttyS device later.  The
                        options are the same as for ttyS, above.
 
+       earlycon=       [KNL] Output early console device and options.
+               uart[8250],io,<addr>[,options]
+               uart[8250],mmio,<addr>[,options]
+                       Start an early, polled-mode console on the 8250/16550
+                       UART at the specified I/O port or MMIO address.
+                       The options are the same as for ttyS, above.
+
        cpcihp_generic= [HW,PCI] Generic port I/O CompactPCI driver
                        Format:
                        <first_slot>,<last_slot>,<port>,<enum_bit>[,<debug>]
@@ -1159,6 +1159,8 @@ and is between 256 and 4096 characters. It is defined in the file
 
        nosmp           [SMP] Tells an SMP kernel to act as a UP kernel.
 
+       nosoftlockup    [KNL] Disable the soft-lockup detector.
+
        nosync          [HW,M68K] Disables sync negotiation for all devices.
 
        notsc           [BUGS=IA-32] Disable Time Stamp Counter
@@ -1167,14 +1169,16 @@ and is between 256 and 4096 characters. It is defined in the file
 
        nowb            [ARM]
 
+       numa_zonelist_order= [KNL, BOOT] Select zonelist order for NUMA.
+                       one of ['zone', 'node', 'default'] can be specified
+                       This can be set from sysctl after boot.
+                       See Documentation/sysctl/vm.txt for details.
+
        nr_uarts=       [SERIAL] maximum number of UARTs to be registered.
 
        opl3=           [HW,OSS]
                        Format: <io>
 
-       opl3sa2=        [HW,OSS] Format:
-                       <io>,<irq>,<dma>,<dma2>,<mss_io>,<mpu_io>,<ymode>,<loopback>[,<isapnp>,<multiple]
-
        oprofile.timer= [HW]
                        Use timer interrupt instead of performance counters
 
@@ -1356,6 +1360,15 @@ and is between 256 and 4096 characters. It is defined in the file
                        autoconfiguration.
                        Ranges are in pairs (memory base and size).
 
+       print-fatal-signals=
+                       [KNL] debug: print fatal signals
+                       print-fatal-signals=1: print segfault info to
+                       the kernel console.
+                       default: off.
+
+       printk.time=    Show timing data prefixed to each printk message line
+                       Format: <bool>  (1/Y/y=enable, 0/N/n=disable)
+
        profile=        [KNL] Enable kernel profiling via /proc/profile
                        Format: [schedule,]<number>
                        Param: "schedule" - profile schedule points.
@@ -1468,6 +1481,10 @@ and is between 256 and 4096 characters. It is defined in the file
 
        rootfstype=     [KNL] Set root filesystem type
 
+       rootwait        [KNL] Wait (indefinitely) for root device to show up.
+                       Useful for devices that are detected asynchronously
+                       (e.g. USB and MMC devices).
+
        rw              [KNL] Mount root device read-write on boot
 
        S               [KNL] Run init in single mode
@@ -1534,35 +1551,39 @@ and is between 256 and 4096 characters. It is defined in the file
 
        slram=          [HW,MTD]
 
-       slub_debug      [MM, SLUB]
-                       Enabling slub_debug allows one to determine the culprit
-                       if slab objects become corrupted. Enabling slub_debug
-                       creates guard zones around objects and poisons objects
-                       when not in use. Also tracks the last alloc / free.
-                       For more information see Documentation/vm/slub.txt.
+       slub_debug[=options[,slabs]]    [MM, SLUB]
+                       Enabling slub_debug allows one to determine the
+                       culprit if slab objects become corrupted. Enabling
+                       slub_debug can create guard zones around objects and
+                       may poison objects when not in use. Also tracks the
+                       last alloc / free. For more information see
+                       Documentation/vm/slub.txt.
 
        slub_max_order= [MM, SLUB]
-                       Determines the maximum allowed order for slabs. Setting
-                       this too high may cause fragmentation.
-                       For more information see Documentation/vm/slub.txt.
+                       Determines the maximum allowed order for slabs.
+                       A high setting may cause OOMs due to memory
+                       fragmentation. For more information see
+                       Documentation/vm/slub.txt.
 
        slub_min_objects=       [MM, SLUB]
-                       The minimum objects per slab. SLUB will increase the
-                       slab order up to slub_max_order to generate a
-                       sufficiently big slab to satisfy the number of objects.
-                       The higher the number of objects the smaller the overhead
-                       of tracking slabs.
+                       The minimum number of objects per slab. SLUB will
+                       increase the slab order up to slub_max_order to
+                       generate a sufficiently large slab able to contain
+                       the number of objects indicated. The higher the number
+                       of objects the smaller the overhead of tracking slabs
+                       and the less frequently locks need to be acquired.
                        For more information see Documentation/vm/slub.txt.
 
        slub_min_order= [MM, SLUB]
                        Determines the mininum page order for slabs. Must be
-                       lower than slub_max_order
+                       lower than slub_max_order.
                        For more information see Documentation/vm/slub.txt.
 
        slub_nomerge    [MM, SLUB]
-                       Disable merging of slabs of similar size. May be
+                       Disable merging of slabs with similar size. May be
                        necessary if there is some reason to distinguish
-                       allocs to different slabs.
+                       allocs to different slabs. Debug options disable
+                       merging on their own.
                        For more information see Documentation/vm/slub.txt.
 
        smart2=         [HW]
@@ -1775,6 +1796,7 @@ and is between 256 and 4096 characters. It is defined in the file
                        Set number of hash buckets for TCP connection
 
        time            Show timing data prefixed to each printk message line
+                       [deprecated, see 'printk.time']
 
        tipar.timeout=  [HW,PPT]
                        Set communications timeout in tenths of a second
index 7d5b60dea551daacec4cc81006678957a38f1795..23e6dde7eea6c34c33ffeb1ff0906a3f0848dcfa 100644 (file)
@@ -86,6 +86,20 @@ stuff are the values reported by the Oops - you can just cut-and-paste
 and do a replace of spaces to "\x" - that's what I do, as I'm too lazy 
 to write a program to automate this all).
 
+Alternatively, you can use the shell script in scripts/decodecode.
+Its usage is:  decodecode < oops.txt
+
+The hex bytes that follow "Code:" may (in some architectures) have a series
+of bytes that precede the current instruction pointer as well as bytes at and
+following the current instruction pointer.  In some cases, one instruction
+byte or word is surrounded by <> or (), as in "<86>" or "(f00d)".  These
+<> or () markings indicate the current instruction pointer.  Example from
+i386, split into multiple lines for readability:
+
+Code: f9 0f 8d f9 00 00 00 8d 42 0c e8 dd 26 11 c7 a1 60 ea 2b f9 8b 50 08 a1
+64 ea 2b f9 8d 34 82 8b 1e 85 db 74 6d 8b 15 60 ea 2b f9 <8b> 43 04 39 42 54
+7e 04 40 89 42 54 8b 43 04 3b 05 00 f6 52 c0
+
 Finally, if you want to see where the code comes from, you can do
 
        cd /usr/src/linux
diff --git a/Documentation/sound/oss/AD1816 b/Documentation/sound/oss/AD1816
deleted file mode 100644 (file)
index 14bd8f2..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-Documentation for the AD1816(A) sound driver
-============================================
-
-Installation:
--------------
-
-To get your AD1816(A) based sound card work, you'll have to enable support for
-experimental code ("Prompt for development and/or incomplete code/drivers")
-and isapnp ("Plug and Play support", "ISA Plug and Play support"). Enable
-"Sound card support", "OSS modules support" and "Support for AD1816(A) based
-cards (EXPERIMENTAL)" in the sound configuration menu, too. Now build, install
-and reboot the new kernel as usual.
-
-Features:
----------
-
-List of features supported by this driver:
-- full-duplex support
-- supported audio formats: unsigned 8bit, signed 16bit little endian, 
-                           signed 16bit big endian, Âµ-law, A-law
-- supported channels: mono and stereo
-- supported recording sources: Master, CD, Line, Line1, Line2, Mic
-- supports phat 3d stereo circuit (Line 3)
-
-
-Supported cards:
-----------------
-
-The following cards are known to work with this driver:
-- Terratec Base 1 
-- Terratec Base 64 
-- HP Kayak 
-- Acer FX-3D
-- SY-1816 
-- Highscreen Sound-Boostar 32 Wave 3D
-- Highscreen Sound-Boostar 16 
-- AVM Apex Pro card 
-- (Aztech SC-16 3D) 
-- (Newcom SC-16 3D) 
-- (Terratec EWS64S) 
-
-Cards listed in brackets are not supported reliable. If you have such a card 
-you should add the extra parameter:
-  options=1
-when loading the ad1816 module via modprobe. 
-
-
-Troubleshooting:
-----------------
-
-First of all you should check, if the driver has been loaded
-properly.
-
-If loading of the driver succeeds, but playback/capture fails, check
-if you used the correct values for irq, dma and dma2 when loading the module.
-If one of them is wrong you usually get the following error message:
-
-Nov  6 17:06:13 tek01 kernel: Sound: DMA (output) timed out - IRQ/DRQ config error?
-
-If playback/capture is too fast or to slow, you should have a look at
-the clock chip of your sound card. The AD1816 was designed for a 33MHz
-oscillator, however most sound card manufacturer use slightly
-different oscillators as they are cheaper than 33MHz oscillators. If
-you have such a card you have to adjust the ad1816_clockfreq parameter
-above. For example: For a card using a 32.875MHz oscillator use
-ad1816_clockfreq=32875 instead of ad1816_clockfreq=33000.
-
-
-Updates, bugfixes and bugreports:
---------------------------------
-
-As the driver is still experimental and under development, you should
-watch out for updates.  Updates of the driver are available on the
-Internet from one of my home pages:
-  http://www.student.informatik.tu-darmstadt.de/~tek/projects/linux.html
-or:
-  http://www.tu-darmstadt.de/~tek01/projects/linux.html
-
-Bugreports, bugfixes and related questions should be sent via E-Mail to:
-  tek@rbg.informatik.tu-darmstadt.de
-
-Thorsten Knabe <tek@rbg.informatik.tu-darmstadt.de>
-Christoph Hellwig <hch@infradead.org>
-       Last modified: 2000/09/20
diff --git a/Documentation/sound/oss/NM256 b/Documentation/sound/oss/NM256
deleted file mode 100644 (file)
index b503217..0000000
+++ /dev/null
@@ -1,280 +0,0 @@
-=======================================================
-Documentation for the NeoMagic 256AV/256ZX sound driver
-=======================================================
-
-You're looking at version 1.1 of the driver.  (Woohoo!) It has been
-successfully tested against the following laptop models:
-
-       Sony Z505S/Z505SX/Z505DX/Z505RX
-       Sony F150, F160, F180, F250, F270, F280, PCG-F26
-       Dell Latitude CPi, CPt (various submodels)
-
-There are a few caveats, which is why you should read the entirety of
-this document first.
-
-This driver was developed without any support or assistance from
-NeoMagic.  There is no warranty, expressed, implied, or otherwise.  It
-is free software in the public domain; feel free to use it, sell it,
-give it to your best friends, even claim that you wrote it (but why?!)
-but don't go whining to me, NeoMagic, Sony, Dell, or anyone else
-when it blows up your computer.
-
-Version 1.1 contains a change to try and detect non-AC97 versions of
-the hardware, and not install itself appropriately.  It should also
-reinitialize the hardware on an APM resume event, assuming that APM
-was configured into your kernel.
-
-============
-Installation
-============
-
-Enable the sound drivers, the OSS sound drivers, and then the NM256
-driver.  The NM256 driver *must* be configured as a module (it won't
-give you any other choice).
-
-Next, do the usual "make modules" and "make modules_install".
-Finally, insmod the soundcore, sound and nm256 modules.
-
-When the nm256 driver module is loaded, you should see a couple of
-confirmation messages in the kernel logfile indicating that it found
-the device (the device does *not* use any I/O ports or DMA channels).
-Now try playing a wav file, futz with the CD-ROM if you have one, etc.
-
-The NM256 is entirely a PCI-based device, and all the necessary
-information is automatically obtained from the card.  It can only be
-configured as a module in a vain attempt to prevent people from
-hurting themselves.  It works correctly if it shares an IRQ with
-another device (it normally shares IRQ 9 with the builtin eepro100
-ethernet on the Sony Z505 laptops). 
-
-It does not run the card in any sort of compatibility mode. It will
-not work on laptops that have the SB16-compatible, AD1848-compatible
-or CS4232-compatible codec/mixer; you will want to use the appropriate
-compatible OSS driver with these chipsets.  I cannot provide any
-assistance with machines using the SB16, AD1848 or CS4232 compatible
-versions.  (The driver now attempts to detect the mixer version, and
-will refuse to load if it believes the hardware is not
-AC97-compatible.)
-
-The sound support is very basic, but it does include simultaneous
-playback and record capability.  The mixer support is also quite
-simple, although this is in keeping with the rather limited
-functionality of the chipset.
-
-There is no hardware synthesizer available, as the Losedows OPL-3 and
-MIDI support is done via hardware emulation.
-
-Only three recording devices are available on the Sony: the
-microphone, the CD-ROM input, and the volume device (which corresponds
-to the stereo output).  (Other devices may be available on other
-models of laptops.)  The Z505 series does not have a builtin CD-ROM,
-so of course the CD-ROM input doesn't work.  It does work on laptops
-with a builtin CD-ROM drive.
-
-The mixer device does not appear to have any tone controls, at least
-on the Z505 series.  The mixer module checks for tone controls in the
-AC97 mixer, and will enable them if they are available.
-
-==============
-Known problems
-==============
-
-  * There are known problems with PCMCIA cards and the eepro100 ethernet 
-    driver on the Z505S/Z505SX/Z505DX.  Keep reading.
-
-  * There are also potential problems with using a virtual X display, and
-    also problems loading the module after the X server has been started. 
-    Keep reading.
-
-  * The volume control isn't anywhere near linear.  Sorry.  This will be
-    fixed eventually, when I get sufficiently annoyed with it.  (I doubt
-    it will ever be fixed now, since I've never gotten sufficiently
-    annoyed with it and nobody else seems to care.)
-
-  * There are reports that the CD-ROM volume is very low.  Since I do not
-    have a CD-ROM equipped laptop, I cannot test this (it's kinda hard to
-    do remotely).
-
-  * Only 8 fixed-rate speeds are supported.  This is mainly a chipset
-    limitation.  It may be possible to support other speeds in the future.
-
-  * There is no support for the telephone mixer/codec.  There is support
-    for a phonein/phoneout device in the mixer driver;  whether or not 
-    it does anything is anyone's guess.  (Reports on this would be
-    appreciated.  You'll have to figure out how to get the phone to
-    go off-hook before it'll work, tho.)
-
-  * This driver was not written with any cooperation or support from
-    NeoMagic.  If you have any questions about this, see their website
-    for their official stance on supporting open source drivers.
-
-============
-Video memory
-============
-
-The NeoMagic sound engine uses a portion of the display memory to hold
-the sound buffer.  (Crazy, eh?)  The NeoMagic video BIOS sets up a
-special pointer at the top of video RAM to indicate where the top of
-the audio buffer should be placed.
-
-At the present time XFree86 is apparently not aware of this.  It will
-thus write over either the pointer or the sound buffer with abandon.
-(Accelerated-X seems to do a better job here.)
-
-This implies a few things:
-
-  * Sometimes the NM256 driver has to guess at where the buffer 
-    should be placed, especially if the module is loaded after the
-    X server is started.  It's usually correct, but it will consistently
-    fail on the Sony F250.
-
-  * Virtual screens greater than 1024x768x16 under XFree86 are
-    problematic on laptops with only 2.5MB of screen RAM. This
-    includes all of the 256AV-equipped laptops.  (Virtual displays
-    may or may not work on the 256ZX, which has at least 4MB of
-    video RAM.)
-
-If you start having problems with random noise being output either
-constantly (this is the usual symptom on the F250), or when windows
-are moved around (this is the usual symptom when using a virtual
-screen), the best fix is to
-
-  * Don't use a virtual frame buffer.
-  * Make sure you load the NM256 module before the X server is
-    started.
-
-On the F250, it is possible to force the driver to load properly even
-after the XFree86 server is started by doing:
-
-       insmod nm256 buffertop=0x25a800
-
-This forces the audio buffers to the correct offset in screen RAM.
-
-One user has reported a similar problem on the Sony F270, although
-others apparently aren't seeing any problems.  His suggested command
-is
-
-       insmod nm256 buffertop=0x272800
-
-=================
-Official WWW site
-=================
-
-The official site for the NM256 driver is:
-
-       http://www.uglx.org/sony.html
-
-You should always be able to get the latest version of the driver there,
-and the driver will be supported for the foreseeable future.
-
-==============
-Z505RX and IDE
-==============
-
-There appears to be a problem with the IDE chipset on the Z505RX; one
-of the symptoms is that sound playback periodically hangs (when the
-disk is accessed).  The user reporting the problem also reported that
-enabling all of the IDE chipset workarounds in the kernel solved the
-problem, tho obviously only one of them should be needed--if someone
-can give me more details I would appreciate it.
-
-==============================
-Z505S/Z505SX on-board Ethernet
-==============================
-
-If you're using the on-board Ethernet Pro/100 ethernet support on the Z505
-series, I strongly encourage you to download the latest eepro100 driver from
-Donald Becker's site:
-
-       ftp://cesdis.gsfc.nasa.gov/pub/linux/drivers/test/eepro100.c
-
-There was a reported problem on the Z505SX that if the ethernet
-interface is disabled and reenabled while the sound driver is loaded,
-the machine would lock up.  I have included a workaround that is
-working satisfactorily.  However, you may occasionally see a message
-about "Releasing interrupts, over 1000 bad interrupts" which indicates
-that the workaround is doing its job.
-
-==================================
-PCMCIA and the Z505S/Z505SX/Z505DX
-==================================
-
-There is also a known problem with the Sony Z505S and Z505SX hanging
-if a PCMCIA card is inserted while the ethernet driver is loaded, or
-in some cases if the laptop is suspended.  This is caused by tons of
-spurious IRQ 9s, probably generated from the PCMCIA or ACPI bridges.
-
-There is currently no fix for the problem that works in every case.
-The only known workarounds are to disable the ethernet interface
-before inserting or removing a PCMCIA card, or with some cards
-disabling the PCMCIA card before ejecting it will also help the
-problem with the laptop hanging when the card is ejected.
-
-One user has reported that setting the tcic's cs_irq to some value
-other than 9 (like 11) fixed the problem.  This doesn't work on my
-Z505S, however--changing the value causes the cardmgr to stop seeing
-card insertions and removals, cards don't seem to work correctly, and
-I still get hangs if a card is inserted when the kernel is booted.
-
-Using the latest ethernet driver and pcmcia package allows me to
-insert an Adaptec 1480A SlimScsi card without the laptop hanging,
-although I still have to shut down the card before ejecting or
-powering down the laptop.  However, similar experiments with a DE-660
-ethernet card still result in hangs when the card is inserted.  I am
-beginning to think that the interrupts are CardBus-related, since the
-Adaptec card is a CardBus card, and the DE-660 is not; however, I
-don't have any other CardBus cards to test with.
-
-======
-Thanks
-======
-
-First, I want to thank everyone (except NeoMagic of course) for their
-generous support and encouragement.  I'd like to list everyone's name
-here that replied during the development phase, but the list is
-amazingly long.
-
-I will be rather unfair and single out a few people, however:
-
-       Justin Maurer, for being the first random net.person to try it,
-       and for letting me login to his Z505SX to get it working there
-
-       Edi Weitz for trying out several different versions, and giving
-       me a lot of useful feedback
-
-       Greg Rumple for letting me login remotely to get the driver 
-       functional on the 256ZX, for his assistance on tracking
-       down all sorts of random stuff, and for trying out Accel-X
-
-       Zach Brown, for the initial AC97 mixer interface design
-
-       Jeff Garzik, for various helpful suggestions on the AC97
-       interface
-
-       "Mr. Bumpy" for feedback on the Z505RX
-
-       Bill Nottingham, for generous assistance in getting the mixer ID
-       code working
-
-=================
-Previous versions
-=================
-
-Versions prior to 0.3 (aka `noname') had problems with weird artifacts
-in the output and failed to set the recording rate properly.  These
-problems have long since been fixed.
-
-Versions prior to 0.5 had problems with clicks in the output when
-anything other than 16-bit stereo sound was being played, and also had
-periodic clicks when recording.
-
-Version 0.7 first incorporated support for the NM256ZX chipset, which
-is found on some Dell Latitude laptops (the CPt, and apparently
-some CPi models as well).  It also included the generic AC97
-mixer module.
-
-Version 0.75 renamed all the functions and files with slightly more
-generic names.
-
-Note that previous versions of this document claimed that recording was
-8-bit only; it actually has been working for 16-bits all along.
diff --git a/Documentation/sound/oss/OPL3-SA2 b/Documentation/sound/oss/OPL3-SA2
deleted file mode 100644 (file)
index d8b6d2b..0000000
+++ /dev/null
@@ -1,210 +0,0 @@
-Documentation for the OPL3-SA2, SA3, and SAx driver (opl3sa2.o)
----------------------------------------------------------------
-
-Scott Murray, scott@spiteful.org
-January 7, 2001
-
-NOTE: All trade-marked terms mentioned below are properties of their
-      respective owners.
-
-
-Supported Devices
------------------
-
-This driver is for PnP soundcards based on the following Yamaha audio
-controller chipsets:
-
-YMF711 aka OPL3-SA2
-YMF715 and YMF719 aka OPL3-SA3
-
-Up until recently (December 2000), I'd thought the 719 to be a
-different chipset, the OPL3-SAx.  After an email exhange with
-Yamaha, however, it turns out that the 719 is just a re-badged
-715, and the chipsets are identical.  The chipset detection code
-has been updated to reflect this.
-
-Anyways, all of these chipsets implement the following devices:
-
-OPL3 FM synthesizer
-Soundblaster Pro
-Microsoft/Windows Sound System
-MPU401 MIDI interface
-
-Note that this driver uses the MSS device, and to my knowledge these
-chipsets enforce an either/or situation with the Soundblaster Pro
-device and the MSS device.  Since the MSS device has better
-capabilities, I have implemented the driver to use it.
-
-
-Mixer Channels
---------------
-
-Older versions of this driver (pre-December 2000) had two mixers,
-an OPL3-SA2 or SA3 mixer and a MSS mixer.  The OPL3-SA[23] mixer
-device contained a superset of mixer channels consisting of its own
-channels and all of the MSS mixer channels.  To simplify the driver
-considerably, and to partition functionality better, the OPL3-SA[23]
-mixer device now contains has its own specific mixer channels.  They
-are:
-
-Volume     - Hardware master volume control
-Bass       - SA3 only, now supports left and right channels
-Treble     - SA3 only, now supports left and right channels
-Microphone - Hardware microphone input volume control
-Digital1   - Yamaha 3D enhancement "Wide" mixer
-
-All other mixer channels (e.g. "PCM", "CD", etc.) now have to be
-controlled via the "MS Sound System (CS4231)" mixer.  To facilitate
-this, the mixer device creation order has been switched so that
-the MSS mixer is created first.  This allows accessing the majority
-of the useful mixer channels even via single mixer-aware tools
-such as "aumix".
-
-
-Plug 'n Play
-------------
-
-In previous kernels (2.2.x), some configuration was required to
-get the driver to talk to the card.  Being the new millennium and
-all, the 2.4.x kernels now support auto-configuration if ISA PnP
-support is configured in.  Theoretically, the driver even supports
-having more than one card in this case.
-
-With the addition of PnP support to the driver, two new parameters
-have been added to control it:
-
-isapnp   - set to 0 to disable ISA PnP card detection
-
-multiple - set to 0 to disable multiple PnP card detection
-
-
-Optional Parameters
--------------------
-
-Recent (December 2000) additions to the driver (based on a patch
-provided by Peter Englmaier) are two new parameters:
-
-ymode -    Set Yamaha 3D enhancement mode:
-           0 = Desktop/Normal  5-12 cm speakers
-           1 = Notebook PC (1) 3 cm speakers
-           2 = Notebook PC (2) 1.5 cm speakers
-           3 = Hi-Fi           16-38 cm speakers
-
-loopback - Set A/D input source. Useful for echo cancellation:
-           0 = Mic Right channel (default)
-           1 = Mono output loopback
-
-The ymode parameter has been tested and does work.  The loopback
-parameter, however, is untested.  Any feedback on its usefulness
-would be appreciated.
-
-
-Manual Configuration
---------------------
-
-If for some reason you decide not to compile ISA PnP support into
-your kernel, or disabled the driver's usage of it by setting the
-isapnp parameter as discussed above, then you will need to do some
-manual configuration.  There are two ways of doing this.  The most
-common is to use the isapnptools package to initialize the card, and
-use the kernel module form of the sound subsystem and sound drivers.
-Alternatively, some BIOS's allow manual configuration of installed
-PnP devices in a BIOS menu, which should allow using the non-modular
-sound drivers, i.e. built into the kernel.
-
-I personally use isapnp and modules, and do not have access to a PnP
-BIOS machine to test.  If you have such a beast, configuring the
-driver to be built into the kernel should just work (thanks to work
-done by David Luyer <luyer@ucs.uwa.edu.au>).  You will still need
-to specify settings, which can be done by adding:
-
-opl3sa2=<io>,<irq>,<dma>,<dma2>,<mssio>,<mpuio>
-
-to the kernel command line.  For example:
-
-opl3sa2=0x370,5,0,1,0x530,0x330
-
-If you are instead using the isapnp tools (as most people have been
-before Linux 2.4.x), follow the directions in their documentation to
-produce a configuration file.  Here is the relevant excerpt I used to
-use for my SA3 card from my isapnp.conf:
-
-(CONFIGURE YMH0800/-1 (LD 0
-
-# NOTE: IO 0 is for the unused SoundBlaster part of the chipset.
-(IO 0 (BASE 0x0220))
-(IO 1 (BASE 0x0530))
-(IO 2 (BASE 0x0388))
-(IO 3 (BASE 0x0330))
-(IO 4 (BASE 0x0370))
-(INT 0 (IRQ 5 (MODE +E)))
-(DMA 0 (CHANNEL 0))
-(DMA 1 (CHANNEL 1))
-
-Here, note that:
-
-Port  Acceptable Range  Purpose
-----  ----------------  -------
-IO 0  0x0220 - 0x0280   SB base address, unused.
-IO 1  0x0530 - 0x0F48   MSS base address
-IO 2  0x0388 - 0x03F8   OPL3 base address
-IO 3  0x0300 - 0x0334   MPU base address
-IO 4  0x0100 - 0x0FFE   card's own base address for its control I/O ports
-
-The IRQ and DMA values can be any that are considered acceptable for a
-MSS.  Assuming you've got isapnp all happy, then you should be able to
-do something like the following (which matches up with the isapnp
-configuration above):
-
-modprobe mpu401
-modprobe ad1848
-modprobe opl3sa2 io=0x370 mss_io=0x530 mpu_io=0x330 irq=5 dma=0 dma2=1
-modprobe opl3 io=0x388
-
-See the section "Automatic Module Loading" below for how to set up
-/etc/modprobe.conf to automate this.
-
-An important thing to remember that the opl3sa2 module's io argument is
-for it's own control port, which handles the card's master mixer for
-volume (on all cards), and bass and treble (on SA3 cards).
-
-
-Troubleshooting
----------------
-
-If all goes well and you see no error messages, you should be able to
-start using the sound capabilities of your system.  If you get an
-error message while trying to insert the opl3sa2 module, then make
-sure that the values of the various arguments match what you specified
-in your isapnp configuration file, and that there is no conflict with
-another device for an I/O port or interrupt.  Checking the contents of
-/proc/ioports and /proc/interrupts can be useful to see if you're
-butting heads with another device.
-
-If you still cannot get the module to load, look at the contents of
-your system log file, usually /var/log/messages.  If you see the
-message "opl3sa2: Unknown Yamaha audio controller version", then you
-have a different chipset version than I've encountered so far.  Look
-for all messages in the log file that start with "opl3sa2: " and see
-if they provide any clues.  If you do not see the chipset version
-message, and none of the other messages present in the system log are
-helpful, email me some details and I'll try my best to help.
-
-
-Automatic Module Loading
-------------------------
-
-Lastly, if you're using modules and want to set up automatic module
-loading with kmod, the kernel module loader, here is the section I
-currently use in my modprobe.conf file:
-
-# Sound
-alias sound-slot-0 opl3sa2
-options opl3sa2 io=0x370 mss_io=0x530 mpu_io=0x330 irq=7 dma=0 dma2=3
-options opl3 io=0x388
-
-That's all it currently takes to get an OPL3-SA3 card working on my
-system.  Once again, if you have any other problems, email me at the
-address listed above.
-
-Scott
diff --git a/Documentation/sound/oss/VIA-chipset b/Documentation/sound/oss/VIA-chipset
deleted file mode 100644 (file)
index 3786523..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-Running sound cards on VIA chipsets
-
-o      There are problems with VIA chipsets and sound cards that appear to
-       lock the hardware solidly. Test programs under DOS have verified the
-       problem exists on at least some (but apparently not all) VIA boards
-
-o      VIA have so far failed to bother to answer support mail on the subject
-       so if you are a VIA engineer feeling aggrieved as you read this 
-       document go chase your own people. If there is a workaround please
-       let us know so we can implement it.
-
-
-Certain patterns of ISA DMA access used for most PC sound cards cause the
-VIA chipsets to lock up. From the collected reports this appears to cover a
-wide range of boards. Some also lock up with sound cards under Win* as well.
-
-Linux implements a workaround providing your chipset is PCI and you compiled
-with PCI Quirks enabled. If so you will see a message
-       "Activating ISA DMA bug workarounds"
-
-during booting. If you have a VIA PCI chipset that hangs when you use the
-sound and is not generating this message even with PCI quirks enabled
-please report the information to the linux-kernel list (see REPORTING-BUGS).
-
-If you are one of the tiny number of unfortunates with a 486 ISA/VLB VIA
-chipset board you need to do the following to build a special kernel for
-your board
-
-       edit linux/include/asm-i386/dma.h
-
-change
-
-#define isa_dma_bridge_buggy   (0)
-
-to
-
-#define isa_dma_bridge_buggy   (1)
-
-and rebuild a kernel without PCI quirk support.
-
-
-Other than this particular glitch the VIA [M]VP* chipsets appear to work
-perfectly with Linux.
diff --git a/Documentation/sound/oss/cs46xx b/Documentation/sound/oss/cs46xx
deleted file mode 100644 (file)
index b544327..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-
-Documentation for the Cirrus Logic/Crystal SoundFusion cs46xx/cs4280 audio 
-controller chips (2001/05/11)
-
-The cs46xx audio driver supports the DSP line of Cirrus controllers. 
-Specifically, the cs4610, cs4612, cs4614, cs4622, cs4624, cs4630 and the cs4280
-products.  This driver uses the generic ac97_codec driver for AC97 codec
-support.  
-
-
-Features:
-
-Full Duplex Playback/Capture supported from 8k-48k.
-16Bit Signed LE & 8Bit Unsigned, with Mono or Stereo supported.
-
-APM/PM - 2.2.x PM is enabled and functional. APM can also
-be enabled for 2.4.x by modifying the CS46XX_ACPI_SUPPORT macro
-definition.
-
-DMA playback buffer size is configurable from 16k (defaultorder=2) up to 2Meg 
-(defaultorder=11).  DMA capture buffer size is fixed at a single 4k page as
-two 2k fragments.
-
-MMAP seems to work well with QuakeIII, and test XMMS plugin.
-
-Myth2 works, but the polling logic is not fully correct, but is functional.
-
-The 2.4.4-ac6 gameport code in the cs461x joystick driver has been tested 
-with a Microsoft Sidewinder joystick (cs461x.o and sidewinder.o).  This 
-audio driver must be loaded prior to the joystick driver to enable the
-DSP task image supporting the joystick device.
-
-
-Limitations:
-
-SPDIF is currently not supported.
-
-Primary codec support only.  No secondary codec support is implemented.
-
-
-
-NOTES:
-
-Hercules Game Theatre XP - the EGPIO2 pin controls the external Amp,
-and has been tested.
-Module parameter hercules_egpio_disable set to 1, will force a 0 to EGPIODR
-to disable the external amplifier.
-
-VTB Santa Cruz - the GPIO7/GPIO8 on the Secondary Codec control
-the external amplifier for the "back" speakers, since we do not
-support the secondary codec then this external amp is not
-turned on.  The primary codec external amplifier is supported but
-note that the AC97 EAPD bit is inverted logic (amp_voyetra()).
-
-DMA buffer size - there are issues with many of the Linux applications
-concerning the optimal buffer size.  Several applications request a 
-certain fragment size and number and then do not verify that the driver
-has the ability to support the requested configuration.  
-SNDCTL_DSP_SETFRAGMENT ioctl is used to request a fragment size and
-number of fragments.  Some applications exit if an error is returned
-on this particular ioctl. Therefore, in alignment with the other OSS audio 
-drivers, no error is returned when a SETFRAGs IOCTL is received, but the 
-values passed from the app are not used in any buffer calculation 
-(ossfragshift/ossmaxfrags are not used).
-Use the "defaultorder=N" module parameter to change the buffer size if
-you have an application that requires a specific number of fragments
-or a specific buffer size (see below).
-
-Debug Interface
----------------
-There is an ioctl debug interface to allow runtime modification of the 
-debug print levels.  This debug interface code can be disabled from the 
-compilation process with commenting the following define:
-#define CSDEBUG_INTERFACE 1
-There is also a debug print methodolgy to select printf statements from
-different areas of the driver.  A debug print level is also used to allow
-additional printfs to be active.  Comment out the following line in the
-driver to disable compilation of the CS_DBGOUT print statements:
-#define CSDEBUG 1
-Please see the definitions for cs_debuglevel and cs_debugmask for additional
-information on the debug levels and sections.
-
-There is also a csdbg executable to allow runtime manipulation of these 
-parameters.  for a copy email: twoller@crystal.cirrus.com
-
-
-
-MODULE_PARMS definitions
-------------------------
-module_param(defaultorder, ulong, 0);
-defaultorder=N
-where N is a value from 1 to 12
-The buffer order determines the size of the dma buffer for the driver.
-under Linux, a smaller buffer allows more responsiveness from many of the 
-applications (e.g. games).  A larger buffer allows some of the apps (esound) 
-to not underrun the dma buffer as easily.  As default, use 32k (order=3)
-rather than 64k as some of the games work more responsively.
-(2^N) * PAGE_SIZE = allocated buffer size
-
-module_param(cs_debuglevel, ulong, 0644);
-module_param(cs_debugmask, ulong, 0644);
-cs_debuglevel=N
-cs_debugmask=0xMMMMMMMM
-where N is a value from 0 (no debug printfs), to 9 (maximum)
-0xMMMMMMMM is a debug mask corresponding to the CS_xxx bits (see driver source).
-
-module_param(hercules_egpio_disable, ulong, 0);
-hercules_egpio_disable=N
-where N is a 0 (enable egpio), or a 1 (disable egpio support)
-
-module_param(initdelay, ulong, 0);
-initdelay=N
-This value is used to determine the millescond delay during the initialization
-code prior to powering up the PLL.  On laptops this value can be used to
-assist with errors on resume, mostly with IBM laptops.  Basically, if the 
-system is booted under battery power then the mdelay()/udelay() functions fail to 
-properly delay the required time.  Also, if the system is booted under AC power
-and then the power removed, the mdelay()/udelay() functions will not delay properly.
-module_param(powerdown, ulong, 0);
-powerdown=N
-where N is 0 (disable any powerdown of the internal blocks) or 1 (enable powerdown)
-
-
-module_param(external_amp, bool, 0);
-external_amp=1
-if N is set to 1, then force enabling the EAPD support in the primary AC97 codec.
-override the detection logic and force the external amp bit in the AC97 0x26 register
-to be reset (0).  EAPD should be 0 for powerup, and 1 for powerdown.  The VTB Santa Cruz
-card has inverted logic, so there is a special function for these cards.
-
-module_param(thinkpad, bool, 0);
-thinkpad=1
-if N is set to 1, then force enabling the clkrun functionality.
-Currently, when the part is being used, then clkrun is disabled for the entire system,
-but re-enabled when the driver is released or there is no outstanding open count.
-
index a661d684768e99c2cb9737b1e5f85925554f9235..471e75389778eb0583be31eed6cce9d6babf67fa 100644 (file)
@@ -1,7 +1,12 @@
-UPDATE March 21 2005 Amit Gud <gud@eth.net>
+SPIN_LOCK_UNLOCKED and RW_LOCK_UNLOCKED defeat lockdep state tracking and
+are hence deprecated.
 
-Macros SPIN_LOCK_UNLOCKED and RW_LOCK_UNLOCKED are deprecated and will be
-removed soon. So for any new code dynamic initialization should be used:
+Please use DEFINE_SPINLOCK()/DEFINE_RWLOCK() or
+__SPIN_LOCK_UNLOCKED()/__RW_LOCK_UNLOCKED() as appropriate for static
+initialization.
+
+Dynamic initialization, when necessary, may be performed as
+demonstrated below.
 
    spinlock_t xxx_lock;
    rwlock_t xxx_rw_lock;
@@ -15,12 +20,9 @@ removed soon. So for any new code dynamic initialization should be used:
 
    module_init(xxx_init);
 
-Reasons for deprecation
-  - it hurts automatic lock validators
-  - it becomes intrusive for the realtime preemption patches
-
-Following discussion is still valid, however, with the dynamic initialization
-of spinlocks instead of static.
+The following discussion is still valid, however, with the dynamic
+initialization of spinlocks or with DEFINE_SPINLOCK, etc., used
+instead of SPIN_LOCK_UNLOCKED.
 
 -----------------------
 
diff --git a/Documentation/sysctl/ctl_unnumbered.txt b/Documentation/sysctl/ctl_unnumbered.txt
new file mode 100644 (file)
index 0000000..23003a8
--- /dev/null
@@ -0,0 +1,22 @@
+
+Except for a few extremely rare exceptions user space applications do not use
+the binary sysctl interface.  Instead everyone uses /proc/sys/...  with
+readable ascii names.
+
+Recently the kernel has started supporting setting the binary sysctl value to
+CTL_UNNUMBERED so we no longer need to assign a binary sysctl path to allow
+sysctls to show up in /proc/sys.
+
+Assigning binary sysctl numbers is an endless source of conflicts in sysctl.h,
+breaking of the user space ABI (because of those conflicts), and maintenance
+problems.  A complete pass through all of the sysctl users revealed multiple
+instances where the sysctl binary interface was broken and had gone undetected
+for years.
+
+So please do not add new binary sysctl numbers.  They are unneeded and
+problematic.
+
+If you really need a new binary sysctl number please first merge your sysctl
+into the kernel and then as a separate patch allocate a binary sysctl number.
+
+(ebiederm@xmission.com, June 2007)
index 8cfca173d4bca46fab5c121be80d070858aaa0c6..df3ff2095f9d2decc6846f7286a27702370efbe4 100644 (file)
@@ -32,6 +32,7 @@ Currently, these files are in /proc/sys/vm:
 - min_slab_ratio
 - panic_on_oom
 - mmap_min_address
+- numa_zonelist_order
 
 ==============================================================
 
@@ -231,3 +232,47 @@ security module.  Setting this value to something like 64k will allow the
 vast majority of applications to work correctly and provide defense in depth
 against future potential kernel bugs.
 
+==============================================================
+
+numa_zonelist_order
+
+This sysctl is only for NUMA.
+'where the memory is allocated from' is controlled by zonelists.
+(This documentation ignores ZONE_HIGHMEM/ZONE_DMA32 for simple explanation.
+ you may be able to read ZONE_DMA as ZONE_DMA32...)
+
+In non-NUMA case, a zonelist for GFP_KERNEL is ordered as following.
+ZONE_NORMAL -> ZONE_DMA
+This means that a memory allocation request for GFP_KERNEL will
+get memory from ZONE_DMA only when ZONE_NORMAL is not available.
+
+In NUMA case, you can think of following 2 types of order.
+Assume 2 node NUMA and below is zonelist of Node(0)'s GFP_KERNEL
+
+(A) Node(0) ZONE_NORMAL -> Node(0) ZONE_DMA -> Node(1) ZONE_NORMAL
+(B) Node(0) ZONE_NORMAL -> Node(1) ZONE_NORMAL -> Node(0) ZONE_DMA.
+
+Type(A) offers the best locality for processes on Node(0), but ZONE_DMA
+will be used before ZONE_NORMAL exhaustion. This increases possibility of
+out-of-memory(OOM) of ZONE_DMA because ZONE_DMA is tend to be small.
+
+Type(B) cannot offer the best locality but is more robust against OOM of
+the DMA zone.
+
+Type(A) is called as "Node" order. Type (B) is "Zone" order.
+
+"Node order" orders the zonelists by node, then by zone within each node.
+Specify "[Nn]ode" for zone order
+
+"Zone Order" orders the zonelists by zone type, then by node within each
+zone.  Specify "[Zz]one"for zode order.
+
+Specify "[Dd]efault" to request automatic configuration.  Autoconfiguration
+will select "node" order in following case.
+(1) if the DMA zone does not exist or
+(2) if the DMA zone comprises greater than 50% of the available memory or
+(3) if any node's DMA zone comprises greater than 60% of its local memory and
+    the amount of local memory is big enough.
+
+Otherwise, "zone" order will be selected. Default order is recommended unless
+this is causing problems for your system/application.
index 687104bfd09a79eef794b8dbe1357c33864d028c..51ccc48aa763a55dd641eb32fd05ceff63a80a67 100644 (file)
@@ -77,8 +77,9 @@ If the user applications are going to request hugepages using mmap system
 call, then it is required that system administrator mount a file system of
 type hugetlbfs:
 
-       mount none /mnt/huge -t hugetlbfs <uid=value> <gid=value> <mode=value>
-                <size=value> <nr_inodes=value>
+  mount -t hugetlbfs \
+       -o uid=<value>,gid=<value>,mode=<value>,size=<value>,nr_inodes=<value> \
+       none /mnt/huge
 
 This command mounts a (pseudo) filesystem of type hugetlbfs on the directory
 /mnt/huge.  Any files created on /mnt/huge uses hugepages.  The uid and gid
@@ -88,11 +89,10 @@ mode of root of file system to value & 0777.  This value is given in octal.
 By default the value 0755 is picked. The size option sets the maximum value of
 memory (huge pages) allowed for that filesystem (/mnt/huge). The size is
 rounded down to HPAGE_SIZE.  The option nr_inodes sets the maximum number of
-inodes that /mnt/huge can use.  If the size or nr_inodes options are not
+inodes that /mnt/huge can use.  If the size or nr_inodes option is not
 provided on command line then no limits are set.  For size and nr_inodes
 options, you can use [G|g]/[M|m]/[K|k] to represent giga/mega/kilo. For
-example, size=2K has the same meaning as size=2048. An example is given at
-the end of this document.
+example, size=2K has the same meaning as size=2048.
 
 read and write system calls are not supported on files that reside on hugetlb
 file systems.
index 1523320abd87e6fdfcf2d099869a54f2d3deea3c..df812b03b65d3383962496204d7c3f3e10f6308e 100644 (file)
@@ -41,6 +41,8 @@ Possible debug options are
        P               Poisoning (object and padding)
        U               User tracking (free and alloc)
        T               Trace (please only use on single slabs)
+       -               Switch all debugging off (useful if the kernel is
+                       configured with CONFIG_SLUB_DEBUG_ON)
 
 F.e. in order to boot just with sanity checks and red zoning one would specify:
 
index 4d5760614503d5315857f48d93e19df31dab87f0..5abec1435ad8c94c5a25979d86c016d7b3452654 100644 (file)
@@ -194,13 +194,6 @@ M: jes@trained-monkey.org
 L:     linux-acenic@sunsite.dk
 S:     Maintained
 
-ACI MIXER DRIVER
-P:     Robert Siemer
-M:     Robert.Siemer@gmx.de
-L:     linux-sound@vger.kernel.org
-W:     http://www.stud.uni-karlsruhe.de/~uh1b/
-S:     Maintained
-
 IPS SCSI RAID DRIVER
 P:     Adaptec OEM Raid Solutions
 M:     aacraid@adaptec.com
@@ -272,21 +265,6 @@ L: linux-acpi@vger.kernel.org
 W:     http://acpi.sourceforge.net/
 S:     Supported
 
-AD1816 SOUND DRIVER
-P:     Thorsten Knabe
-M:     Thorsten Knabe <linux@thorsten-knabe.de>
-W:     http://linux.thorsten-knabe.de
-S:     Maintained
-
-AD1889 SOUND DRIVER
-P:     Kyle McMartin
-M:     kyle@parisc-linux.org
-P:     Thibaut Varene
-M:     T-Bone@parisc-linux.org
-W:     http://wiki.parisc-linux.org/AD1889
-L:     parisc-linux@lists.parisc-linux.org
-S:     Maintained
-
 ADM1025 HARDWARE MONITOR DRIVER
 P:     Jean Delvare
 M:     khali@linux-fr.org
@@ -1276,6 +1254,12 @@ M:       tori@unhappy.mine.nu
 L:     netdev@vger.kernel.org
 S:     Maintained
 
+DMA GENERIC MEMCPY SUBSYSTEM
+P:     Shannon Nelson
+M:     shannon.nelson@intel.com
+L:     linux-kernel@vger.kernel.org
+S:     Maintained
+
 DOCBOOK FOR DOCUMENTATION
 P:     Randy Dunlap
 M:     rdunlap@xenotime.net
@@ -1398,13 +1382,6 @@ M:       raisch@de.ibm.com
 L:     general@lists.openfabrics.org
 S:     Supported
 
-EMU10K1 SOUND DRIVER
-P:     James Courtier-Dutton
-M:     James@superbug.demon.co.uk
-L:     emu10k1-devel@lists.sourceforge.net
-W:     http://sourceforge.net/projects/emu10k1/
-S:     Maintained
-
 EMULEX LPFC FC SCSI DRIVER
 P:     James Smart
 M:     james.smart@emulex.com
@@ -1900,6 +1877,12 @@ P:       Tigran Aivazian
 M:     tigran@aivazian.fsnet.co.uk
 S:     Maintained
 
+INTEL I/OAT DMA DRIVER
+P:     Shannon Nelson
+M:     shannon.nelson@intel.com
+L:     linux-kernel@vger.kernel.org
+S:     Supported
+
 INTEL IXP4XX RANDOM NUMBER GENERATOR SUPPORT
 P:     Deepak Saxena
 M:     dsaxena@plexity.net
@@ -2297,6 +2280,14 @@ M:       matthew@wil.cx
 L:     linux-scsi@vger.kernel.org
 S:     Maintained
 
+M32R ARCHITECTURE
+P:     Hirokazu Takata
+M:     takata@linux-m32r.org
+L:     linux-m32r@ml.linux-m32r.org
+L:     linux-m32r-ja@ml.linux-m32r.org (in Japanese)
+W:     http://www.linux-m32r.org/
+S:     Maintained
+
 M68K ARCHITECTURE
 P:     Geert Uytterhoeven
 M:     geert@linux-m68k.org
@@ -2704,12 +2695,6 @@ L:       osst-users@lists.sourceforge.net
 L:     linux-scsi@vger.kernel.org
 S:     Maintained
 
-OPL3-SA2, SA3, and SAx DRIVER
-P:     Zwane Mwaikambo
-M:     zwane@arm.linux.org.uk
-L:     linux-sound@vger.kernel.org
-S:     Maintained
-
 OPROFILE
 P:     Philippe Elie
 M:     phil.el@wanadoo.fr
index de4f8f7d396c6435065a02ebb8274b54165ec2a6..ddbfcac299c1c587c2e9f5d172bfb3e052b12118 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -313,7 +313,8 @@ LINUXINCLUDE    := -Iinclude \
 CPPFLAGS        := -D__KERNEL__ $(LINUXINCLUDE)
 
 CFLAGS          := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
-                   -fno-strict-aliasing -fno-common
+                  -fno-strict-aliasing -fno-common \
+                  -Werror-implicit-function-declaration
 AFLAGS          := -D__ASSEMBLY__
 
 # Read KERNELRELEASE from include/config/kernel.release (if it exists)
index 930cedc8be24120d4b7f876876a1ce017618abbd..783f4e50c11137e83b9f31c5b952df062b673539 100644 (file)
@@ -289,7 +289,7 @@ srm_console_device(struct console *co, int *index)
        return srmcons_driver;
 }
 
-static int __init
+static int
 srm_console_setup(struct console *co, char *options)
 {
        return 0;
index 0bcb968cb60a72b7a71b99d98947a53882f620be..922143ea1cdbb6d4b6df166f26e22482ef2f871c 100644 (file)
@@ -420,7 +420,7 @@ marvel_init_pci(void)
                io7_clear_errors(io7);
 }
 
-static void
+static void __init
 marvel_init_rtc(void)
 {
        init_rtc_irq();
index 4748e14a28bca3b9edd05b73d0787b60367cee7d..1dd50d07693cb9241ce1d064b589d5d4938c64ff 100644 (file)
@@ -144,7 +144,7 @@ irqreturn_t timer_interrupt(int irq, void *dev)
        return IRQ_HANDLED;
 }
 
-void
+void __init
 common_init_rtc(void)
 {
        unsigned char x;
index 20688bc13e9bc57ea89785c3e75deb81216f7d58..9044f33299f730b2f7c258da2efb68750f2124d1 100644 (file)
@@ -17,6 +17,9 @@ config MMU
        bool
        default y
 
+config NO_DMA
+       def_bool y
+
 config ARCH_ACORN
         bool
         default y
index c4a89703c3d81ddd66d202b39787f98129f973a7..2b7d44bf49bf6bec3f8403988c7fc3193fc42ba6 100644 (file)
@@ -248,7 +248,6 @@ CONFIG_I2C_CHARDEV=y
 # CONFIG_JBD_DEBUG is not set
 # CONFIG_FAT_FS is not set
 # CONFIG_MSDOS_FS is not set
-# CONFIG_UMSDOS_FS is not set
 # CONFIG_VFAT_FS is not set
 # CONFIG_EFS_FS is not set
 # CONFIG_JFFS_FS is not set
index 562fac12eb95762dc3e7ed0f5b089a49e42b1690..36e7ee3f8321aed7cff7cf8ed23fe79e472c223c 100644 (file)
@@ -33,9 +33,6 @@
 
 #include <asm/map.h>
 
-
-#define TABLE_SIZE     PTRS_PER_PTE * sizeof(pte_t))
-
 struct mmu_gather mmu_gathers[NR_CPUS];
 
 extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
index 86d107511dd4dc1290e765714a2b560432e85a17..aaa792815cd7ce6d71d760291937b7d2a67f68ad 100644 (file)
@@ -184,7 +184,7 @@ asmlinkage void do_illegal_opcode(unsigned long ecr, struct pt_regs *regs)
        if (!user_mode(regs) && (ecr == ECR_ILLEGAL_OPCODE)) {
                enum bug_trap_type type;
 
-               type = report_bug(regs->pc);
+               type = report_bug(regs->pc, regs);
                switch (type) {
                case BUG_TRAP_TYPE_NONE:
                        break;
index 2a3411eaace94a38c5889351a856494c736c8c10..710c20ba2be7ae79fdf618317a2c4e845dc47a19 100644 (file)
@@ -429,7 +429,6 @@ CONFIG_NET_ETHERNET=y
 # CONFIG_BFS_FS is not set
 # CONFIG_FAT_FS is not set
 # CONFIG_MSDOS_FS is not set
-# CONFIG_UMSDOS_FS is not set
 # CONFIG_VFAT_FS is not set
 # CONFIG_EFS_FS is not set
 # CONFIG_JFFS_FS is not set
index 1a071f17446dea7aac9dd40c146c900ed271ad6f..e8914d4016966385e6c380c0471d371c05006c69 100644 (file)
@@ -267,10 +267,10 @@ static void print_user_dma_lists(struct cryptocop_dma_list_operation *dma_op);
 
 
 const struct file_operations cryptocop_fops = {
-       owner: THIS_MODULE,
-       open: cryptocop_open,
-       release: cryptocop_release,
-       ioctl: cryptocop_ioctl
+       .owner =        THIS_MODULE,
+       .open =         cryptocop_open,
+       .release =      cryptocop_release,
+       .ioctl =        cryptocop_ioctl
 };
 
 
index 5d6c52737df3683246ee69152b8256a2c33bd851..e12f6cc6f4a2f24e12306011924f2f53db088e2a 100644 (file)
@@ -574,10 +574,10 @@ i2c_ioctl(struct inode *inode, struct file *file,
 }
 
 static const struct file_operations i2c_fops = {
-       owner:    THIS_MODULE,
-       ioctl:    i2c_ioctl,
-       open:     i2c_open,
-       release:  i2c_release,
+       .owner =    THIS_MODULE,
+       .ioctl =    i2c_ioctl,
+       .open =     i2c_open,
+       .release =  i2c_release,
 };
 
 int __init
index 24b919b3821aff88ca23be6c4bfa97d5021b4150..fa8d50007e4c31af2b82f7d987e439bcbb5af7d7 100644 (file)
@@ -51,10 +51,10 @@ int pcf8563_open(struct inode *, struct file *);
 int pcf8563_release(struct inode *, struct file *);
 
 static const struct file_operations pcf8563_fops = {
-       owner: THIS_MODULE,
-       ioctl: pcf8563_ioctl,
-       open: pcf8563_open,
-       release: pcf8563_release,
+       .owner =        THIS_MODULE,
+       .ioctl =        pcf8563_ioctl,
+       .open =         pcf8563_open,
+       .release =      pcf8563_release,
 };
 
 unsigned char
index 43dc08ec7511eff6b3dba5b4a632ac9dc34d7ba2..275673c192aad94632ef32a885ba3e0dbd37a304 100644 (file)
@@ -1492,6 +1492,10 @@ sys_call_table:
        .long sys_move_pages
        .long sys_getcpu
        .long sys_epoll_pwait
+       .long sys_utimensat             /* 320 */
+       .long sys_signalfd
+       .long sys_timerfd
+       .long sys_eventfd
 
 
 syscall_table_size = (. - sys_call_table)
index 1e7a101cbf4c8c645c894adfdf9f718f6b0e76eb..e89cad1192a99e5949e12f01020f76a7053671dd 100644 (file)
@@ -647,17 +647,11 @@ void debug_to_serial(const char *p, int n)
 }
 #endif
 
-#ifdef CONFIG_GDBSTUB_CONSOLE
-
-static kdev_t gdbstub_console_dev(struct console *con)
-{
-       return MKDEV(1,3); /* /dev/null */
-}
+#ifdef CONFIG_GDB_CONSOLE
 
 static struct console gdbstub_console = {
        .name   = "gdb",
        .write  = gdbstub_console_write,        /* in break.S */
-       .device = gdbstub_console_dev,
        .flags  = CON_PRINTBUFFER,
        .index  = -1,
 };
@@ -2021,7 +2015,7 @@ void __init gdbstub_init(void)
        ptr = mem2hex(gdbstub_banner, ptr, sizeof(gdbstub_banner) - 1, 0);
        gdbstub_send_packet(output_buffer);
 #endif
-#if defined(CONFIG_GDBSTUB_CONSOLE) && defined(CONFIG_GDBSTUB_IMMEDIATE)
+#if defined(CONFIG_GDB_CONSOLE) && defined(CONFIG_GDBSTUB_IMMEDIATE)
        register_console(&gdbstub_console);
 #endif
 
@@ -2031,7 +2025,7 @@ void __init gdbstub_init(void)
 /*
  * register the console at a more appropriate time
  */
-#if defined (CONFIG_GDBSTUB_CONSOLE) && !defined(CONFIG_GDBSTUB_IMMEDIATE)
+#if defined (CONFIG_GDB_CONSOLE) && !defined(CONFIG_GDBSTUB_IMMEDIATE)
 static int __init gdbstub_postinit(void)
 {
        printk("registering console\n");
index aa3c795d5354aa97084c0f82c23ab3abe3e25359..c1c32e4c863da0896e196af17f9c541e31b07089 100644 (file)
@@ -60,10 +60,6 @@ static void __init setup_linux_memory(void);
 static void __init setup_uclinux_memory(void);
 #endif
 
-#ifdef CONFIG_CONSOLE
-extern struct consw *conswitchp;
-#endif
-
 #ifdef CONFIG_MB93090_MB00
 static char __initdata mb93090_banner[] = "FJ/RH FR-V Linux";
 static char __initdata mb93090_version[] = UTS_RELEASE;
@@ -795,13 +791,6 @@ void __init setup_arch(char **cmdline_p)
 #endif
 #endif
 
-#if defined(CONFIG_CHR_DEV_FLASH) || defined(CONFIG_BLK_DEV_FLASH)
-       /* we need to initialize the Flashrom device here since we might
-        * do things with flash early on in the boot
-        */
-       flash_probe();
-#endif
-
        /* deal with the command line - RedBoot may have passed one to the kernel */
        memcpy(command_line, boot_command_line, sizeof(command_line));
        *cmdline_p = &command_line[0];
@@ -837,11 +826,6 @@ void __init setup_arch(char **cmdline_p)
 #endif
 #endif
 
-#ifdef CONFIG_BLK_DEV_BLKMEM
-       ROOT_DEV = MKDEV(BLKMEM_MAJOR,0);
-#endif
-       /*rom_length = (unsigned long)&_flashend - (unsigned long)&_romvec;*/
-
 #ifdef CONFIG_MMU
        setup_linux_memory();
 #else
index 618dbad696f6d535f3fa55ce07cfae23289d7cfa..e35f74e6e50566d489852d5156013e5e65de9c5d 100644 (file)
@@ -68,6 +68,9 @@ config TIME_LOW_RES
 config NO_IOPORT
        def_bool y
 
+config NO_DMA
+       def_bool y
+
 config ISA
        bool
        default y
index b2d896a7e598a25c01c852737f3a65b69e30dbde..53b5c1edf596b94eba9d39e54765230d677cc80f 100644 (file)
@@ -61,10 +61,11 @@ archmrproper:
 archclean:
        $(Q)$(MAKE) $(clean)=$(boot)
 
-vmlinux.srec vmlinux.bin: vmlinux
+vmlinux.srec vmlinux.bin zImage: vmlinux
        $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
 
 define archhelp
-  echo  'vmlinux.bin  - Create raw binary'
-  echo  'vmlinux.srec - Create srec binary'
+  @echo  'vmlinux.bin  - Create raw binary'
+  @echo  'vmlinux.srec - Create srec binary'
+  @echo  'zImage       - Compressed kernel image'
 endef
index 71aac82a8ae0a72df0f2b5580ca0a59bb6d47b11..d6189e057ed354804f04822ee78e73f2e069b827 100644 (file)
@@ -15,10 +15,10 @@ OBJECTS = $(obj)/head.o $(obj)/misc.o
 # in order to suppress error message.
 #
 CONFIG_MEMORY_START     ?= 0x00400000
-CONFIG_BOOT_LINK_OFFSET ?= 0x00400000
+CONFIG_BOOT_LINK_OFFSET ?= 0x00140000
 IMAGE_OFFSET := $(shell printf "0x%08x" $$[$(CONFIG_MEMORY_START)+$(CONFIG_BOOT_LINK_OFFSET)])
 
-LDFLAGS_vmlinux := -T $(obj)/vmlinux.lds
+LDFLAGS_vmlinux := -Ttext $(IMAGE_OFFSET) -estartup $(obj)/vmlinux.lds
 
 $(obj)/vmlinux: $(OBJECTS) $(obj)/piggy.o FORCE
        $(call if_changed,ld)
index b8e90d12d19e906641c2376c9dd7b8fd9d7578bb..985a81a2435a08715fc89a5fa6da5b322d041b90 100644 (file)
@@ -4,7 +4,7 @@
  *  Copyright (C) 2006 Yoshinori Sato
  */
 
-.h8300h
+       .h8300h
 #include <linux/linkage.h>
 
 #define SRAM_START 0xff4000
diff --git a/arch/h8300/boot/compressed/vmlinux.lds b/arch/h8300/boot/compressed/vmlinux.lds
new file mode 100644 (file)
index 0000000..65e2a0d
--- /dev/null
@@ -0,0 +1,32 @@
+SECTIONS
+{
+        .text :
+        {
+        __stext = . ;
+       __text = .;
+              *(.text.startup)
+              *(.text)
+        __etext = . ;
+        }
+
+       .rodata :
+       {
+               *(.rodata)
+       }
+        .data :
+
+        {
+        __sdata = . ;
+        ___data_start = . ;
+                *(.data.*)
+       }
+        .bss :
+        {
+        . = ALIGN(0x4) ;
+        __sbss = . ;
+                *(.bss*)
+        . = ALIGN(0x4) ;
+        __ebss = . ;
+        __end = . ;
+        }
+}
diff --git a/arch/h8300/boot/compressed/vmlinux.scr b/arch/h8300/boot/compressed/vmlinux.scr
new file mode 100644 (file)
index 0000000..a0f6962
--- /dev/null
@@ -0,0 +1,9 @@
+SECTIONS
+{
+  .data : {
+       _input_len = .;
+       LONG(_input_data_end - _input_data) _input_data = .;
+       *(.data)
+       _input_data_end = .;
+       }
+}
index ccc1a7fbf94b0bf4c70d41fa78207574cbffe0f2..874f6aefee65aaab0da63255922fb98d35afdabe 100644 (file)
@@ -6,6 +6,7 @@ extra-y := vmlinux.lds
 
 obj-y := process.o traps.o ptrace.o irq.o \
         sys_h8300.o time.o semaphore.o signal.o \
-         setup.o gpio.o init_task.o syscalls.o
+         setup.o gpio.o init_task.o syscalls.o \
+        entry.o
 
 obj-$(CONFIG_MODULES) += module.o h8300_ksyms.o 
similarity index 62%
rename from arch/h8300/platform/h8s/entry.S
rename to arch/h8300/kernel/entry.S
index f3d6b8e8f959a274a459a8c0df8697b2082be77d..ca7431690300a15fe5dc3ed0b61ad35756d363fd 100644 (file)
@@ -1,11 +1,10 @@
 /* -*- mode: asm -*-
  *
- *  linux/arch/h8300/platform/h8s/entry.S
+ *  linux/arch/h8300/platform/h8300h/entry.S
  *
  *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *  David McCullough <davidm@snapgear.com>
  *
- *     fairly heavy changes to fix syscall args and signal processing
- *     by David McCullough <davidm@snapgear.com>
  */
 
 /*
 #include <asm/thread_info.h>
 #include <asm/errno.h>
 
+#if defined(CONFIG_CPU_H8300H)
+#define USERRET 8
+INTERRUPTS = 64
+       .h8300h
+       .macro  SHLL2 reg
+       shll.l  \reg
+       shll.l  \reg
+       .endm
+       .macro  SHLR2 reg
+       shlr.l  \reg
+       shlr.l  \reg
+       .endm
+       .macro  SAVEREGS
+       mov.l   er0,@-sp
+       mov.l   er1,@-sp
+       mov.l   er2,@-sp
+       mov.l   er3,@-sp
+       .endm
+       .macro  RESTOREREGS
+       mov.l   @sp+,er3
+       mov.l   @sp+,er2
+       .endm
+       .macro  SAVEEXR
+       .endm
+       .macro  RESTOREEXR
+       .endm
+#endif
+#if defined(CONFIG_CPU_H8S)
+#define USERRET 10
+#define USEREXR 8
+INTERRUPTS = 128
        .h8300s
+       .macro  SHLL2 reg
+       shll.l  #2,\reg
+       .endm
+       .macro  SHLR2 reg
+       shlr.l  #2,\reg
+       .endm
+       .macro  SAVEREGS
+       stm.l   er0-er3,@-sp
+       .endm
+       .macro  RESTOREREGS
+       ldm.l   @sp+,er2-er3
+       .endm
+       .macro  SAVEEXR
+       mov.w   @(USEREXR:16,er0),r1
+       mov.w   r1,@(LEXR-LER3:16,sp)           /* copy EXR */
+       .endm
+       .macro  RESTOREEXR
+       mov.w   @(LEXR-LER1:16,sp),r1           /* restore EXR */
+       mov.b   r1l,r1h
+       mov.w   r1,@(USEREXR:16,er0)
+       .endm
+#endif
+
 
 /* CPU context save/restore macros. */
-       
+
        .macro  SAVE_ALL
        mov.l   er0,@-sp
-
        stc     ccr,r0l                         /* check kernel mode */
        btst    #4,r0l
        bne     5f
        mov.l   @sp,er0                         /* restore saved er0 */
        orc     #0x10,ccr                       /* switch kernel stack */
        mov.l   @SYMBOL_NAME(sw_ksp),sp
-       sub.l   #(LRET-LORIG),sp                /* allocate LORIG - LRET */ 
-       stm.l   er0-er3,@-sp
-       mov.l   @SYMBOL_NAME(sw_usp),er0
-       mov.l   @(10:16,er0),er1                /* copy the RET addr */
-       mov.l   er1,@(LRET-LER3:16,sp)
-       mov.w   @(8:16,er0),r1
-       mov.w   r1,@(LEXR-LER3:16,sp)           /* copy EXR */
+       sub.l   #(LRET-LORIG),sp                /* allocate LORIG - LRET */
+       SAVEREGS
+       mov.l   @SYMBOL_NAME(sw_usp),er0
+       mov.l   @(USERRET:16,er0),er1           /* copy the RET addr */
+       mov.l   er1,@(LRET-LER3:16,sp)
+       SAVEEXR
 
-       mov.w   e1,r1                           /* e1 highbyte = ccr */
-       and     #0xef,r1h                       /* mask mode? flag */
-       sub.w   r0,r0
-       mov.b   r1h,r0l
-       mov.w   r0,@(LCCR-LER3:16,sp)           /* copy ccr */
        mov.l   @(LORIG-LER3:16,sp),er0
        mov.l   er0,@(LER0-LER3:16,sp)          /* copy ER0 */
+       mov.w   e1,r1                           /* e1 highbyte = ccr */
+       and     #0xef,r1h                       /* mask mode? flag */
        bra     6f
 5:
        /* kernel mode */
        mov.l   @sp,er0                         /* restore saved er0 */
        subs    #2,sp                           /* set dummy ccr */
-       stm.l   er0-er3,@-sp
+       SAVEREGS
        mov.w   @(LRET-LER3:16,sp),r1           /* copy old ccr */
+6:
        mov.b   r1h,r1l
        mov.b   #0,r1h
-       mov.w   r1,@(LCCR-LER3:16,sp)
-6:     
+       mov.w   r1,@(LCCR-LER3:16,sp)           /* set ccr */
        mov.l   er6,@-sp                        /* syscall arg #6 */
        mov.l   er5,@-sp                        /* syscall arg #5 */
        mov.l   er4,@-sp                        /* syscall arg #4 */
-       .endm
+       .endm                                   /* r1 = ccr */
 
        .macro  RESTORE_ALL
        mov.l   @sp+,er4
        mov.l   @sp+,er5
        mov.l   @sp+,er6
-       ldm.l   @sp+,er2-er3
+       RESTOREREGS
        mov.w   @(LCCR-LER1:16,sp),r0           /* check kernel mode */
        btst    #4,r0l
        bne     7f
        mov.l   @SYMBOL_NAME(sw_usp),er0
        mov.l   @(LER0-LER1:16,sp),er1          /* restore ER0 */
        mov.l   er1,@er0
-       mov.w   @(LEXR-LER1:16,sp),r1           /* restore EXR */
-       mov.b   r1l,r1h
-       mov.w   r1,@(8:16,er0)
+       RESTOREEXR
        mov.w   @(LCCR-LER1:16,sp),r1           /* restore the RET addr */
        mov.b   r1l,r1h
        mov.b   @(LRET+1-LER1:16,sp),r1l
        mov.w   r1,e1
        mov.w   @(LRET+2-LER1:16,sp),r1
-       mov.l   er1,@(10:16,er0)
+       mov.l   er1,@(USERRET:16,er0)
 
        mov.l   @sp+,er1
-       add.l   #(LRET-LER1),sp                 /* remove LORIG - LRET */ 
+       add.l   #(LRET-LER1),sp                 /* remove LORIG - LRET */
        mov.l   sp,@SYMBOL_NAME(sw_ksp)
        andc    #0xef,ccr                       /* switch to user mode */
        mov.l   er0,sp
        adds    #4,sp                           /* remove the sw created LVEC */
        rte
        .endm
-       
+
 .globl SYMBOL_NAME(system_call)
 .globl SYMBOL_NAME(ret_from_exception)
 .globl SYMBOL_NAME(ret_from_fork)
 .globl SYMBOL_NAME(interrupt_redirect_table)
 .globl SYMBOL_NAME(sw_ksp),SYMBOL_NAME(sw_usp)
 .globl SYMBOL_NAME(resume)
-.globl SYMBOL_NAME(trace_break)
 .globl SYMBOL_NAME(interrupt_entry)
-               
-INTERRUPTS = 128
+.globl SYMBOL_NAME(trace_break)
+
 #if defined(CONFIG_ROMKERNEL)
        .section .int_redirect,"ax"
 SYMBOL_NAME_LABEL(interrupt_redirect_table)
+#if defined(CONFIG_CPU_H8300H)
        .rept   7
        .long   0
        .endr
+#endif
+#if defined(CONFIG_CPU_H8S)
+       .rept   5
+       .long   0
+       .endr
+       jmp     @SYMBOL_NAME(trace_break)
+       .long   0
+#endif
+
        jsr     @SYMBOL_NAME(interrupt_entry)   /* NMI */
        jmp     @SYMBOL_NAME(system_call)       /* TRAPA #0 (System call) */
        .long   0
@@ -141,20 +196,20 @@ SYMBOL_NAME_LABEL(interrupt_redirect_table)
 SYMBOL_NAME_LABEL(interrupt_redirect_table)
        .space  4
 #endif
-       
+
        .section .text
        .align  2
 SYMBOL_NAME_LABEL(interrupt_entry)
        SAVE_ALL
-       mov.w   @(LCCR,sp),r0
-       btst    #4,r0l
+       mov.l   sp,er0
+       add.l   #LVEC,er0
+       btst    #4,r1l
        bne     1f
+       /* user LVEC */
        mov.l   @SYMBOL_NAME(sw_usp),er0
-       mov.l   @(4:16,er0),er0
-       bra     2f
+       adds    #4,er0
 1:
-       mov.l   @(LVEC:16,sp),er0
-2:
+       mov.l   @er0,er0                        /* LVEC address */
 #if defined(CONFIG_ROMKERNEL)
        sub.l   #SYMBOL_NAME(interrupt_redirect_table),er0
 #endif
@@ -162,69 +217,62 @@ SYMBOL_NAME_LABEL(interrupt_entry)
        mov.l   @SYMBOL_NAME(interrupt_redirect_table),er1
        sub.l   er1,er0
 #endif
-       shlr.l  #2,er0
+       SHLR2   er0
        dec.l   #1,er0
        mov.l   sp,er1
        subs    #4,er1                          /* adjust ret_pc */
-       jsr     @SYMBOL_NAME(process_int)
-       mov.l   @SYMBOL_NAME(irq_stat)+CPUSTAT_SOFTIRQ_PENDING,er0
-       beq     1f
-       jsr     @SYMBOL_NAME(do_softirq)
-1:
-       jmp     @SYMBOL_NAME(ret_from_exception)
+       jsr     @SYMBOL_NAME(do_IRQ)
+       jmp     @SYMBOL_NAME(ret_from_interrupt)
 
 SYMBOL_NAME_LABEL(system_call)
        subs    #4,sp                           /* dummy LVEC */
        SAVE_ALL
+       andc    #0x7f,ccr
        mov.l   er0,er4
-       mov.l   #-ENOSYS,er0
-       mov.l   er0,@(LER0:16,sp)
 
        /* save top of frame */
        mov.l   sp,er0
        jsr     @SYMBOL_NAME(set_esp0)
-       cmp.l   #NR_syscalls,er4
-       bcc     SYMBOL_NAME(ret_from_exception):16
-       shll.l  #2,er4
-       mov.l   #SYMBOL_NAME(sys_call_table),er0
-       add.l   er4,er0
-       mov.l   @er0,er0
-       mov.l   er0,er4
-       beq     SYMBOL_NAME(ret_from_exception):16      
        mov.l   sp,er2
        and.w   #0xe000,r2
-       mov.b   @((TASK_FLAGS+3-(TIF_SYSCALL_TRACE >> 3)):16,er2),r2l
+       mov.b   @((TI_FLAGS+3-(TIF_SYSCALL_TRACE >> 3)):16,er2),r2l
        btst    #(TIF_SYSCALL_TRACE & 7),r2l
+       beq     1f
+       jsr     @SYMBOL_NAME(do_syscall_trace)
+1:
+       cmp.l   #NR_syscalls,er4
+       bcc     badsys
+       SHLL2   er4
+       mov.l   #SYMBOL_NAME(sys_call_table),er0
+       add.l   er4,er0
+       mov.l   @er0,er4
+       beq     SYMBOL_NAME(ret_from_exception):16
        mov.l   @(LER1:16,sp),er0
        mov.l   @(LER2:16,sp),er1
        mov.l   @(LER3:16,sp),er2
-       andc    #0x7f,ccr
        jsr     @er4
-       mov.l   er0,@(LER0:16,sp)                       /* save the return value */
+       mov.l   er0,@(LER0:16,sp)               /* save the return value */
+       mov.l   sp,er2
+       and.w   #0xe000,r2
+       mov.b   @((TI_FLAGS+3-(TIF_SYSCALL_TRACE >> 3)):16,er2),r2l
+       btst    #(TIF_SYSCALL_TRACE & 7),r2l
+       beq     2f
+       jsr     @SYMBOL_NAME(do_syscall_trace)
+2:
 #if defined(CONFIG_SYSCALL_PRINT)
        jsr     @SYMBOL_NAME(syscall_print)
 #endif
-       bra     SYMBOL_NAME(ret_from_exception):8
-1:
-       jsr     SYMBOL_NAME(syscall_trace)
-       mov.l   @(LER1:16,sp),er0
-       mov.l   @(LER2:16,sp),er1
-       mov.l   @(LER3:16,sp),er2
-       jsr     @er4
-       mov.l   er0,@(LER0:16,sp)               /* save the return value */
-       jsr     @SYMBOL_NAME(syscall_trace)
-       bra     SYMBOL_NAME(ret_from_exception):8
+       orc     #0x80,ccr
+       bra     resume_userspace
 
-SYMBOL_NAME_LABEL(ret_from_fork)
-       mov.l   er2,er0
-       jsr     @SYMBOL_NAME(schedule_tail)
-       bra     SYMBOL_NAME(ret_from_exception):8
+badsys:
+       mov.l   #-ENOSYS,er0
+       mov.l   er0,@(LER0:16,sp)
+       bra     resume_userspace
 
-SYMBOL_NAME_LABEL(reschedule)
-       /* save top of frame */
-       mov.l   sp,er0
-       jsr     @SYMBOL_NAME(set_esp0)
-       jsr     @SYMBOL_NAME(schedule)
+#if !defined(CONFIG_PREEMPT)
+#define resume_kernel restore_all
+#endif
 
 SYMBOL_NAME_LABEL(ret_from_exception)
 #if defined(CONFIG_PREEMPT)
@@ -232,58 +280,68 @@ SYMBOL_NAME_LABEL(ret_from_exception)
 #endif
 SYMBOL_NAME_LABEL(ret_from_interrupt)
        mov.b   @(LCCR+1:16,sp),r0l
-       btst    #4,r0l                  /* check if returning to kernel */
-       bne     done:8                  /* if so, skip resched, signals */
+       btst    #4,r0l
+       bne     resume_kernel:8         /* return from kernel */
+resume_userspace:
        andc    #0x7f,ccr
        mov.l   sp,er4
-       and.w   #0xe000,r4
+       and.w   #0xe000,r4              /* er4 <- current thread info */
        mov.l   @(TI_FLAGS:16,er4),er1
        and.l   #_TIF_WORK_MASK,er1
-       beq     done:8
-1:
-       mov.l   @(TI_FLAGS:16,er4),er1
+       beq     restore_all:8
+work_pending:
        btst    #TIF_NEED_RESCHED,r1l
-       bne     SYMBOL_NAME(reschedule):16
+       bne     work_resched:8
+       /* work notifysig */
        mov.l   sp,er0
-       subs    #4,er0                  /* adjust retpc */
-       mov.l   er2,er1
-       jsr     @SYMBOL_NAME(do_signal)
+       subs    #4,er0                  /* er0: pt_regs */
+       jsr     @SYMBOL_NAME(do_notify_resume)
+       bra     restore_all:8
+work_resched:
+       mov.l   sp,er0
+       jsr     @SYMBOL_NAME(set_esp0)
+       jsr     @SYMBOL_NAME(schedule)
+       bra     resume_userspace:8
+restore_all:
+       RESTORE_ALL                     /* Does RTE */
+
 #if defined(CONFIG_PREEMPT)
-       bra     done:8                  /* userspace thoru */
-3:
-       btst    #4,r0l
-       beq     done:8                  /* userspace thoru */
-4:
-       mov.l   @(TI_PRE_COUNT:16,er4),er1
-       bne     done:8
-       mov.l   @(TI_FLAGS:16,er4),er1
-       btst    #TIF_NEED_RESCHED,r1l
-       beq     done:8
-       mov.b   r0l,r0l
-       bpl     done:8                  /* interrupt off (exception path?) */
-       mov.l   #PREEMPT_ACTIVE,er1
-       mov.l   er1,@(TI_PRE_COUNT:16,er4)
+resume_kernel:
+       mov.l   @(TI_PRE_COUNT:16,er4),er0
+       bne     restore_all:8
+need_resched:
+       mov.l   @(TI_FLAGS:16,er4),er0
+       btst    #TIF_NEED_RESCHED,r0l
+       beq     restore_all:8
+       mov.b   @(LCCR+1:16,sp),r0l     /* Interrupt Enabled? */
+       bmi     restore_all:8
+       mov.l   #PREEMPT_ACTIVE,er0
+       mov.l   er0,@(TI_PRE_COUNT:16,er4)
        andc    #0x7f,ccr
+       mov.l   sp,er0
+       jsr     @SYMBOL_NAME(set_esp0)
        jsr     @SYMBOL_NAME(schedule)
-       sub.l   er1,er1
-       mov.l   er1,@(TI_PRE_COUNT:16,er4)
        orc     #0x80,ccr
-       bra     4b:8
+       bra     need_resched:8
 #endif
-done:
-       RESTORE_ALL                     /* Does RTE */
+
+SYMBOL_NAME_LABEL(ret_from_fork)
+       mov.l   er2,er0
+       jsr     @SYMBOL_NAME(schedule_tail)
+       jmp     @SYMBOL_NAME(ret_from_exception)
 
 SYMBOL_NAME_LABEL(resume)
        /*
-        *      er0 = prev
-        *      er1 = next
-        *      return last in er2
+        * Beware - when entering resume, offset of tss is in d1,
+        * prev (the current task) is in a0, next (the new task)
+        * is in a1 and d2.b is non-zero if the mm structure is
+        * shared between the tasks, so don't change these
+        * registers until their contents are no longer needed.
         */
 
        /* save sr */
        sub.w   r3,r3
        stc     ccr,r3l
-       stc     exr,r3h
        mov.w   r3,@(THREAD_CCR+2:16,er0)
 
        /* disable interrupts */
@@ -291,41 +349,45 @@ SYMBOL_NAME_LABEL(resume)
        mov.l   @SYMBOL_NAME(sw_usp),er3
        mov.l   er3,@(THREAD_USP:16,er0)
        mov.l   sp,@(THREAD_KSP:16,er0)
-       
+
        /* Skip address space switching if they are the same. */
        /* FIXME: what did we hack out of here, this does nothing! */
 
        mov.l   @(THREAD_USP:16,er1),er0
        mov.l   er0,@SYMBOL_NAME(sw_usp)
        mov.l   @(THREAD_KSP:16,er1),sp
-                       
+
        /* restore status register */
        mov.w   @(THREAD_CCR+2:16,er1),r3
 
        ldc     r3l,ccr
-       ldc     r3h,exr
-
        rts
 
 SYMBOL_NAME_LABEL(trace_break)
-       subs    #4,sp                   /* dummy LVEC */
+       subs    #4,sp
        SAVE_ALL
        sub.l   er1,er1
        dec.l   #1,er1
-       mov.l   er1,@(LORIG,sp) 
+       mov.l   er1,@(LORIG,sp)
        mov.l   sp,er0
        jsr     @SYMBOL_NAME(set_esp0)
        mov.l   @SYMBOL_NAME(sw_usp),er0
        mov.l   @er0,er1
+       mov.w   @(-2:16,er1),r2
+       cmp.w   #0x5730,r2
+       beq     1f
        subs    #2,er1
-       mov.l   er1,@er0        
+       mov.l   er1,@er0
+1:
        and.w   #0xff,e1
        mov.l   er1,er0
        jsr     @SYMBOL_NAME(trace_trap)
-       jmp     @SYMBOL_NAME(ret_from_exception)        
+       jmp     @SYMBOL_NAME(ret_from_exception)
 
        .section        .bss
 SYMBOL_NAME_LABEL(sw_ksp)
-       .space  4       
+       .space  4
 SYMBOL_NAME_LABEL(sw_usp)
-       .space  4       
+       .space  4
+
+       .end
diff --git a/arch/h8300/kernel/ints.c b/arch/h8300/kernel/ints.c
deleted file mode 100644 (file)
index 3e4f479..0000000
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * linux/arch/h8300/kernel/ints.c
- *
- * Yoshinori Sato <ysato@users.sourceforge.jp>
- *
- * Based on linux/arch/$(ARCH)/platform/$(PLATFORM)/ints.c
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file COPYING in the main directory of this archive
- * for more details.
- *
- * Copyright 1996 Roman Zippel
- * Copyright 1999 D. Jeff Dionne <jeff@rt-control.com>
- */
-
-#include <linux/module.h>
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/kernel_stat.h>
-#include <linux/seq_file.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-#include <linux/random.h>
-#include <linux/bootmem.h>
-#include <linux/hardirq.h>
-
-#include <asm/system.h>
-#include <asm/irq.h>
-#include <asm/traps.h>
-#include <asm/io.h>
-#include <asm/setup.h>
-#include <asm/errno.h>
-
-/*
- * This structure has only 4 elements for speed reasons
- */
-typedef struct irq_handler {
-       irqreturn_t (*handler)(int, void *, struct pt_regs *);
-       int         flags;
-       int         count;
-       void        *dev_id;
-       const char  *devname;
-} irq_handler_t;
-
-static irq_handler_t *irq_list[NR_IRQS];
-static int use_kmalloc;
-
-extern unsigned long *interrupt_redirect_table;
-extern const int h8300_saved_vectors[];
-extern const unsigned long h8300_trap_table[];
-int h8300_enable_irq_pin(unsigned int irq);
-void h8300_disable_irq_pin(unsigned int irq);
-
-#define CPU_VECTOR ((unsigned long *)0x000000)
-#define ADDR_MASK (0xffffff)
-
-#if defined(CONFIG_RAMKERNEL)
-static unsigned long __init *get_vector_address(void)
-{
-       unsigned long *rom_vector = CPU_VECTOR;
-       unsigned long base,tmp;
-       int vec_no;
-
-       base = rom_vector[EXT_IRQ0] & ADDR_MASK;
-       
-       /* check romvector format */
-       for (vec_no = EXT_IRQ1; vec_no <= EXT_IRQ0+EXT_IRQS; vec_no++) {
-               if ((base+(vec_no - EXT_IRQ0)*4) != (rom_vector[vec_no] & ADDR_MASK))
-                       return NULL;
-       }
-
-       /* ramvector base address */
-       base -= EXT_IRQ0*4;
-
-       /* writerble check */
-       tmp = ~(*(volatile unsigned long *)base);
-       (*(volatile unsigned long *)base) = tmp;
-       if ((*(volatile unsigned long *)base) != tmp)
-               return NULL;
-       return (unsigned long *)base;
-}
-#endif
-
-void __init init_IRQ(void)
-{
-#if defined(CONFIG_RAMKERNEL)
-       int i;
-       unsigned long *ramvec,*ramvec_p;
-       const unsigned long *trap_entry;
-       const int *saved_vector;
-
-       ramvec = get_vector_address();
-       if (ramvec == NULL)
-               panic("interrupt vector serup failed.");
-       else
-               printk(KERN_INFO "virtual vector at 0x%08lx\n",(unsigned long)ramvec);
-
-       /* create redirect table */
-       ramvec_p = ramvec;
-       trap_entry = h8300_trap_table;
-       saved_vector = h8300_saved_vectors;
-       for ( i = 0; i < NR_IRQS; i++) {
-               if (i == *saved_vector) {
-                       ramvec_p++;
-                       saved_vector++;
-               } else {
-                       if ( i < NR_TRAPS ) {
-                               if (*trap_entry)
-                                       *ramvec_p = VECTOR(*trap_entry);
-                               ramvec_p++;
-                               trap_entry++;
-                       } else
-                               *ramvec_p++ = REDIRECT(interrupt_entry);
-               }
-       }
-       interrupt_redirect_table = ramvec;
-#ifdef DUMP_VECTOR
-       ramvec_p = ramvec;
-       for (i = 0; i < NR_IRQS; i++) {
-               if ((i % 8) == 0)
-                       printk(KERN_DEBUG "\n%p: ",ramvec_p);
-               printk(KERN_DEBUG "%p ",*ramvec_p);
-               ramvec_p++;
-       }
-       printk(KERN_DEBUG "\n");
-#endif
-#endif
-}
-
-int request_irq(unsigned int irq, 
-               irqreturn_t (*handler)(int, void *, struct pt_regs *),
-                unsigned long flags, const char *devname, void *dev_id)
-{
-       irq_handler_t *irq_handle;
-       if (irq < 0 || irq >= NR_IRQS) {
-               printk(KERN_ERR "Incorrect IRQ %d from %s\n", irq, devname);
-               return -EINVAL;
-       }
-
-       if (irq_list[irq] || (h8300_enable_irq_pin(irq) == -EBUSY))
-               return -EBUSY;
-
-       if (use_kmalloc)
-               irq_handle = kmalloc(sizeof(irq_handler_t), GFP_ATOMIC);
-       else {
-               /* use bootmem allocater */
-               irq_handle = (irq_handler_t *)alloc_bootmem(sizeof(irq_handler_t));
-               irq_handle = (irq_handler_t *)((unsigned long)irq_handle | 0x80000000);
-       }
-
-       if (irq_handle == NULL)
-               return -ENOMEM;
-
-       irq_handle->handler = handler;
-       irq_handle->flags   = flags;
-       irq_handle->count   = 0;
-       irq_handle->dev_id  = dev_id;
-       irq_handle->devname = devname;
-       irq_list[irq] = irq_handle;
-
-       if (irq_handle->flags & IRQF_SAMPLE_RANDOM)
-               rand_initialize_irq(irq);
-
-       enable_irq(irq);
-       return 0;
-}
-
-EXPORT_SYMBOL(request_irq);
-
-void free_irq(unsigned int irq, void *dev_id)
-{
-       if (irq >= NR_IRQS)
-               return;
-
-       if (!irq_list[irq] || irq_list[irq]->dev_id != dev_id)
-               printk(KERN_WARNING "Removing probably wrong IRQ %d from %s\n",
-                      irq, irq_list[irq]->devname);
-       disable_irq(irq);
-       h8300_disable_irq_pin(irq);
-       if (((unsigned long)irq_list[irq] & 0x80000000) == 0) {
-               kfree(irq_list[irq]);
-               irq_list[irq] = NULL;
-       }
-}
-
-EXPORT_SYMBOL(free_irq);
-
-/*
- * Do we need these probe functions on the m68k?
- */
-unsigned long probe_irq_on (void)
-{
-       return 0;
-}
-
-EXPORT_SYMBOL(probe_irq_on);
-
-int probe_irq_off (unsigned long irqs)
-{
-       return 0;
-}
-
-EXPORT_SYMBOL(probe_irq_off);
-
-void enable_irq(unsigned int irq)
-{
-       if (irq >= EXT_IRQ0 && irq <= (EXT_IRQ0 + EXT_IRQS))
-               IER_REGS |= 1 << (irq - EXT_IRQ0);
-}
-
-void disable_irq(unsigned int irq)
-{
-       if (irq >= EXT_IRQ0 && irq <= (EXT_IRQ0 + EXT_IRQS))
-               IER_REGS &= ~(1 << (irq - EXT_IRQ0));
-}
-
-asmlinkage void process_int(int irq, struct pt_regs *fp)
-{
-       irq_enter();
-       h8300_clear_isr(irq);
-       if (irq >= NR_TRAPS && irq < NR_IRQS) {
-               if (irq_list[irq]) {
-                       irq_list[irq]->handler(irq, irq_list[irq]->dev_id, fp);
-                       irq_list[irq]->count++;
-                       if (irq_list[irq]->flags & IRQF_SAMPLE_RANDOM)
-                               add_interrupt_randomness(irq);
-               }
-       } else {
-               BUG();
-       }
-       irq_exit();
-}
-
-int show_interrupts(struct seq_file *p, void *v)
-{
-       int i = *(loff_t *) v;
-
-       if ((i < NR_IRQS) && (irq_list[i]!=NULL)) {
-               seq_printf(p, "%3d: %10u ",i,irq_list[i]->count);
-               seq_printf(p, "%s\n", irq_list[i]->devname);
-       }
-
-       return 0;
-}
-
-void init_irq_proc(void)
-{
-}
-
-static int __init enable_kmalloc(void)
-{
-       use_kmalloc = 1;
-       return 0;
-}
-core_initcall(enable_kmalloc);
index 8f2411db7eaf3473d5433e5bf31cda3582208a04..8a7a991b8f765ffb1fa47883eeffef39af1d3110 100644 (file)
@@ -219,7 +219,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
        return ret;
 }
 
-asmlinkage void syscall_trace(void)
+asmlinkage void do_syscall_trace(void)
 {
        if (!test_thread_flag(TIF_SYSCALL_TRACE))
                return;
index 02955604d7606f76eabf4ee6bd3b0478aad1c10c..62ea12d339b9275c154a30b0e55451f16b7f640c 100644 (file)
@@ -547,3 +547,9 @@ asmlinkage int do_signal(struct pt_regs *regs, sigset_t *oldset)
        }
        return 0;
 }
+
+asmlinkage void do_notify_resume(struct pt_regs *regs, u32 thread_info_flags)
+{
+       if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK))
+               do_signal(regs, NULL);
+}
index b24ea08aa0a72fc7420c2199ff46d3d8ada834e6..c5096369ea50cd59d009bbc9552cee64ef7bf5e5 100644 (file)
@@ -4,4 +4,4 @@
 # Reuse any files we can from the H8/300H
 #
 
-obj-y := entry.o irq_pin.o ptrace_h8300h.o
+obj-y := irq_pin.o ptrace_h8300h.o
diff --git a/arch/h8300/platform/h8300h/entry.S b/arch/h8300/platform/h8300h/entry.S
deleted file mode 100644 (file)
index f86ac3b..0000000
+++ /dev/null
@@ -1,332 +0,0 @@
-/* -*- mode: asm -*-
- *
- *  linux/arch/h8300/platform/h8300h/entry.S
- *
- *  Yoshinori Sato <ysato@users.sourceforge.jp>
- *  David McCullough <davidm@snapgear.com>
- *
- */
-
-/*
- *  entry.S
- *  include exception/interrupt gateway
- *          system call entry
- */
-
-#include <linux/sys.h>
-#include <asm/unistd.h>
-#include <asm/setup.h>
-#include <asm/segment.h>
-#include <asm/linkage.h>
-#include <asm/asm-offsets.h>
-#include <asm/thread_info.h>
-#include <asm/errno.h>
-
-       .h8300h
-
-/* CPU context save/restore macros. */
-       
-       .macro  SAVE_ALL
-       mov.l   er0,@-sp
-
-       stc     ccr,r0l                         /* check kernel mode */
-       btst    #4,r0l
-       bne     5f
-
-       mov.l   sp,@SYMBOL_NAME(sw_usp)         /* user mode */
-       mov.l   @sp,er0
-       orc     #0x10,ccr
-       mov.l   @SYMBOL_NAME(sw_ksp),sp
-       sub.l   #(LRET-LORIG),sp                /* allocate LORIG - LRET */ 
-       mov.l   er0,@-sp
-       mov.l   er1,@-sp
-       mov.l   @SYMBOL_NAME(sw_usp),er0
-       mov.l   @(8:16,er0),er1                 /* copy the RET addr */
-       mov.l   er1,@(LRET-LER1:16,sp)
-
-       mov.w   e1,r1                           /* e1 highbyte = ccr */
-       and     #0xef,r1h                       /* mask mode? flag */
-       sub.w   r0,r0
-       mov.b   r1h,r0l
-       mov.w   r0,@(LCCR-LER1:16,sp)           /* copy ccr */
-       mov.l   @(LORIG-LER1:16,sp),er0
-       mov.l   er0,@(LER0-LER1:16,sp)          /* copy ER0 */
-       bra     6f
-5:
-       mov.l   @sp,er0                         /* kernel mode */
-       subs    #2,sp                           /* dummy ccr */
-       mov.l   er0,@-sp
-       mov.l   er1,@-sp
-       mov.w   @(LRET-LER1:16,sp),r1           /* copy old ccr */
-       mov.b   r1h,r1l
-       mov.b   #0,r1h
-       mov.w   r1,@(LCCR-LER1:16,sp)           /* set ccr */
-6:
-       mov.l   er2,@-sp
-       mov.l   er3,@-sp
-       mov.l   er6,@-sp                        /* syscall arg #6 */
-       mov.l   er5,@-sp                        /* syscall arg #5 */
-       mov.l   er4,@-sp                        /* syscall arg #4 */
-       .endm
-
-       .macro  RESTORE_ALL
-       mov.l   @sp+,er4
-       mov.l   @sp+,er5
-       mov.l   @sp+,er6
-       mov.l   @sp+,er3
-       mov.l   @sp+,er2
-       mov.w   @(LCCR-LER1:16,sp),r0           /* check kernel mode */
-       btst    #4,r0l
-       bne     7f
-
-       orc     #0x80,ccr
-       mov.l   @SYMBOL_NAME(sw_usp),er0
-       mov.l   @(LER0-LER1:16,sp),er1          /* restore ER0 */
-       mov.l   er1,@er0
-       mov.w   @(LCCR-LER1:16,sp),r1           /* restore the RET addr */
-       mov.b   r1l,r1h
-       mov.b   @(LRET+1-LER1:16,sp),r1l
-       mov.w   r1,e1
-       mov.w   @(LRET+2-LER1:16,sp),r1
-       mov.l   er1,@(8:16,er0)
-
-       mov.l   @sp+,er1
-       add.l   #(LRET-LER1),sp                 /* remove LORIG - LRET */ 
-       mov.l   sp,@SYMBOL_NAME(sw_ksp)
-       mov.l   er0,sp
-       bra     8f
-7:
-       mov.l   @sp+,er1
-       adds    #4,sp
-       adds    #2,sp
-8:
-       mov.l   @sp+,er0
-       adds    #4,sp                           /* remove the sw created LVEC */
-       rte
-       .endm
-       
-.globl SYMBOL_NAME(system_call)
-.globl SYMBOL_NAME(ret_from_exception)
-.globl SYMBOL_NAME(ret_from_fork)
-.globl SYMBOL_NAME(ret_from_interrupt)
-.globl SYMBOL_NAME(interrupt_redirect_table)
-.globl SYMBOL_NAME(sw_ksp),SYMBOL_NAME(sw_usp)
-.globl SYMBOL_NAME(resume)
-.globl SYMBOL_NAME(interrupt_redirect_table)
-.globl SYMBOL_NAME(interrupt_entry)
-.globl SYMBOL_NAME(system_call)
-.globl SYMBOL_NAME(trace_break)
-
-#if defined(CONFIG_ROMKERNEL)
-INTERRUPTS = 64                
-       .section .int_redirect,"ax"
-SYMBOL_NAME_LABEL(interrupt_redirect_table)
-       .rept   7
-       .long   0
-       .endr
-       jsr     @SYMBOL_NAME(interrupt_entry)   /* NMI */
-       jmp     @SYMBOL_NAME(system_call)       /* TRAPA #0 (System call) */
-       .long   0
-       .long   0
-       jmp     @SYMBOL_NAME(trace_break)       /* TRAPA #3 (breakpoint) */
-       .rept   INTERRUPTS-12
-       jsr     @SYMBOL_NAME(interrupt_entry)
-       .endr
-#endif
-#if defined(CONFIG_RAMKERNEL)
-.globl SYMBOL_NAME(interrupt_redirect_table)
-       .section .bss
-SYMBOL_NAME_LABEL(interrupt_redirect_table)
-       .space  4
-#endif
-
-       .section .text
-       .align  2
-SYMBOL_NAME_LABEL(interrupt_entry)
-       SAVE_ALL
-       mov.w   @(LCCR,sp),r0
-       btst    #4,r0l
-       bne     1f
-       mov.l   @SYMBOL_NAME(sw_usp),er0
-       mov.l   @(4:16,er0),er0
-       bra     2f
-1:
-       mov.l   @(LVEC,sp),er0
-2:
-#if defined(CONFIG_ROMKERNEL)
-       sub.l   #SYMBOL_NAME(interrupt_redirect_table),er0
-#endif
-#if defined(CONFIG_RAMKERNEL)
-       mov.l   @SYMBOL_NAME(interrupt_redirect_table),er1
-       sub.l   er1,er0
-#endif
-       shlr.l  er0
-       shlr.l  er0
-       dec.l   #1,er0
-       mov.l   sp,er1
-       subs    #4,er1                          /* adjust ret_pc */
-       jsr     @SYMBOL_NAME(do_IRQ)
-       mov.l   @SYMBOL_NAME(irq_stat)+CPUSTAT_SOFTIRQ_PENDING,er0
-       beq     1f
-       jsr     @SYMBOL_NAME(do_softirq)
-1:
-       jmp     @SYMBOL_NAME(ret_from_interrupt)
-       
-SYMBOL_NAME_LABEL(system_call)
-       subs    #4,sp                           /* dummy LVEC */
-       SAVE_ALL
-       mov.w   @(LCCR:16,sp),r1
-       bset    #4,r1l
-       ldc     r1l,ccr
-       mov.l   er0,er4
-       mov.l   #-ENOSYS,er0
-       mov.l   er0,@(LER0:16,sp)
-
-       /* save top of frame */
-       mov.l   sp,er0
-       jsr     @SYMBOL_NAME(set_esp0)
-       cmp.l   #NR_syscalls,er4
-       bcc     SYMBOL_NAME(ret_from_exception):16
-       shll.l  er4
-       shll.l  er4
-       mov.l   #SYMBOL_NAME(sys_call_table),er0
-       add.l   er4,er0
-       mov.l   @er0,er4
-       beq     SYMBOL_NAME(ret_from_exception):16      
-       mov.l   sp,er2
-       and.w   #0xe000,r2
-       mov.b   @((TASK_FLAGS+3-(TIF_SYSCALL_TRACE >> 3)):16,er2),r2l
-       btst    #(TIF_SYSCALL_TRACE & 7),r2l
-       bne     1f
-       mov.l   @(LER1:16,sp),er0
-       mov.l   @(LER2:16,sp),er1
-       mov.l   @(LER3:16,sp),er2
-       jsr     @er4
-       mov.l   er0,@(LER0:16,sp)               /* save the return value */
-#if defined(CONFIG_SYSCALL_PRINT)
-       jsr     @SYMBOL_NAME(syscall_print)
-#endif
-       bra     SYMBOL_NAME(ret_from_exception):8
-1:
-       jsr     SYMBOL_NAME(syscall_trace)
-       mov.l   @(LER1:16,sp),er0
-       mov.l   @(LER2:16,sp),er1
-       mov.l   @(LER3:16,sp),er2
-       jsr     @er4
-       mov.l   er0,@(LER0:16,sp)               /* save the return value */
-       jsr     @SYMBOL_NAME(syscall_trace)
-       bra     SYMBOL_NAME(ret_from_exception):8
-
-SYMBOL_NAME_LABEL(ret_from_fork)
-       mov.l   er2,er0
-       jsr     @SYMBOL_NAME(schedule_tail)
-       bra     SYMBOL_NAME(ret_from_exception):8
-
-SYMBOL_NAME_LABEL(reschedule)
-       /* save top of frame */
-       mov.l   sp,er0
-       jsr     @SYMBOL_NAME(set_esp0)
-       jsr     @SYMBOL_NAME(schedule)
-
-SYMBOL_NAME_LABEL(ret_from_exception)
-#if defined(CONFIG_PREEMPT)
-       orc     #0x80,ccr
-#endif
-SYMBOL_NAME_LABEL(ret_from_interrupt)
-       mov.b   @(LCCR+1:16,sp),r0l
-       btst    #4,r0l                  /* check if returning to kernel */
-       bne     done:8                  /* if so, skip resched, signals */
-       andc    #0x7f,ccr
-       mov.l   sp,er4
-       and.w   #0xe000,r4
-       mov.l   @(TI_FLAGS:16,er4),er1
-       and.l   #_TIF_WORK_MASK,er1
-       beq     done:8
-1:
-       mov.l   @(TI_FLAGS:16,er4),er1
-       btst    #TIF_NEED_RESCHED,r1l
-       bne     SYMBOL_NAME(reschedule):16
-       mov.l   sp,er0
-       subs    #4,er0                  /* adjust retpc */
-       mov.l   er2,er1
-       jsr     @SYMBOL_NAME(do_signal)
-#if defined(CONFIG_PREEMPT)
-       bra     done:8                  /* userspace thoru */
-3:
-       btst    #4,r0l
-       beq     done:8                  /* userspace thoru */
-4:
-       mov.l   @(TI_PRE_COUNT:16,er4),er1
-       bne     done:8
-       mov.l   @(TI_FLAGS:16,er4),er1
-       btst    #TIF_NEED_RESCHED,r1l
-       beq     done:8
-       mov.b   r0l,r0l
-       bpl     done:8                  /* interrupt off (exception path?) */
-       mov.l   #PREEMPT_ACTIVE,er1
-       mov.l   er1,@(TI_PRE_COUNT:16,er4)
-       andc    #0x7f,ccr
-       jsr     @SYMBOL_NAME(schedule)
-       sub.l   er1,er1
-       mov.l   er1,@(TI_PRE_COUNT:16,er4)
-       orc     #0x80,ccr
-       bra     4b:8
-#endif
-done:
-       RESTORE_ALL                     /* Does RTE */
-
-SYMBOL_NAME_LABEL(resume)
-       /*
-        * Beware - when entering resume, offset of tss is in d1,
-        * prev (the current task) is in a0, next (the new task)
-        * is in a1 and d2.b is non-zero if the mm structure is
-        * shared between the tasks, so don't change these
-        * registers until their contents are no longer needed.
-        */
-
-       /* save sr */
-       sub.w   r3,r3
-       stc     ccr,r3l
-       mov.w   r3,@(THREAD_CCR+2:16,er0)
-
-       /* disable interrupts */
-       orc     #0x80,ccr
-       mov.l   @SYMBOL_NAME(sw_usp),er3
-       mov.l   er3,@(THREAD_USP:16,er0)
-       mov.l   sp,@(THREAD_KSP:16,er0)
-
-       /* Skip address space switching if they are the same. */
-       /* FIXME: what did we hack out of here, this does nothing! */
-
-       mov.l   @(THREAD_USP:16,er1),er0
-       mov.l   er0,@SYMBOL_NAME(sw_usp)
-       mov.l   @(THREAD_KSP:16,er1),sp
-                       
-       /* restore status register */
-       mov.w   @(THREAD_CCR+2:16,er1),r3
-
-       ldc     r3l,ccr
-       rts
-       
-SYMBOL_NAME_LABEL(trace_break)
-       subs    #4,sp
-       SAVE_ALL
-       sub.l   er1,er1
-       dec.l   #1,er1
-       mov.l   er1,@(LORIG,sp) 
-       mov.l   sp,er0
-       jsr     @SYMBOL_NAME(set_esp0)
-       mov.l   @SYMBOL_NAME(sw_usp),er0
-       mov.l   @er0,er1
-       subs    #2,er1
-       mov.l   er1,@er0        
-       and.w   #0xff,e1
-       mov.l   er1,er0
-       jsr     @SYMBOL_NAME(trace_trap)
-       jmp     @SYMBOL_NAME(ret_from_exception)        
-
-       .section        .bss
-SYMBOL_NAME_LABEL(sw_ksp)
-       .space  4       
-SYMBOL_NAME_LABEL(sw_usp)
-       .space  4       
index 0847b15d42561c55878c90d8fc85e4e67ec7c717..bf1241883766a261cb4a77641ba527ee09aa3cc7 100644 (file)
@@ -4,4 +4,4 @@
 # Reuse any files we can from the H8S
 #
 
-obj-y := entry.o ints_h8s.o ptrace_h8s.o
+obj-y := ints_h8s.o ptrace_h8s.o
index b1b2b30b1b8e82910df72f8ba49227b46e1c1878..8531a540ca8c2830ccf6ebdcf6d7a7b0878f25ed 100644 (file)
@@ -1212,8 +1212,12 @@ source "drivers/Kconfig"
 
 source "fs/Kconfig"
 
-menu "Instrumentation Support"
+menuconfig INSTRUMENTATION
+       bool "Instrumentation Support"
        depends on EXPERIMENTAL
+       default y
+
+if INSTRUMENTATION
 
 source "arch/i386/oprofile/Kconfig"
 
@@ -1226,7 +1230,8 @@ config KPROBES
          a probepoint and specifies the callback.  Kprobes is useful
          for kernel debugging, non-intrusive instrumentation and testing.
          If in doubt, say "N".
-endmenu
+
+endif # INSTRUMENTATION
 
 source "arch/i386/Kconfig.debug"
 
index f74dfc419b56739f3cc7e854271f5106ef701911..82714668d43bb566ffbc56148bfa9e166d6081db 100644 (file)
@@ -168,6 +168,12 @@ page_pde_offset = (__PAGE_OFFSET >> 20);
 .section .init.text,"ax",@progbits
 #endif
 
+       /* Do an early initialization of the fixmap area */
+       movl $(swapper_pg_dir - __PAGE_OFFSET), %edx
+       movl $(swapper_pg_pmd - __PAGE_OFFSET), %eax
+       addl $0x007, %eax                       /* 0x007 = PRESENT+RW+USER */
+       movl %eax, 4092(%edx)
+
 #ifdef CONFIG_SMP
 ENTRY(startup_32_smp)
        cld
@@ -507,6 +513,8 @@ ENTRY(_stext)
 .section ".bss.page_aligned","w"
 ENTRY(swapper_pg_dir)
        .fill 1024,4,0
+ENTRY(swapper_pg_pmd)
+       .fill 1024,4,0
 ENTRY(empty_zero_page)
        .fill 4096,1,0
 
index 06dfa65ad18057bda3da9117531d440462d8786b..6c49acb9698210849ed6e74090717c7499a21562 100644 (file)
@@ -538,8 +538,31 @@ int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs)
        return 1;
 }
 
-static noinline void __switch_to_xtra(struct task_struct *next_p,
-                                   struct tss_struct *tss)
+#ifdef CONFIG_SECCOMP
+void hard_disable_TSC(void)
+{
+       write_cr4(read_cr4() | X86_CR4_TSD);
+}
+void disable_TSC(void)
+{
+       preempt_disable();
+       if (!test_and_set_thread_flag(TIF_NOTSC))
+               /*
+                * Must flip the CPU state synchronously with
+                * TIF_NOTSC in the current running context.
+                */
+               hard_disable_TSC();
+       preempt_enable();
+}
+void hard_enable_TSC(void)
+{
+       write_cr4(read_cr4() & ~X86_CR4_TSD);
+}
+#endif /* CONFIG_SECCOMP */
+
+static noinline void
+__switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p,
+                struct tss_struct *tss)
 {
        struct thread_struct *next;
 
@@ -555,6 +578,17 @@ static noinline void __switch_to_xtra(struct task_struct *next_p,
                set_debugreg(next->debugreg[7], 7);
        }
 
+#ifdef CONFIG_SECCOMP
+       if (test_tsk_thread_flag(prev_p, TIF_NOTSC) ^
+           test_tsk_thread_flag(next_p, TIF_NOTSC)) {
+               /* prev and next are different */
+               if (test_tsk_thread_flag(next_p, TIF_NOTSC))
+                       hard_disable_TSC();
+               else
+                       hard_enable_TSC();
+       }
+#endif
+
        if (!test_tsk_thread_flag(next_p, TIF_IO_BITMAP)) {
                /*
                 * Disable the bitmap via an invalid offset. We still cache
@@ -585,33 +619,6 @@ static noinline void __switch_to_xtra(struct task_struct *next_p,
        tss->x86_tss.io_bitmap_base = INVALID_IO_BITMAP_OFFSET_LAZY;
 }
 
-/*
- * This function selects if the context switch from prev to next
- * has to tweak the TSC disable bit in the cr4.
- */
-static inline void disable_tsc(struct task_struct *prev_p,
-                              struct task_struct *next_p)
-{
-       struct thread_info *prev, *next;
-
-       /*
-        * gcc should eliminate the ->thread_info dereference if
-        * has_secure_computing returns 0 at compile time (SECCOMP=n).
-        */
-       prev = task_thread_info(prev_p);
-       next = task_thread_info(next_p);
-
-       if (has_secure_computing(prev) || has_secure_computing(next)) {
-               /* slow path here */
-               if (has_secure_computing(prev) &&
-                   !has_secure_computing(next)) {
-                       write_cr4(read_cr4() & ~X86_CR4_TSD);
-               } else if (!has_secure_computing(prev) &&
-                          has_secure_computing(next))
-                       write_cr4(read_cr4() | X86_CR4_TSD);
-       }
-}
-
 /*
  *     switch_to(x,yn) should switch tasks from x to y.
  *
@@ -689,11 +696,9 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas
        /*
         * Now maybe handle debug registers and/or IO bitmaps
         */
-       if (unlikely((task_thread_info(next_p)->flags & _TIF_WORK_CTXSW)
-           || test_tsk_thread_flag(prev_p, TIF_IO_BITMAP)))
-               __switch_to_xtra(next_p, tss);
-
-       disable_tsc(prev_p, next_p);
+       if (unlikely(task_thread_info(prev_p)->flags & _TIF_WORK_CTXSW_PREV ||
+                    task_thread_info(next_p)->flags & _TIF_WORK_CTXSW_NEXT))
+               __switch_to_xtra(prev_p, next_p, tss);
 
        /*
         * Leave lazy mode, flushing any hypercalls made here.
index 90da0575fcff092a0a8cc9a1f561a3347c3c5bbf..28bd1c5163ec32f89e835e60cf16e7f713ca044e 100644 (file)
@@ -390,7 +390,7 @@ void die(const char * str, struct pt_regs * regs, long err)
                unsigned long esp;
                unsigned short ss;
 
-               report_bug(regs->eip);
+               report_bug(regs->eip, regs);
 
                printk(KERN_EMERG "%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
 #ifdef CONFIG_PREEMPT
index c05bda66236451291e51e7622682ab41593739bf..6f4d3d06f0ed00b1ebb125fd10ee6e2e398a7316 100644 (file)
@@ -261,7 +261,7 @@ elf32_set_personality (void)
 }
 
 static unsigned long
-elf32_map (struct file *filep, unsigned long addr, struct elf_phdr *eppnt, int prot, int type)
+elf32_map (struct file *filep, unsigned long addr, struct elf_phdr *eppnt, int prot, int type, unsigned long unused)
 {
        unsigned long pgoff = (eppnt->p_vaddr) & ~IA32_PAGE_MASK;
 
index 99b665e2b1d569b1e2b622c0be300be3bd3edd1b..06efd1f9b800d9d209f201515ac094c28a8a2707 100644 (file)
@@ -304,7 +304,7 @@ ia32_syscall_table:
        data8 sys_ni_syscall    /* init_module */
        data8 sys_ni_syscall    /* delete_module */
        data8 sys_ni_syscall    /* get_kernel_syms */  /* 130 */
-       data8 sys_quotactl
+       data8 sys32_quotactl
        data8 sys_getpgid
        data8 sys_fchdir
        data8 sys_ni_syscall    /* sys_bdflush */
index 188fb73c68456e3e2f1bd70e8f947b1b0754f869..4d9864cc92c90bb0fe7d31033db07bb76fbe84e4 100644 (file)
@@ -390,10 +390,6 @@ early_console_setup (char *cmdline)
        if (!efi_setup_pcdp_console(cmdline))
                earlycons++;
 #endif
-#ifdef CONFIG_SERIAL_8250_CONSOLE
-       if (!early_serial_console_init(cmdline))
-               earlycons++;
-#endif
 
        return (earlycons) ? 0 : -1;
 }
index c3bb8a755b00a3f13cdfc891a2b42ddbe0d63b63..8ccf3e47bff8a1a79254a7d9a430514d818322ef 100644 (file)
@@ -31,6 +31,9 @@ config GENERIC_IRQ_PROBE
 config NO_IOPORT
        def_bool y
 
+config NO_DMA
+       def_bool y
+
 source "init/Kconfig"
 
 
index 941955dc3b7c5bab8e8c42ee492db86891faff96..846f97534685cfb9a529486d3a4a6d37c3f5aeee 100644 (file)
@@ -377,7 +377,7 @@ unsigned long get_wchan(struct task_struct *p)
        fp = ((struct switch_stack *)p->thread.ksp)->a6;
        do {
                if (fp < stack_page+sizeof(struct thread_info) ||
-                   fp >= 8184+stack_page)
+                   fp >= THREAD_SIZE-8+stack_page)
                        return 0;
                pc = ((unsigned long *)fp)[1];
                if (!in_sched_functions(pc))
index 8133b1047353da6665fcf8966b374c6c9bbb6f44..80f4e9d74ac17c7ca55b72fa06ec21e05fe1f29c 100644 (file)
@@ -1,8 +1,8 @@
 /*
  *  linux/arch/m68knommu/kernel/setup.c
  *
- *  Copyright (C) 1999-2004  Greg Ungerer (gerg@snapgear.com)
- *  Copyright (C) 1998,1999  D. Jeff Dionne <jeff@lineo.ca>
+ *  Copyright (C) 1999-2007  Greg Ungerer (gerg@snapgear.com)
+ *  Copyright (C) 1998,1999  D. Jeff Dionne <jeff@uClinux.org>
  *  Copyleft  ()) 2000       James D. Schettine {james@telos-systems.com}
  *  Copyright (C) 1998       Kenneth Albanowski <kjahds@kjahds.com>
  *  Copyright (C) 1995       Hamish Macdonald
 #include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
-#include <linux/fs.h>
 #include <linux/fb.h>
 #include <linux/module.h>
 #include <linux/console.h>
-#include <linux/genhd.h>
 #include <linux/errno.h>
 #include <linux/string.h>
-#include <linux/major.h>
 #include <linux/bootmem.h>
 #include <linux/seq_file.h>
-#include <linux/root_dev.h>
 #include <linux/init.h>
 
 #include <asm/setup.h>
@@ -46,34 +42,19 @@ EXPORT_SYMBOL(memory_end);
 
 char __initdata command_line[COMMAND_LINE_SIZE];
 
-/* setup some dummy routines */
-static void dummy_waitbut(void)
-{
-}
+void (*mach_trap_init)(void);
 
-void (*mach_sched_init) (irq_handler_t handler);
-void (*mach_tick)( void );
-/* machine dependent keyboard functions */
-int (*mach_keyb_init) (void);
-int (*mach_kbdrate) (struct kbd_repeat *);
-void (*mach_kbd_leds) (unsigned int);
-/* machine dependent irq functions */
-void (*mach_init_IRQ) (void);
-irq_handler_t mach_default_handler;
-int (*mach_get_irq_list) (struct seq_file *, void *);
-void (*mach_process_int) (int irq, struct pt_regs *fp);
-void (*mach_trap_init) (void);
 /* machine dependent timer functions */
-unsigned long (*mach_gettimeoffset) (void);
-void (*mach_gettod) (int*, int*, int*, int*, int*, int*);
-int (*mach_hwclk) (int, struct rtc_time*);
-int (*mach_set_clock_mmss) (unsigned long);
-void (*mach_mksound)( unsigned int count, unsigned int ticks );
-void (*mach_reset)( void );
-void (*waitbut)(void) = dummy_waitbut;
-void (*mach_debug_init)(void);
-void (*mach_halt)( void );
-void (*mach_power_off)( void );
+void (*mach_sched_init)(irq_handler_t handler);
+void (*mach_tick)(void);
+void (*mach_gettod)(int*, int*, int*, int*, int*, int*);
+int (*mach_set_clock_mmss)(unsigned long);
+unsigned long (*mach_gettimeoffset)(void);
+
+/* machine dependent reboot functions */
+void (*mach_reset)(void);
+void (*mach_halt)(void);
+void (*mach_power_off)(void);
 
 
 #ifdef CONFIG_M68000
@@ -134,13 +115,6 @@ void (*mach_power_off)( void );
        #define CPU "UNKNOWN"
 #endif
 
-/* (es) */
-/* note: why is this defined here?  the must be a better place to put this */
-#if defined( CONFIG_TELOS) || defined( CONFIG_UCDIMM ) || defined( CONFIG_UCSIMM ) || defined(CONFIG_DRAGEN2) || (defined( CONFIG_PILOT ) && defined( CONFIG_M68328 ))
-#define CAT_ROMARRAY
-#endif
-/* (/es) */
-
 extern int _stext, _etext, _sdata, _edata, _sbss, _ebss, _end;
 extern int _ramstart, _ramend;
 
@@ -148,15 +122,8 @@ void setup_arch(char **cmdline_p)
 {
        int bootmap_size;
 
-#if defined(CAT_ROMARRAY) && defined(DEBUG)
-       extern int __data_rom_start;
-       extern int __data_start;
-       int *romarray = (int *)((int) &__data_rom_start +
-                             (int)&_edata - (int)&__data_start);
-#endif
-
        memory_start = PAGE_ALIGN(_ramstart);
-       memory_end = _ramend; /* by now the stack is part of the init task */
+       memory_end = _ramend;
 
        init_mm.start_code = (unsigned long) &_stext;
        init_mm.end_code = (unsigned long) &_etext;
@@ -220,11 +187,7 @@ void setup_arch(char **cmdline_p)
                (int) &_sbss, (int) &_ebss);
        printk(KERN_DEBUG "KERNEL -> ROMFS=0x%06x-0x%06x MEM=0x%06x-0x%06x "
                "STACK=0x%06x-0x%06x\n",
-#ifdef CAT_ROMARRAY
-               (int) romarray, ((int) romarray) + romarray[2],
-#else
                (int) &_ebss, (int) memory_start,
-#endif
                (int) memory_start, (int) memory_end,
                (int) memory_end, (int) _ramend);
 #endif
index 411e45248e5caf9f164e53300bc346a90883a1fc..1a66b71035a46a71ff65de663cb21186f3c72b3d 100644 (file)
 #include <linux/types.h>
 #include <linux/slab.h>
 
-#include <asm/setup.h>
 #include <asm/segment.h>
 #include <asm/page.h>
 #include <asm/pgtable.h>
 #include <asm/system.h>
-#include <asm/traps.h>
-#include <asm/io.h>
 
 /*
- * cache_clear() semantics: Clear any cache entries for the area in question,
- * without writing back dirty entries first. This is useful if the data will
- * be overwritten anyway, e.g. by DMA to memory. The range is defined by a
- * _physical_ address.
- */
-
-void cache_clear (unsigned long paddr, int len)
-{
-}
-
-
-/*
- *     Define cache invalidate functions. The ColdFire 5407 is really
- *     the only processor that needs to do some work here. Anything
- *     that has separate data and instruction caches will be a problem.
- */
-#ifdef CONFIG_M5407
-
-static __inline__ void cache_invalidate_lines(unsigned long paddr, int len)
-{
-       unsigned long   sset, eset;
-
-       sset = (paddr & 0x00000ff0);
-       eset = ((paddr + len) & 0x0000ff0) + 0x10;
-
-       __asm__ __volatile__ (
-               "nop\n\t"
-               "clrl   %%d0\n\t"
-               "1:\n\t"
-               "movel  %0,%%a0\n\t"
-               "addl   %%d0,%%a0\n\t"
-               "2:\n\t"
-               ".word  0xf4e8\n\t"
-               "addl   #0x10,%%a0\n\t"
-               "cmpl   %1,%%a0\n\t"
-               "blt    2b\n\t"
-               "addql  #1,%%d0\n\t"
-               "cmpil  #4,%%d0\n\t"
-               "bne    1b"
-               : : "a" (sset), "a" (eset) : "d0", "a0" );
-}
-
-#else
-#define        cache_invalidate_lines(a,b)
-#endif
-
-
-/*
- * cache_push() semantics: Write back any dirty cache data in the given area,
- * and invalidate the range in the instruction cache. It needs not (but may)
- * invalidate those entries also in the data cache. The range is defined by a
- * _physical_ address.
- */
-
-void cache_push (unsigned long paddr, int len)
-{
-       cache_invalidate_lines(paddr, len);
-}
-
-
-/*
- * cache_push_v() semantics: Write back any dirty cache data in the given
- * area, and invalidate those entries at least in the instruction cache. This
- * is intended to be used after data has been written that can be executed as
- * code later. The range is defined by a _user_mode_ _virtual_ address  (or,
- * more exactly, the space is defined by the %sfc/%dfc register.)
- */
-
-void cache_push_v (unsigned long vaddr, int len)
-{
-       cache_invalidate_lines(vaddr, len);
-}
-
-/* Map some physical address range into the kernel address space. The
- * code is copied and adapted from map_chunk().
+ * Map some physical address range into the kernel address space.
+ * The code is copied and adapted from map_chunk().
  */
 
 unsigned long kernel_map(unsigned long paddr, unsigned long size,
index c3ec9f1ec0f3462d8d0cd3b81824c8bc9a61d8d2..f9bca2d74b38092b47821d2aa8ea5d9096fa9f1a 100644 (file)
@@ -302,7 +302,7 @@ static void handle_break(struct pt_regs *regs)
        if (unlikely(iir == PARISC_BUG_BREAK_INSN && !user_mode(regs))) {
                /* check if a BUG() or WARN() trapped here.  */
                enum bug_trap_type tt;
-               tt = report_bug(regs->iaoq[0] & ~3);
+               tt = report_bug(regs->iaoq[0] & ~3, regs);
                if (tt == BUG_TRAP_TYPE_WARN) {
                        regs->iaoq[0] += 4;
                        regs->iaoq[1] += 4;
index 6beee32144c02e45456c5e8c037e8630b1b6f7bb..6b8b83ebca7539c1d4bd8d5c8ef504bde6e3a27c 100644 (file)
@@ -66,6 +66,9 @@ config GENERIC_FIND_NEXT_BIT
        bool
        default y
 
+config ARCH_NO_VIRT_TO_BUS
+       def_bool PPC64
+
 config PPC
        bool
        default y
index bf6445ac9f1cb38494b5e843e186aaf633a6703d..3b8427e6283ddd4e84cc868fbef316534ce839fd 100644 (file)
@@ -777,7 +777,7 @@ void __kprobes program_check_exception(struct pt_regs *regs)
                        return;
 
                if (!(regs->msr & MSR_PR) &&  /* not user-mode */
-                   report_bug(regs->nip) == BUG_TRAP_TYPE_WARN) {
+                   report_bug(regs->nip, regs) == BUG_TRAP_TYPE_WARN) {
                        regs->nip += 4;
                        return;
                }
index aea100be52c8ba8f6b48431fa0a2ce72406c6492..0eaef7c8378b0a27ae9938170e6a726e59f20870 100644 (file)
@@ -619,7 +619,7 @@ void program_check_exception(struct pt_regs *regs)
                        return;
 
                if (!(regs->msr & MSR_PR) &&  /* not user-mode */
-                   report_bug(regs->nip) == BUG_TRAP_TYPE_WARN) {
+                   report_bug(regs->nip, regs) == BUG_TRAP_TYPE_WARN) {
                        regs->nip += 4;
                        return;
                }
index ee9186f8fb0877e3cac9cc0112a54e7046b5f1e1..81e03b9c384116553c168052283e50d3237e1e17 100644 (file)
@@ -319,7 +319,7 @@ static void __kprobes inline do_trap(long interruption_code, int signr,
                else {
                        enum bug_trap_type btt;
 
-                       btt = report_bug(regs->psw.addr & PSW_ADDR_INSN);
+                       btt = report_bug(regs->psw.addr & PSW_ADDR_INSN, regs);
                        if (btt == BUG_TRAP_TYPE_WARN)
                                return;
                        die(str, regs, interruption_code);
index 038179ecf6a904dd03fe65f9ab1d0654d4e2427a..d8ed6676ae86c378cdadd5c7296154cbdc8d84be 100644 (file)
@@ -55,8 +55,21 @@ config GENERIC_TIME
 config GENERIC_CLOCKEVENTS
        def_bool n
 
+config SYS_SUPPORTS_PM
+       bool
+
 config SYS_SUPPORTS_APM_EMULATION
        bool
+       select SYS_SUPPORTS_PM
+
+config SYS_SUPPORTS_SMP
+       bool
+
+config SYS_SUPPORTS_NUMA
+       bool
+
+config SYS_SUPPORTS_PCI
+       bool
 
 config ARCH_MAY_HAVE_PC_FDC
        bool
@@ -81,24 +94,146 @@ source "init/Kconfig"
 
 menu "System type"
 
-config SOLUTION_ENGINE
-       bool
+source "arch/sh/mm/Kconfig"
+
+menu "Processor features"
 
 choice
-       prompt "SuperH system type"
-       default SH_UNKNOWN
+       prompt "Endianess selection" 
+       default CPU_LITTLE_ENDIAN
+       help
+         Some SuperH machines can be configured for either little or big
+         endian byte order. These modes require different kernels.
+
+config CPU_LITTLE_ENDIAN
+       bool "Little Endian"
+
+config CPU_BIG_ENDIAN
+       bool "Big Endian"
+
+endchoice
+
+config SH_FPU
+       bool "FPU support"
+       depends on CPU_SH4
+       default y
+       help
+         Selecting this option will enable support for SH processors that
+         have FPU units (ie, SH77xx).
+
+         This option must be set in order to enable the FPU.
+
+config SH_FPU_EMU
+       bool "FPU emulation support"
+       depends on !SH_FPU && EXPERIMENTAL
+       default n
+       help
+         Selecting this option will enable support for software FPU emulation.
+         Most SH-3 users will want to say Y here, whereas most SH-4 users will
+         want to say N.
+
+config SH_DSP
+       bool "DSP support"
+       default y if SH4AL_DSP || !CPU_SH4
+       default n
+       help
+         Selecting this option will enable support for SH processors that
+         have DSP units (ie, SH2-DSP, SH3-DSP, and SH4AL-DSP).
+
+         This option must be set in order to enable the DSP.
+
+config SH_ADC
+       bool "ADC support"
+       depends on CPU_SH3
+       default y
+       help
+         Selecting this option will allow the Linux kernel to use SH3 on-chip
+         ADC module.
+
+         If unsure, say N.
+
+config SH_STORE_QUEUES
+       bool "Support for Store Queues"
+       depends on CPU_SH4
+       help
+         Selecting this option will enable an in-kernel API for manipulating
+         the store queues integrated in the SH-4 processors.
+
+config SPECULATIVE_EXECUTION
+       bool "Speculative subroutine return"
+       depends on CPU_SUBTYPE_SH7780 && EXPERIMENTAL
+       help
+         This enables support for a speculative instruction fetch for
+         subroutine return. There are various pitfalls associated with
+         this, as outlined in the SH7780 hardware manual.
+
+         If unsure, say N.
+
+config CPU_HAS_INTEVT
+       bool
+
+config CPU_HAS_PINT_IRQ
+       bool
+
+config CPU_HAS_MASKREG_IRQ
+       bool
+
+config CPU_HAS_INTC2_IRQ
+       bool
+
+config CPU_HAS_IPR_IRQ
+       bool
+
+config CPU_HAS_SR_RB
+       bool "CPU has SR.RB"
+       depends on CPU_SH3 || CPU_SH4
+       default y
+       help
+         This will enable the use of SR.RB register bank usage. Processors
+         that are lacking this bit must have another method in place for
+         accomplishing what is taken care of by the banked registers.
+
+         See <file:Documentation/sh/register-banks.txt> for further
+         information on SR.RB and register banking in the kernel in general.
+
+config CPU_HAS_PTEA
+       bool
+
+endmenu
+
+menu "Board support"
+
+config SOLUTION_ENGINE
+       bool
 
 config SH_SOLUTION_ENGINE
        bool "SolutionEngine"
        select SOLUTION_ENGINE
+       depends on CPU_SUBTYPE_SH7709 || CPU_SUBTYPE_SH7750
        help
          Select SolutionEngine if configuring for a Hitachi SH7709
          or SH7750 evaluation board.
 
+config SH_7206_SOLUTION_ENGINE
+       bool "SolutionEngine7206"
+       select SOLUTION_ENGINE
+       depends on CPU_SUBTYPE_SH7206
+       help
+         Select 7206 SolutionEngine if configuring for a Hitachi SH7206
+         evaluation board.
+
+config SH_7619_SOLUTION_ENGINE
+       bool "SolutionEngine7619"
+       select SOLUTION_ENGINE
+       depends on CPU_SUBTYPE_SH7619
+       help
+         Select 7619 SolutionEngine if configuring for a Hitachi SH7619
+         evaluation board.
+       
 config SH_7722_SOLUTION_ENGINE
        bool "SolutionEngine7722"
        select SOLUTION_ENGINE
-       select CPU_SUBTYPE_SH7722
+       depends on CPU_SUBTYPE_SH7722
        help
          Select 7722 SolutionEngine if configuring for a Hitachi SH772
          evaluation board.
@@ -106,7 +241,7 @@ config SH_7722_SOLUTION_ENGINE
 config SH_7751_SOLUTION_ENGINE
        bool "SolutionEngine7751"
        select SOLUTION_ENGINE
-       select CPU_SUBTYPE_SH7751
+       depends on CPU_SUBTYPE_SH7751
        help
          Select 7751 SolutionEngine if configuring for a Hitachi SH7751
          evaluation board.
@@ -114,7 +249,8 @@ config SH_7751_SOLUTION_ENGINE
 config SH_7780_SOLUTION_ENGINE
        bool "SolutionEngine7780"
        select SOLUTION_ENGINE
-       select CPU_SUBTYPE_SH7780
+       select SYS_SUPPORTS_PCI
+       depends on CPU_SUBTYPE_SH7780
        help
          Select 7780 SolutionEngine if configuring for a Renesas SH7780
          evaluation board.
@@ -122,7 +258,7 @@ config SH_7780_SOLUTION_ENGINE
 config SH_7300_SOLUTION_ENGINE
        bool "SolutionEngine7300"
        select SOLUTION_ENGINE
-       select CPU_SUBTYPE_SH7300
+       depends on CPU_SUBTYPE_SH7300
        help
          Select 7300 SolutionEngine if configuring for a Hitachi
          SH7300(SH-Mobile V) evaluation board.
@@ -130,22 +266,22 @@ config SH_7300_SOLUTION_ENGINE
 config SH_7343_SOLUTION_ENGINE
        bool "SolutionEngine7343"
        select SOLUTION_ENGINE
-       select CPU_SUBTYPE_SH7343
+       depends on CPU_SUBTYPE_SH7343
        help
          Select 7343 SolutionEngine if configuring for a Hitachi
          SH7343 (SH-Mobile 3AS) evaluation board.
 
 config SH_73180_SOLUTION_ENGINE
-       bool "SolutionEngine73180"
+       bool "SolutionEngine73180"
        select SOLUTION_ENGINE
-       select CPU_SUBTYPE_SH73180
+       depends on CPU_SUBTYPE_SH73180
        help
          Select 73180 SolutionEngine if configuring for a Hitachi
          SH73180(SH-Mobile 3) evaluation board.
 
 config SH_7751_SYSTEMH
        bool "SystemH7751R"
-       select CPU_SUBTYPE_SH7751R
+       depends on CPU_SUBTYPE_SH7751R
        help
          Select SystemH if you are configuring for a Renesas SystemH
          7751R evaluation board.
@@ -153,20 +289,17 @@ config SH_7751_SYSTEMH
 config SH_HP6XX
        bool "HP6XX"
        select SYS_SUPPORTS_APM_EMULATION
+       select HD6446X_SERIES
+       depends on CPU_SUBTYPE_SH7709
        help
          Select HP6XX if configuring for a HP jornada HP6xx.
          More information (hardware only) at
          <http://www.hp.com/jornada/>.
 
-config SH_SATURN
-       bool "Saturn"
-       select CPU_SUBTYPE_SH7604
-       help
-         Select Saturn if configuring for a SEGA Saturn.
-
 config SH_DREAMCAST
        bool "Dreamcast"
-       select CPU_SUBTYPE_SH7091
+       select SYS_SUPPORTS_PCI
+       depends on CPU_SUBTYPE_SH7091
        help
          Select Dreamcast if configuring for a SEGA Dreamcast.
          More information at
@@ -175,6 +308,7 @@ config SH_DREAMCAST
 
 config SH_MPC1211
        bool "Interface MPC1211"
+       depends on CPU_SUBTYPE_SH7751 && BROKEN
        help
          CTP/PCI-SH02 is a CPU module computer that is produced
          by Interface Corporation.
@@ -182,6 +316,8 @@ config SH_MPC1211
 
 config SH_SH03
        bool "Interface CTP/PCI-SH03"
+       depends on CPU_SUBTYPE_SH7751 && BROKEN
+       select SYS_SUPPORTS_PCI
        help
          CTP/PCI-SH03 is a CPU module computer that is produced
          by Interface Corporation.
@@ -189,7 +325,8 @@ config SH_SH03
 
 config SH_SECUREEDGE5410
        bool "SecureEdge5410"
-       select CPU_SUBTYPE_SH7751R
+       depends on CPU_SUBTYPE_SH7751R
+       select SYS_SUPPORTS_PCI
        help
          Select SecureEdge5410 if configuring for a SnapGear SH board.
          This includes both the OEM SecureEdge products as well as the
@@ -197,246 +334,76 @@ config SH_SECUREEDGE5410
 
 config SH_HS7751RVOIP
        bool "HS7751RVOIP"
-       select CPU_SUBTYPE_SH7751R
+       depends on CPU_SUBTYPE_SH7751R
        help
          Select HS7751RVOIP if configuring for a Renesas Technology
          Sales VoIP board.
 
 config SH_7710VOIPGW
        bool "SH7710-VOIP-GW"
-       select CPU_SUBTYPE_SH7710
+       depends on CPU_SUBTYPE_SH7710
        help
          Select this option to build a kernel for the SH7710 based
          VOIP GW.
 
 config SH_RTS7751R2D
        bool "RTS7751R2D"
-       select CPU_SUBTYPE_SH7751R
+       depends on CPU_SUBTYPE_SH7751R
+       select SYS_SUPPORTS_PCI
        help
          Select RTS7751R2D if configuring for a Renesas Technology
          Sales SH-Graphics board.
 
 config SH_HIGHLANDER
        bool "Highlander"
+       depends on CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785
+       select SYS_SUPPORTS_PCI
 
 config SH_EDOSK7705
        bool "EDOSK7705"
-       select CPU_SUBTYPE_SH7705
+       depends on CPU_SUBTYPE_SH7705
 
 config SH_SH4202_MICRODEV
        bool "SH4-202 MicroDev"
-       select CPU_SUBTYPE_SH4_202
+       depends on CPU_SUBTYPE_SH4_202
        help
          Select SH4-202 MicroDev if configuring for a SuperH MicroDev board
          with an SH4-202 CPU.
 
 config SH_LANDISK
        bool "LANDISK"
-       select CPU_SUBTYPE_SH7751R
+       depends on CPU_SUBTYPE_SH7751R
+       select SYS_SUPPORTS_PCI
        help
          I-O DATA DEVICE, INC. "LANDISK Series" support.
 
 config SH_TITAN
        bool "TITAN"
-       select CPU_SUBTYPE_SH7751R
+       depends on CPU_SUBTYPE_SH7751R
+       select SYS_SUPPORTS_PCI
        help
          Select Titan if you are configuring for a Nimble Microsystems
          NetEngine NP51R.
 
 config SH_SHMIN
        bool "SHMIN"
-       select CPU_SUBTYPE_SH7706
+       depends on CPU_SUBTYPE_SH7706
        help
          Select SHMIN if configuring for the SHMIN board.
 
-config SH_7206_SOLUTION_ENGINE
-       bool "SolutionEngine7206"
-       select CPU_SUBTYPE_SH7206
-       help
-         Select 7206 SolutionEngine if configuring for a Hitachi SH7206
-         evaluation board.
-
-config SH_7619_SOLUTION_ENGINE
-       bool "SolutionEngine7619"
-       select CPU_SUBTYPE_SH7619
-       help
-         Select 7619 SolutionEngine if configuring for a Hitachi SH7619
-         evaluation board.
-       
 config SH_LBOX_RE2
        bool "L-BOX RE2"
-       select CPU_SUBTYPE_SH7751R
+       depends on CPU_SUBTYPE_SH7751R
+       select SYS_SUPPORTS_PCI
        help
          Select L-BOX RE2 if configuring for the NTT COMWARE L-BOX RE2.
 
-config SH_UNKNOWN
-       bool "BareCPU"
-       help
-         "Bare CPU" aka "unknown" means an SH-based system which is not one
-         of the specific ones mentioned above, which means you need to enter
-         all sorts of stuff like CONFIG_MEMORY_START because the config
-         system doesn't already know what it is.  You get a machine vector
-         without any platform-specific code in it, so things like the RTC may
-         not work.
-
-         This option is for the early stages of porting to a new machine.
-
-endchoice
+endmenu
 
 source "arch/sh/boards/renesas/hs7751rvoip/Kconfig"
 source "arch/sh/boards/renesas/rts7751r2d/Kconfig"
 source "arch/sh/boards/renesas/r7780rp/Kconfig"
 
-source "arch/sh/mm/Kconfig"
-
-config CF_ENABLER
-       bool "Compact Flash Enabler support"
-       depends on SH_SOLUTION_ENGINE || SH_UNKNOWN || SH_SH03
-       ---help---
-         Compact Flash is a small, removable mass storage device introduced
-         in 1994 originally as a PCMCIA device.  If you say `Y' here, you
-         compile in support for Compact Flash devices directly connected to
-         a SuperH processor.  A Compact Flash FAQ is available at
-         <http://www.compactflash.org/faqs/faq.htm>.
-
-         If your board has "Directly Connected" CompactFlash at area 5 or 6,
-         you may want to enable this option.  Then, you can use CF as
-         primary IDE drive (only tested for SanDisk).
-
-         If in doubt, select 'N'.
-
-choice
-       prompt "Compact Flash Connection Area"
-       depends on CF_ENABLER
-       default CF_AREA6
-
-config CF_AREA5
-       bool "Area5"
-       help
-         If your board has "Directly Connected" CompactFlash, You should
-         select the area where your CF is connected to.
-
-         - "Area5" if CompactFlash is connected to Area 5 (0x14000000)
-         - "Area6" if it is connected to Area 6 (0x18000000)
-
-         "Area6" will work for most boards.
-
-config CF_AREA6
-       bool "Area6"
-
-endchoice
-
-config CF_BASE_ADDR
-       hex
-       depends on CF_ENABLER
-       default "0xb8000000" if CF_AREA6
-       default "0xb4000000" if CF_AREA5
-
-menu "Processor features"
-
-choice
-       prompt "Endianess selection" 
-       default CPU_LITTLE_ENDIAN
-       help
-         Some SuperH machines can be configured for either little or big
-         endian byte order. These modes require different kernels.
-
-config CPU_LITTLE_ENDIAN
-       bool "Little Endian"
-
-config CPU_BIG_ENDIAN
-       bool "Big Endian"
-
-endchoice
-
-config SH_FPU
-       bool "FPU support"
-       depends on !CPU_SH3
-       default y
-       help
-         Selecting this option will enable support for SH processors that
-         have FPU units (ie, SH77xx).
-
-         This option must be set in order to enable the FPU.
-
-config SH_FPU_EMU
-       bool "FPU emulation support"
-       depends on !SH_FPU && EXPERIMENTAL
-       default n
-       help
-         Selecting this option will enable support for software FPU emulation.
-         Most SH-3 users will want to say Y here, whereas most SH-4 users will
-         want to say N.
-
-config SH_DSP
-       bool "DSP support"
-       default y if SH4AL_DSP || !CPU_SH4
-       default n
-       help
-         Selecting this option will enable support for SH processors that
-         have DSP units (ie, SH2-DSP, SH3-DSP, and SH4AL-DSP).
-
-         This option must be set in order to enable the DSP.
-
-config SH_ADC
-       bool "ADC support"
-       depends on CPU_SH3
-       default y
-       help
-         Selecting this option will allow the Linux kernel to use SH3 on-chip
-         ADC module.
-
-         If unsure, say N.
-
-config SH_STORE_QUEUES
-       bool "Support for Store Queues"
-       depends on CPU_SH4
-       help
-         Selecting this option will enable an in-kernel API for manipulating
-         the store queues integrated in the SH-4 processors.
-
-config SPECULATIVE_EXECUTION
-       bool "Speculative subroutine return"
-       depends on CPU_SUBTYPE_SH7780 && EXPERIMENTAL
-       help
-         This enables support for a speculative instruction fetch for
-         subroutine return. There are various pitfalls associated with
-         this, as outlined in the SH7780 hardware manual.
-
-         If unsure, say N.
-
-config CPU_HAS_INTEVT
-       bool
-
-config CPU_HAS_PINT_IRQ
-       bool
-
-config CPU_HAS_MASKREG_IRQ
-       bool
-
-config CPU_HAS_INTC2_IRQ
-       bool
-
-config CPU_HAS_IPR_IRQ
-       bool
-
-config CPU_HAS_SR_RB
-       bool "CPU has SR.RB"
-       depends on CPU_SH3 || CPU_SH4
-       default y
-       help
-         This will enable the use of SR.RB register bank usage. Processors
-         that are lacking this bit must have another method in place for
-         accomplishing what is taken care of by the banked registers.
-
-         See <file:Documentation/sh/register-banks.txt> for further
-         information on SR.RB and register banking in the kernel in general.
-
-config CPU_HAS_PTEA
-       bool
-
-endmenu
-
 menu "Timer and clock configuration"
 
 config SH_TMU
@@ -473,13 +440,13 @@ config SH_PCLK_FREQ
        int "Peripheral clock frequency (in Hz)"
        default "27000000" if CPU_SUBTYPE_SH73180 || CPU_SUBTYPE_SH7343
        default "31250000" if CPU_SUBTYPE_SH7619
+       default "32000000" if CPU_SUBTYPE_SH7722
        default "33333333" if CPU_SUBTYPE_SH7300 || CPU_SUBTYPE_SH7770 || \
                              CPU_SUBTYPE_SH7760 || CPU_SUBTYPE_SH7705 || \
                              CPU_SUBTYPE_SH7206
-       default "50000000" if CPU_SUBTYPE_SH7750 || CPU_SUBTYPE_SH7780 || \
-                             CPU_SUBTYPE_SH7785
-       default "60000000" if CPU_SUBTYPE_SH7751
+       default "60000000" if CPU_SUBTYPE_SH7751 || CPU_SUBTYPE_SH7751R
        default "66000000" if CPU_SUBTYPE_SH4_202
+       default "50000000"
        help
          This option is used to specify the peripheral clock frequency.
          This is necessary for determining the reference clock value on
@@ -487,8 +454,10 @@ config SH_PCLK_FREQ
 
 config SH_CLK_MD
        int "CPU Mode Pin Setting"
-       default 0
        depends on CPU_SUBTYPE_SH7619 || CPU_SUBTYPE_SH7206
+       default 6 if CPU_SUBTYPE_SH7206
+       default 5 if CPU_SUBTYPE_SH7619
+       default 0
        help
          MD2 - MD0 pin setting.
 
@@ -560,6 +529,7 @@ config CRASH_DUMP
 
 config SMP
        bool "Symmetric multi-processing support"
+       depends on SYS_SUPPORTS_SMP
        ---help---
          This enables support for systems with more than one CPU. If you have
          a system with only one CPU, like most personal computers, say N. If
@@ -584,6 +554,7 @@ config NR_CPUS
        int "Maximum number of CPUs (2-32)"
        range 2 32
        depends on SMP
+       default "4" if CPU_SHX3
        default "2"
        help
          This allows you to specify the maximum number of CPUs which this
@@ -623,6 +594,7 @@ config BOOT_LINK_OFFSET
 
 config UBC_WAKEUP
        bool "Wakeup UBC on startup"
+       depends on CPU_SH4
        help
          Selecting this option will wakeup the User Break Controller (UBC) on
          startup. Although the UBC is left in an awake state when the processor
@@ -651,8 +623,8 @@ menu "Bus options"
 # we're not using PCMCIA, so we make it dependent on
 # PCMCIA outright. -- PFM.
 config ISA
-       bool
-       default y if PCMCIA
+       def_bool y
+       depends on PCMCIA && HD6446X_SERIES
        help
          Find out whether you have ISA slots on your motherboard.  ISA is the
          name of a bus system, i.e. the way the CPU talks to the other stuff
@@ -690,6 +662,49 @@ config SUPERHYWAY
        tristate "SuperHyway Bus support"
        depends on CPU_SUBTYPE_SH4_202
 
+config CF_ENABLER
+       bool "Compact Flash Enabler support"
+       depends on SOLUTION_ENGINE || SH_SH03
+       ---help---
+         Compact Flash is a small, removable mass storage device introduced
+         in 1994 originally as a PCMCIA device.  If you say `Y' here, you
+         compile in support for Compact Flash devices directly connected to
+         a SuperH processor.  A Compact Flash FAQ is available at
+         <http://www.compactflash.org/faqs/faq.htm>.
+
+         If your board has "Directly Connected" CompactFlash at area 5 or 6,
+         you may want to enable this option.  Then, you can use CF as
+         primary IDE drive (only tested for SanDisk).
+
+         If in doubt, select 'N'.
+
+choice
+       prompt "Compact Flash Connection Area"
+       depends on CF_ENABLER
+       default CF_AREA6
+
+config CF_AREA5
+       bool "Area5"
+       help
+         If your board has "Directly Connected" CompactFlash, You should
+         select the area where your CF is connected to.
+
+         - "Area5" if CompactFlash is connected to Area 5 (0x14000000)
+         - "Area6" if it is connected to Area 6 (0x18000000)
+
+         "Area6" will work for most boards.
+
+config CF_AREA6
+       bool "Area6"
+
+endchoice
+
+config CF_BASE_ADDR
+       hex
+       depends on CF_ENABLER
+       default "0xb8000000" if CF_AREA6
+       default "0xb4000000" if CF_AREA5
+
 source "arch/sh/drivers/pci/Kconfig"
 
 source "drivers/pci/Kconfig"
@@ -707,7 +722,7 @@ source "fs/Kconfig.binfmt"
 endmenu
 
 menu "Power management options (EXPERIMENTAL)"
-depends on EXPERIMENTAL
+depends on EXPERIMENTAL && SYS_SUPPORTS_PM
 
 source kernel/power/Kconfig
 
index b56307294b6764933deeb82284c8ea6617dc6e8c..52f6a99c8ecc6064ebbe6b50dfd2d262d2d15cd5 100644 (file)
@@ -52,6 +52,10 @@ config EARLY_PRINTK
          select both the EARLY_SCIF_CONSOLE and SH_STANDARD_BIOS, using
          the kernel command line option to toggle back and forth.
 
+config DEBUG_BOOTMEM
+       depends on DEBUG_KERNEL
+       bool "Debug BOOTMEM initialization"
+
 config DEBUG_STACKOVERFLOW
        bool "Check for stack overflows"
        depends on DEBUG_KERNEL
@@ -82,6 +86,7 @@ config SH_KGDB
        bool "Include KGDB kernel debugger"
        select FRAME_POINTER
        select DEBUG_INFO
+       depends on CPU_SH3 || CPU_SH4
        help
          Include in-kernel hooks for kgdb, the Linux kernel source level
          debugger.  See <http://kgdb.sourceforge.net/> for more information.
index 883b03b040c455c471c704e605c62e8163c607e1..77fecc62a056ebec0e776e33d2b41d437a790b66 100644 (file)
@@ -34,20 +34,20 @@ isa-y                       := $(isa-y)-nofpu
 endif
 endif
 
-cflags-$(CONFIG_CPU_SH2)               := -m2
-cflags-$(CONFIG_CPU_SH2A)              := -m2a $(call cc-option,-m2a-nofpu,)
-cflags-$(CONFIG_CPU_SH3)               := -m3
-cflags-$(CONFIG_CPU_SH4)               := -m4 \
+cflags-$(CONFIG_CPU_SH2)               := $(call cc-option,-m2,)
+cflags-$(CONFIG_CPU_SH2A)              += $(call cc-option,-m2a,) \
+                                          $(call cc-option,-m2a-nofpu,)
+cflags-$(CONFIG_CPU_SH3)               := $(call cc-option,-m3,)
+cflags-$(CONFIG_CPU_SH4)               := $(call cc-option,-m4,) \
        $(call cc-option,-mno-implicit-fp,-m4-nofpu)
-cflags-$(CONFIG_CPU_SH4A)              := $(call cc-option,-m4a,) $(call cc-option,-m4a-nofpu,)
+cflags-$(CONFIG_CPU_SH4A)              += $(call cc-option,-m4a,) \
+                                          $(call cc-option,-m4a-nofpu,)
 
 cflags-$(CONFIG_CPU_BIG_ENDIAN)                += -mb
 cflags-$(CONFIG_CPU_LITTLE_ENDIAN)     += -ml
 
 cflags-y       += $(call as-option,-Wa$(comma)-isa=$(isa-y),) -ffreestanding
 
-cflags-$(CONFIG_SH_DSP)                        += -Wa,-dsp
-
 cflags-$(CONFIG_MORE_COMPILE_OPTIONS)  += \
        $(shell echo $(CONFIG_COMPILE_OPTIONS) | sed -e 's/"//g')
 
@@ -87,39 +87,37 @@ core-y                              += arch/sh/kernel/ arch/sh/mm/
 core-$(CONFIG_SH_FPU_EMU)      += arch/sh/math-emu/
 
 # Boards
-machdir-$(CONFIG_SH_SOLUTION_ENGINE)           := se/770x
-machdir-$(CONFIG_SH_7722_SOLUTION_ENGINE)      := se/7722
-machdir-$(CONFIG_SH_7751_SOLUTION_ENGINE)      := se/7751
-machdir-$(CONFIG_SH_7780_SOLUTION_ENGINE)      := se/7780
-machdir-$(CONFIG_SH_7300_SOLUTION_ENGINE)      := se/7300
-machdir-$(CONFIG_SH_7343_SOLUTION_ENGINE)      := se/7343
-machdir-$(CONFIG_SH_73180_SOLUTION_ENGINE)     := se/73180
-machdir-$(CONFIG_SH_HP6XX)                     := hp6xx
-machdir-$(CONFIG_SH_SATURN)                    := saturn
-machdir-$(CONFIG_SH_DREAMCAST)                 := dreamcast
-machdir-$(CONFIG_SH_MPC1211)                   := mpc1211
-machdir-$(CONFIG_SH_SH03)                      := sh03
-machdir-$(CONFIG_SH_SECUREEDGE5410)            := snapgear
-machdir-$(CONFIG_SH_HS7751RVOIP)               := renesas/hs7751rvoip
-machdir-$(CONFIG_SH_RTS7751R2D)                        := renesas/rts7751r2d
-machdir-$(CONFIG_SH_7751_SYSTEMH)              := renesas/systemh
-machdir-$(CONFIG_SH_EDOSK7705)                 := renesas/edosk7705
-machdir-$(CONFIG_SH_HIGHLANDER)                        := renesas/r7780rp
-machdir-$(CONFIG_SH_7710VOIPGW)                        := renesas/sh7710voipgw
-machdir-$(CONFIG_SH_SH4202_MICRODEV)           := superh/microdev
-machdir-$(CONFIG_SH_LANDISK)                   := landisk
-machdir-$(CONFIG_SH_TITAN)                     := titan
-machdir-$(CONFIG_SH_SHMIN)                     := shmin
-machdir-$(CONFIG_SH_7206_SOLUTION_ENGINE)      := se/7206
-machdir-$(CONFIG_SH_7619_SOLUTION_ENGINE)      := se/7619
-machdir-$(CONFIG_SH_LBOX_RE2)                  := lboxre2
-machdir-$(CONFIG_SH_UNKNOWN)                   := unknown
-
-incdir-y                       := $(notdir $(machdir-y))
-incdir-$(CONFIG_SH_HP6XX)                      := hp6xx
+machdir-$(CONFIG_SH_SOLUTION_ENGINE)           += se/770x
+machdir-$(CONFIG_SH_7722_SOLUTION_ENGINE)      += se/7722
+machdir-$(CONFIG_SH_7751_SOLUTION_ENGINE)      += se/7751
+machdir-$(CONFIG_SH_7780_SOLUTION_ENGINE)      += se/7780
+machdir-$(CONFIG_SH_7300_SOLUTION_ENGINE)      += se/7300
+machdir-$(CONFIG_SH_7343_SOLUTION_ENGINE)      += se/7343
+machdir-$(CONFIG_SH_73180_SOLUTION_ENGINE)     += se/73180
+machdir-$(CONFIG_SH_HP6XX)                     += hp6xx
+machdir-$(CONFIG_SH_DREAMCAST)                 += dreamcast
+machdir-$(CONFIG_SH_MPC1211)                   += mpc1211
+machdir-$(CONFIG_SH_SH03)                      += sh03
+machdir-$(CONFIG_SH_SECUREEDGE5410)            += snapgear
+machdir-$(CONFIG_SH_HS7751RVOIP)               += renesas/hs7751rvoip
+machdir-$(CONFIG_SH_RTS7751R2D)                        += renesas/rts7751r2d
+machdir-$(CONFIG_SH_7751_SYSTEMH)              += renesas/systemh
+machdir-$(CONFIG_SH_EDOSK7705)                 += renesas/edosk7705
+machdir-$(CONFIG_SH_HIGHLANDER)                        += renesas/r7780rp
+machdir-$(CONFIG_SH_7710VOIPGW)                        += renesas/sh7710voipgw
+machdir-$(CONFIG_SH_SH4202_MICRODEV)           += superh/microdev
+machdir-$(CONFIG_SH_LANDISK)                   += landisk
+machdir-$(CONFIG_SH_TITAN)                     += titan
+machdir-$(CONFIG_SH_SHMIN)                     += shmin
+machdir-$(CONFIG_SH_7206_SOLUTION_ENGINE)      += se/7206
+machdir-$(CONFIG_SH_7619_SOLUTION_ENGINE)      += se/7619
+machdir-$(CONFIG_SH_LBOX_RE2)                  += lboxre2
+
+incdir-y       := $(notdir $(machdir-y))
 
 ifneq ($(machdir-y),)
-core-y                         += arch/sh/boards/$(machdir-y)/
+core-y += $(addprefix arch/sh/boards/, \
+            $(filter-out ., $(patsubst %,%/,$(machdir-y))))
 endif
 
 # Companion chips
@@ -157,19 +155,31 @@ include/asm-sh/.cpu: $(wildcard include/config/cpu/*.h) \
 #      Most boards have their own mach directories.  For the ones that
 #      don't, just reference the parent directory so the semantics are
 #      kept roughly the same.
+#
+#      When multiple boards are compiled in at the same time, preference
+#      for the mach link is given to whichever has a directory for its
+#      headers. However, this is only a workaround until platforms that
+#      can live in the same kernel image back away from relying on the
+#      mach link.
 
 include/asm-sh/.mach: $(wildcard include/config/sh/*.h) \
                      include/config/auto.conf FORCE
-       @echo -n '  SYMLINK include/asm-sh/mach -> '
        $(Q)if [ ! -d include/asm-sh ]; then mkdir -p include/asm-sh; fi
-       $(Q)if [ -d $(incdir-prefix)$(incdir-y) ]; then \
-               echo -e 'include/asm-sh/$(incdir-y)'; \
-               ln -fsn $(incdir-prefix)$(incdir-y) \
+       $(Q)rm -f include/asm-sh/mach
+       $(Q)for i in $(incdir-y); do \
+       if [ -d $(incdir-prefix)$$i ]; then \
+               echo -n '  SYMLINK include/asm-sh/mach -> '; \
+               echo -e "include/asm-sh/$$i"; \
+               ln -fsn $(incdir-prefix)$$i \
                        include/asm-sh/mach; \
        else \
-               echo -e 'include/asm-sh'; \
-               ln -fsn $(incdir-prefix) include/asm-sh/mach; \
-       fi
+               if [ ! -d include/asm-sh/mach ]; then \
+                       echo -n '  SYMLINK include/asm-sh/mach -> '; \
+                       echo -e 'include/asm-sh'; \
+                       ln -fsn $(incdir-prefix) include/asm-sh/mach; \
+               fi; \
+       fi; \
+       done
        @touch $@
 
 archprepare: include/asm-sh/.cpu include/asm-sh/.mach maketools
@@ -188,7 +198,9 @@ compressed: zImage
 archclean:
        $(Q)$(MAKE) $(clean)=$(boot)
 
-CLEAN_FILES += include/asm-sh/machtypes.h
+CLEAN_FILES += include/asm-sh/machtypes.h \
+              include/asm-sh/cpu include/asm-sh/.cpu \
+              include/asm-sh/mach include/asm-sh/.mach
 
 define archhelp
        @echo '* zImage                    - Compressed kernel image'
index f13017eeeb27ebba6cb68571044155fcf7d6a5a0..8799df6e866a7918018aa4bf893046867b3c2c1f 100644 (file)
@@ -60,7 +60,7 @@ static void __init dreamcast_setup(char **cmdline_p)
 #endif
 }
 
-struct sh_machine_vector mv_dreamcast __initmv = {
+static struct sh_machine_vector mv_dreamcast __initmv = {
        .mv_name                = "Sega Dreamcast",
        .mv_setup               = dreamcast_setup,
        .mv_irq_demux           = systemasic_irq_demux,
@@ -70,4 +70,3 @@ struct sh_machine_vector mv_dreamcast __initmv = {
        .mv_consistent_free     = dreamcast_consistent_free,
 #endif
 };
-ALIAS_MV(dreamcast)
diff --git a/arch/sh/boards/hp6xx/mach.c b/arch/sh/boards/hp6xx/mach.c
deleted file mode 100644 (file)
index 08dbba9..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * linux/arch/sh/boards/hp6xx/mach.c
- *
- * Copyright (C) 2000 Stuart Menefy (stuart.menefy@st.com)
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * Machine vector for the HP680
- */
-#include <asm/machvec.h>
-#include <asm/hd64461.h>
-#include <asm/io.h>
-#include <asm/irq.h>
-
-struct sh_machine_vector mv_hp6xx __initmv = {
-       .mv_nr_irqs = HD64461_IRQBASE + HD64461_IRQ_NUM,
-
-       .mv_inb = hd64461_inb,
-       .mv_inw = hd64461_inw,
-       .mv_inl = hd64461_inl,
-       .mv_outb = hd64461_outb,
-       .mv_outw = hd64461_outw,
-       .mv_outl = hd64461_outl,
-
-       .mv_inb_p = hd64461_inb_p,
-       .mv_inw_p = hd64461_inw,
-       .mv_inl_p = hd64461_inl,
-       .mv_outb_p = hd64461_outb_p,
-       .mv_outw_p = hd64461_outw,
-       .mv_outl_p = hd64461_outl,
-
-       .mv_insb = hd64461_insb,
-       .mv_insw = hd64461_insw,
-       .mv_insl = hd64461_insl,
-       .mv_outsb = hd64461_outsb,
-       .mv_outsw = hd64461_outsw,
-       .mv_outsl = hd64461_outsl,
-
-       .mv_readw = hd64461_readw,
-       .mv_writew = hd64461_writew,
-
-       .mv_irq_demux = hd64461_irq_demux,
-};
-
-ALIAS_MV(hp6xx)
index 6aeee85c978555b267ad7e6ec997e474888c6817..7ae708930bacfa4e7f6ff607b8197248e1c7c96a 100644 (file)
@@ -98,10 +98,9 @@ static void __init hp6xx_setup(char **cmdline_p)
 }
 device_initcall(hp6xx_devices_setup);
 
-struct sh_machine_vector mv_hp6xx __initmv = {
+static struct sh_machine_vector mv_hp6xx __initmv = {
        .mv_name = "hp6xx",
        .mv_setup = hp6xx_setup,
        .mv_nr_irqs = HD64461_IRQBASE + HD64461_IRQ_NUM,
        .mv_irq_demux = hd64461_irq_demux,
 };
-ALIAS_MV(hp6xx)
index f953c74277695bed996d85e12e3888ba25f19592..eda71763ecc5281c1173012d9767a18f7300c580 100644 (file)
@@ -97,10 +97,9 @@ static void __init landisk_setup(char **cmdline_p)
 /*
  * The Machine Vector
  */
-struct sh_machine_vector mv_landisk __initmv = {
+static struct sh_machine_vector mv_landisk __initmv = {
        .mv_name = "LANDISK",
        .mv_nr_irqs = 72,
        .mv_setup = landisk_setup,
        .mv_init_irq = init_landisk_IRQ,
 };
-ALIAS_MV(landisk)
index 4e20f7c63bf3dfc1477411cb0da9d994f40a2ee8..9c830fdc411b346b056ed2b5885bcae750adcc26 100644 (file)
@@ -77,9 +77,8 @@ device_initcall(lboxre2_devices_setup);
 /*
  * The Machine Vector
  */
-struct sh_machine_vector mv_lboxre2 __initmv = {
+static struct sh_machine_vector mv_lboxre2 __initmv = {
        .mv_name                = "L-BOX RE2",
        .mv_nr_irqs             = 72,
        .mv_init_irq            = init_lboxre2_IRQ,
 };
-ALIAS_MV(lboxre2)
index 1a0604b23ce0f4bac86f65fa1e783d8e372cdb04..8ce03e00b0ae34a97a939e4c9a1d250fdce6b309 100644 (file)
@@ -338,11 +338,10 @@ static void __init mpc1211_setup(char **cmdline_p)
 /*
  * The Machine Vector
  */
-struct sh_machine_vector mv_mpc1211 __initmv = {
+static struct sh_machine_vector mv_mpc1211 __initmv = {
        .mv_name                = "Interface MPC-1211(CTP/PCI/MPC-SH02)",
        .mv_setup               = mpc1211_setup,
        .mv_nr_irqs             = 48,
        .mv_irq_demux           = mpc1211_irq_demux,
        .mv_init_irq            = init_mpc1211_IRQ,
 };
-ALIAS_MV(mpc1211)
index ec5be0107719ecea1d340d4e68e78ecc6c832c64..f076c45308ddab2f3178e9a1680ff8f629517132 100644 (file)
@@ -21,7 +21,7 @@ static void __init sh_edosk7705_init_irq(void)
 /*
  * The Machine Vector
  */
-struct sh_machine_vector mv_edosk7705 __initmv = {
+static struct sh_machine_vector mv_edosk7705 __initmv = {
        .mv_name                = "EDOSK7705",
        .mv_nr_irqs             = 80,
 
@@ -41,4 +41,3 @@ struct sh_machine_vector mv_edosk7705 __initmv = {
        .mv_isa_port2addr       = sh_edosk7705_isa_port2addr,
        .mv_init_irq            = sh_edosk7705_init_irq,
 };
-ALIAS_MV(edosk7705)
index f7d0e304d899737e9292d66d31e27a1e1cc948a2..fa5fa39202227f97e5e23d619f0482b3e348293a 100644 (file)
@@ -89,7 +89,7 @@ static void __init hs7751rvoip_setup(char **cmdline_p)
        printk(KERN_INFO "Renesas Technology Sales HS7751RVoIP-2 support.\n");
 }
 
-struct sh_machine_vector mv_hs7751rvoip __initmv = {
+static struct sh_machine_vector mv_hs7751rvoip __initmv = {
        .mv_name                = "HS7751RVoIP",
        .mv_setup               = hs7751rvoip_setup,
        .mv_nr_irqs             = 72,
@@ -118,4 +118,3 @@ struct sh_machine_vector mv_hs7751rvoip __initmv = {
        .mv_init_irq            = hs7751rvoip_init_irq,
        .mv_ioport_map          = hs7751rvoip_ioport_map,
 };
-ALIAS_MV(hs7751rvoip)
index 9fb11641fe139cd37d32cf70bdaf48ae414f0e31..fc8f28e04ba3d306a362e191fd6440b4b6416110 100644 (file)
@@ -6,18 +6,18 @@ choice
 
 config SH_R7780RP
        bool "R7780RP-1 board support"
-       select CPU_SUBTYPE_SH7780
+       depends on CPU_SUBTYPE_SH7780
 
 config SH_R7780MP
        bool "R7780MP board support"
-       select CPU_SUBTYPE_SH7780
+       depends on CPU_SUBTYPE_SH7780
        help
          Selecting this option will enable support for the mass-production
          version of the R7780RP. If in doubt, say Y.
 
 config SH_R7785RP
        bool "R7785RP board support"
-       select CPU_SUBTYPE_SH7785
+       depends on CPU_SUBTYPE_SH7785
 
 endchoice
 
index 0727ef92f2b37431cb4f3de3ab3234b360eeef02..5afb864a1ec51d0637ff6bc82d2a11429719d3d1 100644 (file)
@@ -166,10 +166,9 @@ static void __init highlander_setup(char **cmdline_p)
 /*
  * The Machine Vector
  */
-struct sh_machine_vector mv_highlander __initmv = {
+static struct sh_machine_vector mv_highlander __initmv = {
        .mv_name                = "Highlander",
        .mv_nr_irqs             = 109,
        .mv_setup               = highlander_setup,
        .mv_init_irq            = highlander_init_irq,
 };
-ALIAS_MV(highlander)
index 593f26a85e9c1b15de194a36d6abad3899fd0382..656fda30ef704b36951a9123602ad9dfa54ec10a 100644 (file)
@@ -176,7 +176,7 @@ static void __init rts7751r2d_setup(char **cmdline_p)
 /*
  * The Machine Vector
  */
-struct sh_machine_vector mv_rts7751r2d __initmv = {
+static struct sh_machine_vector mv_rts7751r2d __initmv = {
        .mv_name                = "RTS7751R2D",
        .mv_setup               = rts7751r2d_setup,
        .mv_nr_irqs             = 72,
@@ -189,4 +189,3 @@ struct sh_machine_vector mv_rts7751r2d __initmv = {
        .mv_consistent_free     = voyagergx_consistent_free,
 #endif
 };
-ALIAS_MV(rts7751r2d)
index 180810b121076090acb5e215cb26898859c14d01..2dce8bd97f90408a9f2229399955664d8ddffc96 100644 (file)
@@ -88,9 +88,8 @@ static void __init sh7710voipgw_init_irq(void)
 /*
  * The Machine Vector
  */
-struct sh_machine_vector mv_sh7710voipgw __initmv = {
+static struct sh_machine_vector mv_sh7710voipgw __initmv = {
        .mv_name                = "SH7710 VoIP Gateway",
        .mv_nr_irqs             = 104,
        .mv_init_irq            = sh7710voipgw_init_irq,
 };
-ALIAS_MV(sh7710voipgw)
index 936117659b74410d371ddb30046436a223448f53..ee78af842778e80dc6a89fab923b71aa8ba09efc 100644 (file)
@@ -28,7 +28,7 @@ static void __init sh7751systemh_init_irq(void)
        make_systemh_irq(0xb);  /* Ethernet interrupt */
 }
 
-struct sh_machine_vector mv_7751systemh __initmv = {
+static struct sh_machine_vector mv_7751systemh __initmv = {
        .mv_name                = "7751 SystemH",
        .mv_nr_irqs             = 72,
 
@@ -55,4 +55,3 @@ struct sh_machine_vector mv_7751systemh __initmv = {
 
        .mv_init_irq            = sh7751systemh_init_irq,
 };
-ALIAS_MV(7751systemh)
diff --git a/arch/sh/boards/saturn/Makefile b/arch/sh/boards/saturn/Makefile
deleted file mode 100644 (file)
index 75a3042..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Makefile for the Sega Saturn specific parts of the kernel
-#
-
-obj-y   := setup.o io.o irq.o
-
-obj-$(CONFIG_SMP) += smp.o
-
diff --git a/arch/sh/boards/saturn/io.c b/arch/sh/boards/saturn/io.c
deleted file mode 100644 (file)
index c6e4f7f..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * arch/sh/boards/saturn/io.c
- *
- * I/O routines for the Sega Saturn.
- *
- * Copyright (C) 2002 Paul Mundt
- *
- * Released under the terms of the GNU GPL v2.0.
- */
-#include <asm/saturn/io.h>
-#include <asm/machvec.h>
-
-unsigned long saturn_isa_port2addr(unsigned long offset)
-{
-       return offset;
-}
-
-void *saturn_ioremap(unsigned long offset, unsigned long size)
-{
-       return (void *)offset;
-}
-
-void saturn_iounmap(void *addr)
-{
-}
-
diff --git a/arch/sh/boards/saturn/irq.c b/arch/sh/boards/saturn/irq.c
deleted file mode 100644 (file)
index 15d1d3f..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * arch/sh/boards/saturn/irq.c
- *
- * Copyright (C) 2002 Paul Mundt
- *
- * Released under the terms of the GNU GPL v2.0.
- */
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <asm/irq.h>
-#include <asm/io.h>
-
-/*
- * Interrupts map out as follows:
- *
- *  Vector     Name            Mask
- *
- *     64      VBLANKIN        0x0001
- *     65      VBLANKOUT       0x0002
- *     66      HBLANKIN        0x0004
- *     67      TIMER0          0x0008
- *     68      TIMER1          0x0010
- *     69      DSPEND          0x0020
- *     70      SOUNDREQUEST    0x0040
- *     71      SYSTEMMANAGER   0x0080
- *     72      PAD             0x0100
- *     73      LEVEL2DMAEND    0x0200
- *     74      LEVEL1DMAEND    0x0400
- *     75      LEVEL0DMAEND    0x0800
- *     76      DMAILLEGAL      0x1000
- *     77      SRITEDRAWEND    0x2000
- *     78      ABUS            0x8000
- *
- */
-#define SATURN_IRQ_MIN         64      /* VBLANKIN */
-#define SATURN_IRQ_MAX         78      /* ABUS */
-
-#define SATURN_IRQ_MASK                0xbfff
-
-static inline u32 saturn_irq_mask(unsigned int irq_nr)
-{
-       u32 mask;
-
-       mask = (1 << (irq_nr - SATURN_IRQ_MIN));
-       mask <<= (irq_nr == SATURN_IRQ_MAX);
-       mask &= SATURN_IRQ_MASK;
-
-       return mask;
-}
-
-static inline void mask_saturn_irq(unsigned int irq_nr)
-{
-       u32 mask;
-
-       mask = ctrl_inl(SATURN_IMR);
-       mask |= saturn_irq_mask(irq_nr);
-       ctrl_outl(mask, SATURN_IMR);
-}
-
-static inline void unmask_saturn_irq(unsigned int irq_nr)
-{
-       u32 mask;
-
-       mask = ctrl_inl(SATURN_IMR);
-       mask &= ~saturn_irq_mask(irq_nr);
-       ctrl_outl(mask, SATURN_IMR);
-}
-
-static void disable_saturn_irq(unsigned int irq_nr)
-{
-       mask_saturn_irq(irq_nr);
-}
-
-static void enable_saturn_irq(unsigned int irq_nr)
-{
-       unmask_saturn_irq(irq_nr);
-}
-
-static void mask_and_ack_saturn_irq(unsigned int irq_nr)
-{
-       mask_saturn_irq(irq_nr);
-}
-
-static void end_saturn_irq(unsigned int irq_nr)
-{
-       if (!(irq_desc[irq_nr].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
-               unmask_saturn_irq(irq_nr);
-}
-
-static unsigned int startup_saturn_irq(unsigned int irq_nr)
-{
-       unmask_saturn_irq(irq_nr);
-
-       return 0;
-}
-
-static void shutdown_saturn_irq(unsigned int irq_nr)
-{
-       mask_saturn_irq(irq_nr);
-}
-
-static struct hw_interrupt_type saturn_int = {
-       .typename       = "Saturn",
-       .enable         = enable_saturn_irq,
-       .disable        = disable_saturn_irq,
-       .ack            = mask_and_ack_saturn_irq,
-       .end            = end_saturn_irq,
-       .startup        = startup_saturn_irq,
-       .shutdown       = shutdown_saturn_irq,
-};
-
-int saturn_irq_demux(int irq_nr)
-{
-       /* FIXME */
-       return irq_nr;
-}
-
diff --git a/arch/sh/boards/saturn/setup.c b/arch/sh/boards/saturn/setup.c
deleted file mode 100644 (file)
index a3a37c9..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/* 
- * arch/sh/boards/saturn/setup.c
- *
- * Hardware support for the Sega Saturn.
- *
- * Copyright (c) 2002 Paul Mundt
- *
- * Released under the terms of the GNU GPL v2.0.
- */
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <asm/io.h>
-#include <asm/machvec.h>
-#include <asm/mach/io.h>
-
-extern int saturn_irq_demux(int irq_nr);
-
-/*
- * The Machine Vector
- */
-struct sh_machine_vector mv_saturn __initmv = {
-       .mv_name                = "Sega Saturn",
-       .mv_nr_irqs             = 80,   /* Fix this later */
-
-       .mv_isa_port2addr       = saturn_isa_port2addr,
-       .mv_irq_demux           = saturn_irq_demux,
-
-       .mv_ioremap             = saturn_ioremap,
-       .mv_iounmap             = saturn_iounmap,
-};
-ALIAS_MV(saturn)
diff --git a/arch/sh/boards/saturn/smp.c b/arch/sh/boards/saturn/smp.c
deleted file mode 100644 (file)
index 7646091..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/* 
- * arch/sh/boards/saturn/smp.c
- *
- * SMP support for the Sega Saturn.
- *
- * Copyright (c) 2002 Paul Mundt
- *
- * Released under the terms of the GNU GPL v2.0.
- */
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/smp.h>
-
-#include <asm/saturn/smpc.h>
-
-extern void start_secondary(void);
-
-void __smp_send_ipi(unsigned int cpu, unsigned int action)
-{
-       /* Nothing here yet .. */
-}
-
-unsigned int __smp_probe_cpus(void)
-{
-       /*
-        * This is just a straightforward master/slave configuration,
-        * and probing isn't really supported..
-        */
-       return 2;
-}
-
-/*
- * We're only allowed to do byte-access to SMPC registers. In
- * addition to which, we treat them as write-only, since
- * reading from them will return undefined data.
- */
-static inline void smpc_slave_stop(unsigned int cpu)
-{
-       smpc_barrier();
-       ctrl_outb(1, SMPC_STATUS);
-
-       ctrl_outb(SMPC_CMD_SSHOFF, SMPC_COMMAND);
-       smpc_barrier();
-}
-
-static inline void smpc_slave_start(unsigned int cpu)
-{
-       ctrl_outb(1, SMPC_STATUS);
-       ctrl_outb(SMPC_CMD_SSHON, SMPC_COMMAND);
-
-       smpc_barrier();
-}
-
-void __smp_slave_init(unsigned int cpu)
-{
-       register unsigned long vbr;
-       void **entry;
-
-       __asm__ __volatile__ ("stc vbr, %0\n\t" : "=r" (vbr));
-       entry = (void **)(vbr + 0x310 + 0x94);
-
-       smpc_slave_stop(cpu);
-
-       *(void **)entry = (void *)start_secondary;
-
-       smpc_slave_start(cpu);
-}
-
index ca714879f55972bba43862ba70073702c9612d22..a074b62505ef1db0acce7eae1d4dd62961e30cb7 100644 (file)
@@ -70,7 +70,7 @@ __initcall(se7206_devices_setup);
  * The Machine Vector
  */
 
-struct sh_machine_vector mv_se __initmv = {
+static struct sh_machine_vector mv_se __initmv = {
        .mv_name                = "SolutionEngine",
        .mv_nr_irqs             = 256,
        .mv_inb                 = se7206_inb,
@@ -96,4 +96,3 @@ struct sh_machine_vector mv_se __initmv = {
 
        .mv_init_irq            = init_se7206_IRQ,
 };
-ALIAS_MV(se)
index f1960956bad051f282ec74638432415eb985781a..eb469f5b6e97595c1deb0901c509f3f4332add17 100644 (file)
@@ -46,7 +46,7 @@ __initcall(se7300_devices_setup);
 /*
  * The Machine Vector
  */
-struct sh_machine_vector mv_7300se __initmv = {
+static struct sh_machine_vector mv_7300se __initmv = {
        .mv_name = "SolutionEngine 7300",
        .mv_nr_irqs = 109,
        .mv_inb = sh7300se_inb,
@@ -72,4 +72,3 @@ struct sh_machine_vector mv_7300se __initmv = {
 
        .mv_init_irq = init_7300se_IRQ,
 };
-ALIAS_MV(7300se)
index e143017c8975a0662ca64c2116106e8f97389533..1deee85566428196b4cf775f54f797494e8b6a0d 100644 (file)
@@ -46,7 +46,7 @@ __initcall(se73180_devices_setup);
 /*
  * The Machine Vector
  */
-struct sh_machine_vector mv_73180se __initmv = {
+static struct sh_machine_vector mv_73180se __initmv = {
        .mv_name = "SolutionEngine 73180",
        .mv_nr_irqs = 108,
        .mv_inb = sh73180se_inb,
@@ -73,4 +73,3 @@ struct sh_machine_vector mv_73180se __initmv = {
        .mv_init_irq = init_73180se_IRQ,
        .mv_irq_demux = shmse_irq_demux,
 };
-ALIAS_MV(73180se)
index 3fdb16f2cef1dfd400677bfd7b9d623706e79ef2..8fec155e2ff7f86816c8e90264906381fc766f6b 100644 (file)
@@ -64,7 +64,7 @@ static void __init sh7343se_setup(char **cmdline_p)
 /*
  * The Machine Vector
  */
-struct sh_machine_vector mv_7343se __initmv = {
+static struct sh_machine_vector mv_7343se __initmv = {
        .mv_name = "SolutionEngine 7343",
        .mv_setup = sh7343se_setup,
        .mv_nr_irqs = 108,
@@ -92,4 +92,3 @@ struct sh_machine_vector mv_7343se __initmv = {
        .mv_init_irq = init_7343se_IRQ,
        .mv_irq_demux = shmse_irq_demux,
 };
-ALIAS_MV(7343se)
index 52d2c4d5d2fa98327b306a62f7a39f0867dc2330..1d0ef7faa10dd1b467cc2586c9f161c9f4d48ed6 100644 (file)
@@ -15,8 +15,7 @@
  * The Machine Vector
  */
 
-struct sh_machine_vector mv_se __initmv = {
+static struct sh_machine_vector mv_se __initmv = {
        .mv_name                = "SolutionEngine",
        .mv_nr_irqs             = 108,
 };
-ALIAS_MV(se)
index c8eccff77a04e703747289f24aafd4f27d0d3ede..cdb0807928a541072612ebbd50316e998f124618 100644 (file)
 #include <asm/io.h>
 #include <asm/se.h>
 
-/* 
- * If the problem of make_ipr_irq is solved, 
- * this code will become unnecessary. :-) 
- */
-static void se770x_disable_ipr_irq(unsigned int irq)
-{
-       struct ipr_data *p = get_irq_chip_data(irq);
-
-       ctrl_outw(ctrl_inw(p->addr) & (0xffff ^ (0xf << p->shift)), p->addr);
-}
-
-static void se770x_enable_ipr_irq(unsigned int irq)
-{
-       struct ipr_data *p = get_irq_chip_data(irq);
-
-       ctrl_outw(ctrl_inw(p->addr) | (p->priority << p->shift), p->addr);
-}
-
-static struct irq_chip se770x_irq_chip = {
-       .name           = "MS770xSE-FPGA",
-       .mask           = se770x_disable_ipr_irq,
-       .unmask         = se770x_enable_ipr_irq,
-       .mask_ack       = se770x_disable_ipr_irq,
-};
-
-void make_se770x_irq(struct ipr_data *table, unsigned int nr_irqs)
-{
-       int i;
-
-       for (i = 0; i < nr_irqs; i++) {
-               unsigned int irq = table[i].irq;
-               disable_irq_nosync(irq);
-               set_irq_chip_and_handler_name(irq, &se770x_irq_chip,
-                       handle_level_irq, "level");
-               set_irq_chip_data(irq, &table[i]);
-               se770x_enable_ipr_irq(irq);
-       }
-}
-
-static struct ipr_data se770x_ipr_map[] = {
+static struct ipr_data ipr_irq_table[] = {
        /*
        * Super I/O (Just mimic PC):
        *  1: keyboard
@@ -68,46 +29,67 @@ static struct ipr_data se770x_ipr_map[] = {
        */
 #if defined(CONFIG_CPU_SUBTYPE_SH7705)
        /* This is default value */
-       { 13, 0, 8,  0x0f-13 ,BCR_ILCRA},
-       { 5 , 0, 4,  0x0f- 5 ,BCR_ILCRA},
-       { 10, 0, 0,  0x0f-10, BCR_ILCRB},
-       { 7 , 0, 4,  0x0f- 7, BCR_ILCRC},
-       { 3 , 0, 0,  0x0f- 3, BCR_ILCRC},
-       { 1 , 0, 12, 0x0f- 1, BCR_ILCRD},
-       { 12, 0, 4,  0x0f-12, BCR_ILCRD}, /* LAN */
-       { 2 , 0, 8,  0x0f- 2, BCR_ILCRE}, /* PCIRQ2 */
-       { 6 , 0, 4,  0x0f- 6, BCR_ILCRE}, /* PCIRQ1 */
-       { 14, 0, 0,  0x0f-14, BCR_ILCRE}, /* PCIRQ0 */
-       { 0 , 0, 12, 0x0f   , BCR_ILCRF}, 
-       { 4 , 0, 4,  0x0f- 4, BCR_ILCRF},
-       { 8 , 0, 12, 0x0f- 8, BCR_ILCRG},
-       { 9 , 0, 8,  0x0f- 9, BCR_ILCRG},
-       { 11, 0, 4,  0x0f-11, BCR_ILCRG},
+       { 13, 0, 8,  0x0f-13},
+       { 5 , 0, 4,  0x0f- 5},
+       { 10, 1, 0,  0x0f-10, },
+       { 7 , 2, 4,  0x0f- 7, },
+       { 3 , 2, 0,  0x0f- 3, },
+       { 1 , 3, 12, 0x0f- 1, },
+       { 12, 3, 4,  0x0f-12, }, /* LAN */
+       { 2 , 4, 8,  0x0f- 2, }, /* PCIRQ2 */
+       { 6 , 4, 4,  0x0f- 6, }, /* PCIRQ1 */
+       { 14, 4, 0,  0x0f-14, }, /* PCIRQ0 */
+       { 0 , 5, 12, 0x0f   , }, 
+       { 4 , 5, 4,  0x0f- 4, },
+       { 8 , 6, 12, 0x0f- 8, },
+       { 9 , 6, 8,  0x0f- 9, },
+       { 11, 6, 4,  0x0f-11, },
 #else
-       { 14, 0,  8, 0x0f-14 ,BCR_ILCRA},
-       { 12, 0,  4, 0x0f-12 ,BCR_ILCRA},
-       {  8, 0,  4, 0x0f- 8 ,BCR_ILCRB},
-       {  6, 0, 12, 0x0f- 6 ,BCR_ILCRC},
-       {  5, 0,  8, 0x0f- 5 ,BCR_ILCRC},
-       {  4, 0,  4, 0x0f- 4 ,BCR_ILCRC},
-       {  3, 0,  0, 0x0f- 3 ,BCR_ILCRC},
-       {  1, 0, 12, 0x0f- 1 ,BCR_ILCRD},
+       { 14, 0,  8, 0x0f-14},
+       { 12, 0,  4, 0x0f-12},
+       {  8, 1,  4, 0x0f- 8, },
+       {  6, 2, 12, 0x0f- 6, },
+       {  5, 2,  8, 0x0f- 5, },
+       {  4, 2,  4, 0x0f- 4, },
+       {  3, 2,  0, 0x0f- 3, },
+       {  1, 3, 12, 0x0f- 1, },
 #if defined(CONFIG_STNIC)
        /* ST NIC */
-       { 10, 0,  4, 0x0f-10 ,BCR_ILCRD},       /* LAN */
+       { 10, 3,  4, 0x0f-10, },        /* LAN */
 #endif
        /* MRSHPC IRQs setting */
-       {  0, 0, 12, 0x0f- 0 ,BCR_ILCRE},       /* PCIRQ3 */
-       { 11, 0,  8, 0x0f-11 ,BCR_ILCRE},       /* PCIRQ2 */
-       {  9, 0,  4, 0x0f- 9 ,BCR_ILCRE},       /* PCIRQ1 */
-       {  7, 0,  0, 0x0f- 7 ,BCR_ILCRE},       /* PCIRQ0 */
+       {  0, 4, 12, 0x0f- 0, },        /* PCIRQ3 */
+       { 11, 4,  8, 0x0f-11, },        /* PCIRQ2 */
+       {  9, 4,  4, 0x0f- 9, },        /* PCIRQ1 */
+       {  7, 4,  0, 0x0f- 7, },        /* PCIRQ0 */
        /* #2, #13 are allocated for SLOT IRQ #1 and #2 (for now) */
        /* NOTE: #2 and #13 are not used on PC */
-       { 13, 0,  4, 0x0f-13 ,BCR_ILCRG},       /* SLOTIRQ2 */
-       {  2, 0,  0, 0x0f- 2 ,BCR_ILCRG},       /* SLOTIRQ1 */
+       { 13, 6,  4, 0x0f-13, },        /* SLOTIRQ2 */
+       {  2, 6,  0, 0x0f- 2, },        /* SLOTIRQ1 */
 #endif
 };
 
+static unsigned long ipr_offsets[] = {
+       BCR_ILCRA,
+       BCR_ILCRB,
+       BCR_ILCRC,
+       BCR_ILCRD,
+       BCR_ILCRE,
+       BCR_ILCRF,
+       BCR_ILCRG,
+};
+
+static struct ipr_desc ipr_irq_desc = {
+       .ipr_offsets    = ipr_offsets,
+       .nr_offsets     = ARRAY_SIZE(ipr_offsets),
+
+       .ipr_data       = ipr_irq_table,
+       .nr_irqs        = ARRAY_SIZE(ipr_irq_table),
+       .chip = {
+               .name   = "IPR-se770x",
+       },
+};
+
 /*
  * Initialize IRQ setting
  */
@@ -122,5 +104,5 @@ void __init init_se_IRQ(void)
        ctrl_outw(0, BCR_ILCRF);
        ctrl_outw(0, BCR_ILCRG);
 
-       make_se770x_irq(se770x_ipr_map, ARRAY_SIZE(se770x_ipr_map));
+       register_ipr_controller(&ipr_irq_desc);
 }
index 17a2631de3ba90626485c942d6c2f2bd91decfb5..2962da148f3ff8a5cb89cfc8717b68f712df7d14 100644 (file)
@@ -122,7 +122,7 @@ device_initcall(se_devices_setup);
 /*
  * The Machine Vector
  */
-struct sh_machine_vector mv_se __initmv = {
+static struct sh_machine_vector mv_se __initmv = {
        .mv_name                = "SolutionEngine",
        .mv_setup               = smsc_setup,
 #if defined(CONFIG_CPU_SH4)
@@ -160,4 +160,3 @@ struct sh_machine_vector mv_se __initmv = {
 
        .mv_init_irq            = init_se_IRQ,
 };
-ALIAS_MV(se)
index 099e5deb77f8d1d110b567b1920e93811b8a1126..26cff0efda4037b156540f5c158332992bebe028 100644 (file)
 #define INTC_INTMSK0             0xFFD00044
 #define INTC_INTMSKCLR0          0xFFD00064
 
+struct se7722_data {
+       unsigned char irq;
+       unsigned char ipr_idx;
+       unsigned char shift;
+       unsigned short priority;
+       unsigned long addr;
+};
+
+
 static void disable_se7722_irq(unsigned int irq)
 {
-       struct ipr_data *p = get_irq_chip_data(irq);
+       struct se7722_data *p = get_irq_chip_data(irq);
        ctrl_outw( ctrl_inw( p->addr ) | p->priority , p->addr );
 }
 
 static void enable_se7722_irq(unsigned int irq)
 {
-       struct ipr_data *p = get_irq_chip_data(irq);
+       struct se7722_data *p = get_irq_chip_data(irq);
        ctrl_outw( ctrl_inw( p->addr ) & ~p->priority , p->addr );
 }
 
@@ -38,7 +47,7 @@ static struct irq_chip se7722_irq_chip __read_mostly = {
        .mask_ack       = disable_se7722_irq,
 };
 
-static struct ipr_data ipr_irq_table[] = {
+static struct se7722_data ipr_irq_table[] = {
        /* irq        ,idx,sft, priority     , addr   */
        { MRSHPC_IRQ0 , 0 , 0 , MRSHPC_BIT0 , IRQ01_MASK } ,
        { MRSHPC_IRQ1 , 0 , 0 , MRSHPC_BIT1 , IRQ01_MASK } ,
index 636ca6c987e0816a8bbbc6901d0882719f4ca3d4..6cca6cbc80690383204c61bb6887e4dada8f4268 100644 (file)
@@ -137,7 +137,7 @@ static void __init se7722_setup(char **cmdline_p)
 /*
  * The Machine Vector
  */
-struct sh_machine_vector mv_se7722 __initmv = {
+static struct sh_machine_vector mv_se7722 __initmv = {
        .mv_name                = "Solution Engine 7722" ,
        .mv_setup               = se7722_setup ,
        .mv_nr_irqs             = 109 ,
@@ -145,4 +145,3 @@ struct sh_machine_vector mv_se7722 __initmv = {
        .mv_irq_demux           = se7722_irq_demux,
 
 };
-ALIAS_MV(se7722)
index e4c63a48296cbf6d0ea6956f197ac6c58141399e..c3d12590e5db06e7a0b6788164dec1f36efb3c24 100644 (file)
 #include <asm/irq.h>
 #include <asm/se7751.h>
 
-static struct ipr_data se7751_ipr_map[] = {
-  /* Leave old Solution Engine code in for reference. */
-#if defined(CONFIG_SH_SOLUTION_ENGINE)
-       /*
-        * Super I/O (Just mimic PC):
-        *  1: keyboard
-        *  3: serial 0
-        *  4: serial 1
-        *  5: printer
-        *  6: floppy
-        *  8: rtc
-        * 12: mouse
-        * 14: ide0
-        */
-       { 14, BCR_ILCRA, 2, 0x0f-14 },
-       { 12, BCR_ILCRA, 1, 0x0f-12 },
-       {  8, BCR_ILCRB, 1, 0x0f- 8 },
-       {  6, BCR_ILCRC, 3, 0x0f- 6 },
-       {  5, BCR_ILCRC, 2, 0x0f- 5 },
-       {  4, BCR_ILCRC, 1, 0x0f- 4 },
-       {  3, BCR_ILCRC, 0, 0x0f- 3 },
-       {  1, BCR_ILCRD, 3, 0x0f- 1 },
+static struct ipr_data ipr_irq_table[] = {
+       { 13, 3, 3, 2 },
+       /* Add additional entries here as drivers are added and tested. */
+};
 
-       { 10, BCR_ILCRD, 1, 0x0f-10 }, /* LAN */
+static unsigned long ipr_offsets[] = {
+       BCR_ILCRA,
+       BCR_ILCRB,
+       BCR_ILCRC,
+       BCR_ILCRD,
+       BCR_ILCRE,
+       BCR_ILCRF,
+       BCR_ILCRG,
+};
 
-       {  0, BCR_ILCRE, 3, 0x0f- 0 }, /* PCIRQ3 */
-       { 11, BCR_ILCRE, 2, 0x0f-11 }, /* PCIRQ2 */
-       {  9, BCR_ILCRE, 1, 0x0f- 9 }, /* PCIRQ1 */
-       {  7, BCR_ILCRE, 0, 0x0f- 7 }, /* PCIRQ0 */
+static struct ipr_desc ipr_irq_desc = {
+       .ipr_offsets    = ipr_offsets,
+       .nr_offsets     = ARRAY_SIZE(ipr_offsets),
 
-       /* #2, #13 are allocated for SLOT IRQ #1 and #2 (for now) */
-       /* NOTE: #2 and #13 are not used on PC */
-       { 13, BCR_ILCRG, 1, 0x0f-13 }, /* SLOTIRQ2 */
-       {  2, BCR_ILCRG, 0, 0x0f- 2 }, /* SLOTIRQ1 */
-#elif defined(CONFIG_SH_7751_SOLUTION_ENGINE)
-       { 13, BCR_ILCRD, 3, 2 },
-       /* Add additional entries here as drivers are added and tested. */
-#endif
+       .ipr_data       = ipr_irq_table,
+       .nr_irqs        = ARRAY_SIZE(ipr_irq_table),
+
+       .chip = {
+               .name   = "IPR-se7751",
+       },
 };
 
 /*
@@ -59,5 +46,5 @@ static struct ipr_data se7751_ipr_map[] = {
  */
 void __init init_7751se_IRQ(void)
 {
-       make_ipr_irq(se7751_ipr_map, ARRAY_SIZE(se7751_ipr_map));
+       register_ipr_controller(&ipr_irq_desc);
 }
index 52c7bfa57c2c64c18ba7d41b378a352d10a01f1f..7873d07e40c1cbac50e9a62d453c8dc87447e20c 100644 (file)
@@ -48,7 +48,7 @@ __initcall(se7751_devices_setup);
 /*
  * The Machine Vector
  */
-struct sh_machine_vector mv_7751se __initmv = {
+static struct sh_machine_vector mv_7751se __initmv = {
        .mv_name                = "7751 SolutionEngine",
        .mv_nr_irqs             = 72,
 
@@ -71,4 +71,3 @@ struct sh_machine_vector mv_7751se __initmv = {
 
        .mv_init_irq            = init_7751se_IRQ,
 };
-ALIAS_MV(7751se)
index 3d0625c2d07bd8106a39ee06606af7d0e28877e4..87491474600907cec7ced860f9ac5a7f284ca68c 100644 (file)
 #include <asm/io.h>
 #include <asm/se7780.h>
 
-#define INTC_INTMSK0             0xFFD00044
-#define INTC_INTMSKCLR0          0xFFD00064
-
-static void disable_se7780_irq(unsigned int irq)
-{
-       struct intc2_data *p = get_irq_chip_data(irq);
-       ctrl_outl(1 << p->msk_shift, INTC_INTMSK0 + p->msk_offset);
-}
-
-static void enable_se7780_irq(unsigned int irq)
-{
-       struct intc2_data *p = get_irq_chip_data(irq);
-       ctrl_outl(1 << p->msk_shift, INTC_INTMSKCLR0 + p->msk_offset);
-}
-
-static struct irq_chip se7780_irq_chip __read_mostly = {
-       .name           = "SE7780",
-       .mask           = disable_se7780_irq,
-       .unmask         = enable_se7780_irq,
-       .mask_ack       = disable_se7780_irq,
-};
-
 static struct intc2_data intc2_irq_table[] = {
        { 2,  0, 31, 0, 31, 3 }, /* daughter board EXTINT1 */
        { 4,  0, 30, 0, 30, 3 }, /* daughter board EXTINT2 */
@@ -51,13 +29,24 @@ static struct intc2_data intc2_irq_table[] = {
        { 0 , 0, 24, 0, 24, 3 }, /* SM501 */
 };
 
+static struct intc2_desc intc2_irq_desc __read_mostly = {
+       .prio_base      = 0, /* N/A */
+       .msk_base       = 0xffd00044,
+       .mskclr_base    = 0xffd00064,
+
+       .intc2_data     = intc2_irq_table,
+       .nr_irqs        = ARRAY_SIZE(intc2_irq_table),
+
+       .chip = {
+               .name   = "INTC2-se7780",
+       },
+};
+
 /*
  * Initialize IRQ setting
  */
 void __init init_se7780_IRQ(void)
 {
-       int i ;
-
        /* enable all interrupt at FPGA */
        ctrl_outw(0, FPGA_INTMSK1);
        /* mask SM501 interrupt */
@@ -79,11 +68,5 @@ void __init init_se7780_IRQ(void)
        /* FPGA + 0x0A */
        ctrl_outw((IRQPIN_PCCPW << IRQPOS_PCCPW), FPGA_INTSEL3);
 
-       for (i = 0; i < ARRAY_SIZE(intc2_irq_table); i++) {
-               disable_irq_nosync(intc2_irq_table[i].irq);
-               set_irq_chip_and_handler_name( intc2_irq_table[i].irq, &se7780_irq_chip,
-                       handle_level_irq, "level");
-               set_irq_chip_data( intc2_irq_table[i].irq, &intc2_irq_table[i] );
-               disable_se7780_irq(intc2_irq_table[i].irq);
-       }
+       register_intc2_controller(&intc2_irq_desc);
 }
index df7d08a24c9f8664da0e82fba87f50cadbab1ddf..723f2fd4d55bfabf57c22cc11befc71f2c949b78 100644 (file)
@@ -113,10 +113,9 @@ static void __init se7780_setup(char **cmdline_p)
 /*
  * The Machine Vector
  */
-struct sh_machine_vector mv_se7780 __initmv = {
+static struct sh_machine_vector mv_se7780 __initmv = {
        .mv_name                = "Solution Engine 7780" ,
        .mv_setup               = se7780_setup ,
        .mv_nr_irqs             = 111 ,
        .mv_init_irq            = init_se7780_IRQ,
 };
-ALIAS_MV(se7780)
index c069c444b4eca13663f4f645a592e555720ac7f2..9c031a8c0a1cafb54e55baef8456fe8c60ee4a74 100644 (file)
 #include <asm/sh03/sh03.h>
 #include <asm/addrspace.h>
 
-static struct ipr_data sh03_ipr_map[] = {
-       { IRL0_IRQ, IRL0_IPR_ADDR, IRL0_IPR_POS, IRL0_PRIORITY },
-       { IRL1_IRQ, IRL1_IPR_ADDR, IRL1_IPR_POS, IRL1_PRIORITY },
-       { IRL2_IRQ, IRL2_IPR_ADDR, IRL2_IPR_POS, IRL2_PRIORITY },
-       { IRL3_IRQ, IRL3_IPR_ADDR, IRL3_IPR_POS, IRL3_PRIORITY },
+static struct ipr_data ipr_irq_table[] = {
+       { IRL0_IRQ, 0, IRL0_IPR_POS, IRL0_PRIORITY },
+       { IRL1_IRQ, 0, IRL1_IPR_POS, IRL1_PRIORITY },
+       { IRL2_IRQ, 0, IRL2_IPR_POS, IRL2_PRIORITY },
+       { IRL3_IRQ, 0, IRL3_IPR_POS, IRL3_PRIORITY },
+};
+
+static unsigned long ipr_offsets[] = {
+       INTC_IPRD,
+};
+
+static struct ipr_desc ipr_irq_desc = {
+       .ipr_offsets    = ipr_offsets,
+       .nr_offsets     = ARRAY_SIZE(ipr_offsets),
+
+       .ipr_data       = ipr_irq_table,
+       .nr_irqs        = ARRAY_SIZE(ipr_irq_table),
+
+       .chip = {
+               .name   = "IPR-sh03",
+       },
 };
 
 static void __init init_sh03_IRQ(void)
 {
        ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR);
-       make_ipr_irq(sh03_ipr_map, ARRAY_SIZE(sh03_ipr_map));
+       register_ipr_controller(&ipr_irq_desc);
 }
 
 extern void *cf_io_base;
@@ -74,11 +90,10 @@ static int __init sh03_devices_setup(void)
 }
 __initcall(sh03_devices_setup);
 
-struct sh_machine_vector mv_sh03 __initmv = {
+static struct sh_machine_vector mv_sh03 __initmv = {
        .mv_name                = "Interface (CTP/PCI-SH03)",
        .mv_setup               = sh03_setup,
        .mv_nr_irqs             = 48,
        .mv_ioport_map          = sh03_ioport_map,
        .mv_init_irq            = init_sh03_IRQ,
 };
-ALIAS_MV(sh03)
index 4a9df4a6b034d2f3cfe4013d3c2e4fea4e8dc711..dfd124509f42c2cd25f8898f164d0df8f86e2453 100644 (file)
@@ -6,28 +6,44 @@
  * SHMIN Support.
  */
 #include <linux/init.h>
+#include <linux/irq.h>
 #include <asm/machvec.h>
 #include <asm/shmin.h>
 #include <asm/clock.h>
-#include <asm/irq.h>
 #include <asm/io.h>
 
 #define PFC_PHCR       0xa400010eUL
 #define INTC_ICR1      0xa4000010UL
 #define INTC_IPRC      0xa4000016UL
 
-static struct ipr_data shmin_ipr_map[] = {
-       { .irq=32, .addr=INTC_IPRC, .shift= 0, .priority=0 },
-       { .irq=33, .addr=INTC_IPRC, .shift= 4, .priority=0 },
-       { .irq=34, .addr=INTC_IPRC, .shift= 8, .priority=8 },
-       { .irq=35, .addr=INTC_IPRC, .shift=12, .priority=0 },
+static struct ipr_data ipr_irq_table[] = {
+       { 32, 0, 0, 0 },
+       { 33, 0, 4, 0 },
+       { 34, 0, 8, 8 },
+       { 35, 0, 12, 0 },
+};
+
+static unsigned long ipr_offsets[] = {
+       INTC_IPRC,
+};
+
+static struct ipr_desc ipr_irq_desc = {
+       .ipr_offsets    = ipr_offsets,
+       .nr_offsets     = ARRAY_SIZE(ipr_offsets),
+
+       .ipr_data       = ipr_irq_table,
+       .nr_irqs        = ARRAY_SIZE(ipr_irq_table),
+
+       .chip = {
+               .name   = "IPR-shmin",
+       },
 };
 
 static void __init init_shmin_irq(void)
 {
        ctrl_outw(0x2a00, PFC_PHCR);    // IRQ0-3=IRQ
        ctrl_outw(0x0aaa, INTC_ICR1);   // IRQ0-3=IRQ-mode,Low-active.
-       make_ipr_irq(shmin_ipr_map, ARRAY_SIZE(shmin_ipr_map));
+       register_ipr_controller(&ipr_irq_desc);
 }
 
 static void __iomem *shmin_ioport_map(unsigned long port, unsigned int size)
@@ -43,9 +59,8 @@ static void __iomem *shmin_ioport_map(unsigned long port, unsigned int size)
 
 }
 
-struct sh_machine_vector mv_shmin __initmv = {
+static struct sh_machine_vector mv_shmin __initmv = {
        .mv_name        = "SHMIN",
        .mv_init_irq    = init_shmin_irq,
        .mv_ioport_map  = shmin_ioport_map,
 };
-ALIAS_MV(shmin)
index 650fb36459472e1866cee0aa5064b3b6f3488341..84271d85a8dd42d158dea593c3c5525c78af4517 100644 (file)
@@ -68,11 +68,27 @@ module_init(eraseconfig_init);
  * IRL3 = crypto
  */
 
-static struct ipr_data snapgear_ipr_map[] = {
-       make_ipr_irq(IRL0_IRQ, IRL0_IPR_ADDR, IRL0_IPR_POS, IRL0_PRIORITY);
-       make_ipr_irq(IRL1_IRQ, IRL1_IPR_ADDR, IRL1_IPR_POS, IRL1_PRIORITY);
-       make_ipr_irq(IRL2_IRQ, IRL2_IPR_ADDR, IRL2_IPR_POS, IRL2_PRIORITY);
-       make_ipr_irq(IRL3_IRQ, IRL3_IPR_ADDR, IRL3_IPR_POS, IRL3_PRIORITY);
+static struct ipr_data ipr_irq_table[] = {
+       { IRL0_IRQ, 0, IRL0_IPR_POS, IRL0_PRIORITY },
+       { IRL1_IRQ, 0, IRL1_IPR_POS, IRL1_PRIORITY },
+       { IRL2_IRQ, 0, IRL2_IPR_POS, IRL2_PRIORITY },
+       { IRL3_IRQ, 0, IRL3_IPR_POS, IRL3_PRIORITY },
+};
+
+static unsigned long ipr_offsets[] = {
+       INTC_IPRD,
+};
+
+static struct ipr_desc ipr_irq_desc = {
+       .ipr_offsets    = ipr_offsets,
+       .nr_offsets     = ARRAY_SIZE(ipr_offsets),
+
+       .ipr_data       = ipr_irq_table,
+       .nr_irqs        = ARRAY_SIZE(ipr_irq_table),
+
+       .chip = {
+               .name   = "IPR-snapgear",
+       },
 };
 
 static void __init init_snapgear_IRQ(void)
@@ -82,7 +98,7 @@ static void __init init_snapgear_IRQ(void)
 
        printk("Setup SnapGear IRQ/IPR ...\n");
 
-       make_ipr_irq(snapgear_ipr_map, ARRAY_SIZE(snapgear_ipr_map));
+       register_ipr_controller(&ipr_irq_desc);
 }
 
 /*
@@ -96,7 +112,7 @@ static void __init snapgear_setup(char **cmdline_p)
 /*
  * The Machine Vector
  */
-struct sh_machine_vector mv_snapgear __initmv = {
+static struct sh_machine_vector mv_snapgear __initmv = {
        .mv_name                = "SnapGear SecureEdge5410",
        .mv_setup               = snapgear_setup,
        .mv_nr_irqs             = 72,
@@ -117,4 +133,3 @@ struct sh_machine_vector mv_snapgear __initmv = {
 
        .mv_init_irq            = init_snapgear_IRQ,
 };
-ALIAS_MV(snapgear)
index 6396cea1c89653b0e37805708d13382252b74e18..fc8cd06d66cf287a29cd65505bb685a21ef35eab 100644 (file)
@@ -371,7 +371,7 @@ static void __init microdev_setup(char **cmdline_p)
 /*
  * The Machine Vector
  */
-struct sh_machine_vector mv_sh4202_microdev __initmv = {
+static struct sh_machine_vector mv_sh4202_microdev __initmv = {
        .mv_name                = "SH4-202 MicroDev",
        .mv_setup               = microdev_setup,
        .mv_nr_irqs             = 72,           /* QQQ need to check this - use the MACRO */
@@ -403,4 +403,3 @@ struct sh_machine_vector mv_sh4202_microdev __initmv = {
        .mv_heartbeat           = microdev_heartbeat,
 #endif
 };
-ALIAS_MV(sh4202_microdev)
index 6bcd939bfaed4899783bf579eabd3011e9221c32..606d25a4b870098698fc409c0cb81ddc68ebea4d 100644 (file)
@@ -12,7 +12,7 @@
 #include <asm/titan.h>
 #include <asm/io.h>
 
-static struct ipr_data titan_ipr_map[] = {
+static struct ipr_data ipr_irq_table[] = {
        /* IRQ, IPR idx, shift, prio */
        { TITAN_IRQ_WAN,   3, 12, 8 },  /* eth0 (WAN) */
        { TITAN_IRQ_LAN,   3,  8, 8 },  /* eth1 (LAN) */
@@ -20,15 +20,33 @@ static struct ipr_data titan_ipr_map[] = {
        { TITAN_IRQ_USB,   3,  0, 8 },  /* mPCI B (bottom), USB */
 };
 
+static unsigned long ipr_offsets[] = { /* stolen from setup-sh7750.c */
+       0xffd00004UL,   /* 0: IPRA */
+       0xffd00008UL,   /* 1: IPRB */
+       0xffd0000cUL,   /* 2: IPRC */
+       0xffd00010UL,   /* 3: IPRD */
+};
+
+static struct ipr_desc ipr_irq_desc = {
+       .ipr_offsets    = ipr_offsets,
+       .nr_offsets     = ARRAY_SIZE(ipr_offsets),
+
+       .ipr_data       = ipr_irq_table,
+       .nr_irqs        = ARRAY_SIZE(ipr_irq_table),
+
+       .chip = {
+               .name   = "IPR-titan",
+       },
+};
 static void __init init_titan_irq(void)
 {
        /* enable individual interrupt mode for externals */
        ipr_irq_enable_irlm();
        /* register ipr irqs */
-       make_ipr_irq(titan_ipr_map, ARRAY_SIZE(titan_ipr_map));
+       register_ipr_controller(&ipr_irq_desc);
 }
 
-struct sh_machine_vector mv_titan __initmv = {
+static struct sh_machine_vector mv_titan __initmv = {
        .mv_name =      "Titan",
 
        .mv_inb =       titan_inb,
@@ -52,4 +70,3 @@ struct sh_machine_vector mv_titan __initmv = {
 
        .mv_init_irq =  init_titan_irq,
 };
-ALIAS_MV(titan)
diff --git a/arch/sh/boards/unknown/Makefile b/arch/sh/boards/unknown/Makefile
deleted file mode 100644 (file)
index 7d18f40..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Makefile for unknown SH boards 
-#
-
-obj-y   := setup.o
-
diff --git a/arch/sh/boards/unknown/setup.c b/arch/sh/boards/unknown/setup.c
deleted file mode 100644 (file)
index bee4612..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * linux/arch/sh/boards/unknown/setup.c
- *
- * Copyright (C) 2002 Paul Mundt
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * Setup code for an unknown machine (internal peripherals only)
- *
- * This is the simplest of all boards, and serves only as a quick and dirty
- * method to start debugging a new board during bring-up until proper board
- * setup code is written.
- */
-#include <linux/init.h>
-#include <asm/machvec.h>
-
-struct sh_machine_vector mv_unknown __initmv = {
-       .mv_name                = "Unknown",
-};
-ALIAS_MV(unknown)
index 0582ca8346b697e99a21f24208e2c3c22231fe86..2e516e9a6ede5bf7be19ce8a8cf9dd449458eb1e 100644 (file)
@@ -13,10 +13,8 @@ config VOYAGERGX
          are additional GPIO bits that can be used to interface to
          external as well.
 
-# A board must have defined HD6446X_SERIES in order to see these
 config HD6446X_SERIES
-       bool "HD6446x support"
-       default n
+       bool
 
 choice
        prompt "HD6446x options"
@@ -25,7 +23,6 @@ choice
 
 config HD64461
        bool "Hitachi HD64461 companion chip support"
-       depends on CPU_SUBTYPE_SH7709
        ---help---
          The Hitachi HD64461 provides an interface for
          the SH7709 CPU, supporting a LCD controller,
@@ -40,7 +37,6 @@ config HD64461
 
 config HD64465
        bool "Hitachi HD64465 companion chip support"
-       depends on CPU_SUBTYPE_SH7750
        ---help---
          The Hitachi HD64465 provides an interface for
          the SH7750 CPU, supporting a LCD controller,
index 8b6b5a779de8496b709241cfe79ee00ee31cd228..3fdd270eecf71b9fa5680df7d0ef2b34a2524fd7 100644 (file)
@@ -1,15 +1,23 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18
-# Tue Oct  3 10:51:55 2006
+# Linux kernel version: 2.6.22-rc4
+# Sat Jul  7 03:47:45 2007
 #
 CONFIG_SUPERH=y
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_BUG=y
 CONFIG_GENERIC_FIND_NEXT_BIT=y
 CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_SYS_SUPPORTS_PCI=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
@@ -28,6 +36,7 @@ CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 # CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
 # CONFIG_POSIX_MQUEUE is not set
 CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
@@ -35,8 +44,10 @@ CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_UTS_NS is not set
 # CONFIG_AUDIT is not set
 # CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_SYSFS_DEPRECATED=y
 # CONFIG_RELAY is not set
-CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_BLK_DEV_INITRD is not set
 CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 CONFIG_SYSCTL=y
 CONFIG_EMBEDDED=y
@@ -50,14 +61,19 @@ CONFIG_BUG=y
 CONFIG_ELF_CORE=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
+CONFIG_ANON_INODES=y
 CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
 CONFIG_SHMEM=y
-CONFIG_SLAB=y
 CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
 CONFIG_RT_MUTEXES=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
 
 #
 # Loadable module support
@@ -93,44 +109,9 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
 #
 # System type
 #
-# CONFIG_SH_SOLUTION_ENGINE is not set
-# CONFIG_SH_7751_SOLUTION_ENGINE is not set
-# CONFIG_SH_7300_SOLUTION_ENGINE is not set
-# CONFIG_SH_7343_SOLUTION_ENGINE is not set
-# CONFIG_SH_73180_SOLUTION_ENGINE is not set
-# CONFIG_SH_7751_SYSTEMH is not set
-# CONFIG_SH_HP6XX is not set
-# CONFIG_SH_EC3104 is not set
-# CONFIG_SH_SATURN is not set
-CONFIG_SH_DREAMCAST=y
-# CONFIG_SH_BIGSUR is not set
-# CONFIG_SH_MPC1211 is not set
-# CONFIG_SH_SH03 is not set
-# CONFIG_SH_SECUREEDGE5410 is not set
-# CONFIG_SH_HS7751RVOIP is not set
-# CONFIG_SH_7710VOIPGW is not set
-# CONFIG_SH_RTS7751R2D is not set
-# CONFIG_SH_R7780RP is not set
-# CONFIG_SH_EDOSK7705 is not set
-# CONFIG_SH_SH4202_MICRODEV is not set
-# CONFIG_SH_LANDISK is not set
-# CONFIG_SH_TITAN is not set
-# CONFIG_SH_SHMIN is not set
-# CONFIG_SH_UNKNOWN is not set
-
-#
-# Processor selection
-#
 CONFIG_CPU_SH4=y
-
-#
-# SH-2 Processor Support
-#
-# CONFIG_CPU_SUBTYPE_SH7604 is not set
-
-#
-# SH-3 Processor Support
-#
+# CONFIG_CPU_SUBTYPE_SH7619 is not set
+# CONFIG_CPU_SUBTYPE_SH7206 is not set
 # CONFIG_CPU_SUBTYPE_SH7300 is not set
 # CONFIG_CPU_SUBTYPE_SH7705 is not set
 # CONFIG_CPU_SUBTYPE_SH7706 is not set
@@ -138,79 +119,93 @@ CONFIG_CPU_SH4=y
 # CONFIG_CPU_SUBTYPE_SH7708 is not set
 # CONFIG_CPU_SUBTYPE_SH7709 is not set
 # CONFIG_CPU_SUBTYPE_SH7710 is not set
-
-#
-# SH-4 Processor Support
-#
-CONFIG_CPU_SUBTYPE_SH7750=y
+# CONFIG_CPU_SUBTYPE_SH7712 is not set
+# CONFIG_CPU_SUBTYPE_SH7750 is not set
 CONFIG_CPU_SUBTYPE_SH7091=y
-CONFIG_CPU_SUBTYPE_SH7750R=y
+# CONFIG_CPU_SUBTYPE_SH7750R is not set
 # CONFIG_CPU_SUBTYPE_SH7750S is not set
 # CONFIG_CPU_SUBTYPE_SH7751 is not set
 # CONFIG_CPU_SUBTYPE_SH7751R is not set
 # CONFIG_CPU_SUBTYPE_SH7760 is not set
 # CONFIG_CPU_SUBTYPE_SH4_202 is not set
-
-#
-# ST40 Processor Support
-#
 # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
 # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
-
-#
-# SH-4A Processor Support
-#
 # CONFIG_CPU_SUBTYPE_SH7770 is not set
 # CONFIG_CPU_SUBTYPE_SH7780 is not set
-
-#
-# SH4AL-DSP Processor Support
-#
+# CONFIG_CPU_SUBTYPE_SH7785 is not set
+# CONFIG_CPU_SUBTYPE_SHX3 is not set
 # CONFIG_CPU_SUBTYPE_SH73180 is not set
 # CONFIG_CPU_SUBTYPE_SH7343 is not set
+# CONFIG_CPU_SUBTYPE_SH7722 is not set
 
 #
 # Memory management options
 #
+CONFIG_QUICKLIST=y
 CONFIG_MMU=y
 CONFIG_PAGE_OFFSET=0x80000000
 CONFIG_MEMORY_START=0x0c000000
 CONFIG_MEMORY_SIZE=0x01000000
 CONFIG_VSYSCALL=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
+CONFIG_MAX_ACTIVE_REGIONS=1
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_PAGE_SIZE_4KB=y
+# CONFIG_PAGE_SIZE_8KB is not set
+# CONFIG_PAGE_SIZE_64KB is not set
 CONFIG_HUGETLB_PAGE_SIZE_64K=y
+# CONFIG_HUGETLB_PAGE_SIZE_256K is not set
 # CONFIG_HUGETLB_PAGE_SIZE_1MB is not set
+# CONFIG_HUGETLB_PAGE_SIZE_4MB is not set
+# CONFIG_HUGETLB_PAGE_SIZE_64MB is not set
 CONFIG_SELECT_MEMORY_MODEL=y
 CONFIG_FLATMEM_MANUAL=y
 # CONFIG_DISCONTIGMEM_MANUAL is not set
 # CONFIG_SPARSEMEM_MANUAL is not set
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPARSEMEM_STATIC=y
 CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_NR_QUICK=2
 
 #
 # Cache configuration
 #
 # CONFIG_SH_DIRECT_MAPPED is not set
 # CONFIG_SH_WRITETHROUGH is not set
-# CONFIG_SH_OCRAM is not set
 
 #
 # Processor features
 #
 CONFIG_CPU_LITTLE_ENDIAN=y
+# CONFIG_CPU_BIG_ENDIAN is not set
 CONFIG_SH_FPU=y
 # CONFIG_SH_DSP is not set
 CONFIG_SH_STORE_QUEUES=y
 CONFIG_CPU_HAS_INTEVT=y
+CONFIG_CPU_HAS_IPR_IRQ=y
 CONFIG_CPU_HAS_SR_RB=y
+CONFIG_CPU_HAS_PTEA=y
 
 #
-# Timer support
+# Board support
+#
+CONFIG_SH_DREAMCAST=y
+
+#
+# Timer and clock configuration
 #
 CONFIG_SH_TMU=y
+CONFIG_SH_TIMER_IRQ=16
 CONFIG_SH_PCLK_FREQ=49876504
+# CONFIG_TICK_ONESHOT is not set
+# CONFIG_NO_HZ is not set
+# CONFIG_HIGH_RES_TIMERS is not set
 
 #
 # CPU Frequency scaling
@@ -232,6 +227,7 @@ CONFIG_CPU_FREQ_GOV_USERSPACE=y
 #
 # DMA support
 #
+CONFIG_SH_DMA_API=y
 CONFIG_SH_DMA=y
 CONFIG_NR_ONCHIP_DMA_CHANNELS=4
 CONFIG_NR_DMA_CHANNELS_BOOL=y
@@ -240,17 +236,23 @@ CONFIG_NR_DMA_CHANNELS=9
 #
 # Companion Chips
 #
-# CONFIG_HD6446X_SERIES is not set
+
+#
+# Additional SuperH Device Drivers
+#
+# CONFIG_HEARTBEAT is not set
+# CONFIG_PUSH_SWITCH is not set
 
 #
 # Kernel features
 #
 # CONFIG_HZ_100 is not set
 CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
 # CONFIG_HZ_1000 is not set
 CONFIG_HZ=250
 # CONFIG_KEXEC is not set
-# CONFIG_SMP is not set
+# CONFIG_CRASH_DUMP is not set
 # CONFIG_PREEMPT_NONE is not set
 # CONFIG_PREEMPT_VOLUNTARY is not set
 CONFIG_PREEMPT=y
@@ -269,32 +271,22 @@ CONFIG_CMDLINE="console=ttySC1,115200 panic=3"
 # Bus options
 #
 CONFIG_PCI=y
-# CONFIG_SH_PCIDMA_NONCOHERENT is not set
+CONFIG_SH_PCIDMA_NONCOHERENT=y
 CONFIG_PCI_AUTO=y
-# CONFIG_PCI_MULTITHREAD_PROBE is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
 
 #
 # PCCARD (PCMCIA/CardBus) support
 #
 # CONFIG_PCCARD is not set
-
-#
-# PCI Hotplug Support
-#
 # CONFIG_HOTPLUG_PCI is not set
 
 #
 # Executable file formats
 #
 CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_FLAT is not set
 # CONFIG_BINFMT_MISC is not set
 
-#
-# Power management options (EXPERIMENTAL)
-#
-# CONFIG_PM is not set
-
 #
 # Networking
 #
@@ -303,13 +295,13 @@ CONFIG_NET=y
 #
 # Networking options
 #
-# CONFIG_NETDEBUG is not set
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
 CONFIG_UNIX=y
 CONFIG_XFRM=y
 # CONFIG_XFRM_USER is not set
 # CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
 # CONFIG_IP_MULTICAST is not set
@@ -327,30 +319,20 @@ CONFIG_IP_FIB_HASH=y
 # CONFIG_INET_TUNNEL is not set
 CONFIG_INET_XFRM_MODE_TRANSPORT=y
 CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
 CONFIG_INET_DIAG=y
 CONFIG_INET_TCP_DIAG=y
 # CONFIG_TCP_CONG_ADVANCED is not set
 CONFIG_TCP_CONG_CUBIC=y
 CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
 # CONFIG_IPV6 is not set
 # CONFIG_INET6_XFRM_TUNNEL is not set
 # CONFIG_INET6_TUNNEL is not set
 # CONFIG_NETWORK_SECMARK is not set
 # CONFIG_NETFILTER is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
 # CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
 # CONFIG_IP_SCTP is not set
-
-#
-# TIPC Configuration (EXPERIMENTAL)
-#
 # CONFIG_TIPC is not set
 # CONFIG_ATM is not set
 # CONFIG_BRIDGE is not set
@@ -376,7 +358,16 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
 # CONFIG_HAMRADIO is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_MAC80211 is not set
 # CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
 
 #
 # Device Drivers
@@ -394,10 +385,6 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 # Connector - unified userspace <-> kernelspace linker
 #
 # CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
 # CONFIG_MTD is not set
 
 #
@@ -408,6 +395,7 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 #
 # Plug and Play support
 #
+# CONFIG_PNPACPI is not set
 
 #
 # Block devices
@@ -421,13 +409,16 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_CDROM_PKTCDVD is not set
 # CONFIG_ATA_OVER_ETH is not set
 
 #
-# ATA/ATAPI/MFM/RLL support
+# Misc devices
 #
+# CONFIG_PHANTOM is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+# CONFIG_BLINK is not set
 # CONFIG_IDE is not set
 
 #
@@ -436,10 +427,6 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 # CONFIG_RAID_ATTRS is not set
 # CONFIG_SCSI is not set
 # CONFIG_SCSI_NETLINK is not set
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
 # CONFIG_ATA is not set
 
 #
@@ -455,6 +442,7 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 #
 # IEEE 1394 (FireWire) support
 #
+# CONFIG_FIREWIRE is not set
 # CONFIG_IEEE1394 is not set
 
 #
@@ -470,15 +458,7 @@ CONFIG_NETDEVICES=y
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
-
-#
-# ARCnet devices
-#
 # CONFIG_ARCNET is not set
-
-#
-# PHY device support
-#
 # CONFIG_PHYLIB is not set
 
 #
@@ -521,47 +501,16 @@ CONFIG_8139TOO=y
 # CONFIG_SUNDANCE is not set
 # CONFIG_TLAN is not set
 # CONFIG_VIA_RHINE is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-# CONFIG_ACENIC is not set
-# CONFIG_DL2K is not set
-# CONFIG_E1000 is not set
-# CONFIG_NS83820 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_R8169 is not set
-# CONFIG_SIS190 is not set
-# CONFIG_SKGE is not set
-# CONFIG_SKY2 is not set
-# CONFIG_SK98LIN is not set
-# CONFIG_VIA_VELOCITY is not set
-# CONFIG_TIGON3 is not set
-# CONFIG_BNX2 is not set
-# CONFIG_QLA3XXX is not set
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_IXGB is not set
-# CONFIG_S2IO is not set
-# CONFIG_MYRI10GE is not set
-
-#
-# Token Ring devices
-#
+# CONFIG_SC92031 is not set
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
 # CONFIG_TR is not set
 
 #
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
+# Wireless LAN
 #
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
 # CONFIG_WAN is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
@@ -604,17 +553,19 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
 # Input Device Drivers
 #
 CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_ATKBD is not set
 # CONFIG_KEYBOARD_SUNKBD is not set
 # CONFIG_KEYBOARD_LKKBD is not set
 # CONFIG_KEYBOARD_XTKBD is not set
 # CONFIG_KEYBOARD_NEWTON is not set
 # CONFIG_KEYBOARD_STOWAWAY is not set
 CONFIG_INPUT_MOUSE=y
-CONFIG_MOUSE_PS2=y
+# CONFIG_MOUSE_PS2 is not set
 # CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_APPLETOUCH is not set
 # CONFIG_MOUSE_VSXXXAA is not set
 # CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
 # CONFIG_INPUT_TOUCHSCREEN is not set
 # CONFIG_INPUT_MISC is not set
 
@@ -660,10 +611,6 @@ CONFIG_LEGACY_PTY_COUNT=256
 # IPMI
 #
 # CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
 CONFIG_WATCHDOG=y
 # CONFIG_WATCHDOG_NOWAYOUT is not set
 
@@ -680,14 +627,8 @@ CONFIG_SH_WDT=y
 # CONFIG_PCIPCWATCHDOG is not set
 # CONFIG_WDTPCI is not set
 CONFIG_HW_RANDOM=y
-# CONFIG_GEN_RTC is not set
-# CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
-
-#
-# Ftape, the floppy tape device driver
-#
 # CONFIG_DRM is not set
 # CONFIG_RAW_DRIVER is not set
 
@@ -695,11 +636,7 @@ CONFIG_HW_RANDOM=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
-# CONFIG_TELCLOCK is not set
-
-#
-# I2C support
-#
+CONFIG_DEVPORT=y
 # CONFIG_I2C is not set
 
 #
@@ -711,44 +648,51 @@ CONFIG_HW_RANDOM=y
 #
 # Dallas's 1-wire bus
 #
+# CONFIG_W1 is not set
+# CONFIG_HWMON is not set
 
 #
-# Hardware Monitoring support
-#
-CONFIG_HWMON=y
-# CONFIG_HWMON_VID is not set
-# CONFIG_SENSORS_ABITUGURU is not set
-# CONFIG_SENSORS_F71805F is not set
-# CONFIG_SENSORS_VT1211 is not set
-# CONFIG_HWMON_DEBUG_CHIP is not set
-
-#
-# Misc devices
+# Multifunction device drivers
 #
+# CONFIG_MFD_SM501 is not set
 
 #
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
-CONFIG_VIDEO_V4L2=y
+# CONFIG_DVB_CORE is not set
+# CONFIG_DAB is not set
 
 #
-# Digital Video Broadcasting Devices
+# Graphics support
 #
-# CONFIG_DVB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
-# Graphics support
+# Display device support
 #
-CONFIG_FIRMWARE_EDID=y
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
 CONFIG_FB=y
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB_DDC is not set
 CONFIG_FB_CFB_FILLRECT=y
 CONFIG_FB_CFB_COPYAREA=y
 CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SYS_FILLRECT is not set
+# CONFIG_FB_SYS_COPYAREA is not set
+# CONFIG_FB_SYS_IMAGEBLIT is not set
+# CONFIG_FB_SYS_FOPS is not set
+CONFIG_FB_DEFERRED_IO=y
+# CONFIG_FB_SVGALIB is not set
 # CONFIG_FB_MACMODES is not set
 # CONFIG_FB_BACKLIGHT is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
+
+#
+# Frame buffer hardware drivers
+#
 # CONFIG_FB_CIRRUS is not set
 # CONFIG_FB_PM2 is not set
 # CONFIG_FB_CYBER2000 is not set
@@ -763,13 +707,17 @@ CONFIG_FB_PVR2=y
 # CONFIG_FB_RADEON is not set
 # CONFIG_FB_ATY128 is not set
 # CONFIG_FB_ATY is not set
+# CONFIG_FB_S3 is not set
 # CONFIG_FB_SAVAGE is not set
 # CONFIG_FB_SIS is not set
 # CONFIG_FB_NEOMAGIC is not set
 # CONFIG_FB_KYRO is not set
 # CONFIG_FB_3DFX is not set
 # CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_VT8623 is not set
 # CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_ARK is not set
+# CONFIG_FB_PM3 is not set
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -789,10 +737,6 @@ CONFIG_FONT_8x16=y
 # CONFIG_FONT_SUN8x16 is not set
 # CONFIG_FONT_SUN12x22 is not set
 # CONFIG_FONT_10x18 is not set
-
-#
-# Logo configuration
-#
 CONFIG_LOGO=y
 # CONFIG_LOGO_LINUX_MONO is not set
 # CONFIG_LOGO_LINUX_VGA16 is not set
@@ -800,13 +744,18 @@ CONFIG_LOGO=y
 # CONFIG_LOGO_SUPERH_MONO is not set
 # CONFIG_LOGO_SUPERH_VGA16 is not set
 CONFIG_LOGO_SUPERH_CLUT224=y
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
 # Sound
 #
 # CONFIG_SOUND is not set
 
+#
+# HID Devices
+#
+CONFIG_HID=y
+# CONFIG_HID_DEBUG is not set
+
 #
 # USB support
 #
@@ -823,10 +772,6 @@ CONFIG_USB_ARCH_HAS_EHCI=y
 # USB Gadget Support
 #
 # CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
 # CONFIG_MMC is not set
 
 #
@@ -874,10 +819,12 @@ CONFIG_USB_ARCH_HAS_EHCI=y
 #
 # CONFIG_EXT2_FS is not set
 # CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS is not set
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
 # CONFIG_FS_POSIX_ACL is not set
 # CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
 # CONFIG_OCFS2_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
@@ -956,6 +903,11 @@ CONFIG_MSDOS_PARTITION=y
 #
 # CONFIG_NLS is not set
 
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
 #
 # Profiling support
 #
@@ -965,17 +917,18 @@ CONFIG_PROFILING=y
 #
 # Kernel hacking
 #
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
 # CONFIG_PRINTK_TIME is not set
 CONFIG_ENABLE_MUST_CHECK=y
 # CONFIG_MAGIC_SYSRQ is not set
 # CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
 # CONFIG_DEBUG_KERNEL is not set
-CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_FS is not set
 # CONFIG_SH_STANDARD_BIOS is not set
 # CONFIG_EARLY_SCIF_CONSOLE is not set
-# CONFIG_KGDB is not set
+# CONFIG_SH_KGDB is not set
 
 #
 # Security options
@@ -991,8 +944,13 @@ CONFIG_LOG_BUF_SHIFT=14
 #
 # Library routines
 #
+CONFIG_BITREVERSE=y
 # CONFIG_CRC_CCITT is not set
 # CONFIG_CRC16 is not set
+# CONFIG_CRC_ITU_T is not set
 CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
 CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
diff --git a/arch/sh/configs/r7780mp_defconfig b/arch/sh/configs/r7780mp_defconfig
new file mode 100644 (file)
index 0000000..17f7402
--- /dev/null
@@ -0,0 +1,1223 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.22-rc4
+# Mon Jun 11 10:24:57 2007
+#
+CONFIG_SUPERH=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# CONFIG_POSIX_MQUEUE is not set
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_SYSFS_DEPRECATED is not set
+# CONFIG_RELAY is not set
+# CONFIG_BLK_DEV_INITRD is not set
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_UID16=y
+# CONFIG_SYSCTL_SYSCALL is not set
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+# CONFIG_FUTEX is not set
+CONFIG_ANON_INODES=y
+# CONFIG_EPOLL is not set
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# System type
+#
+CONFIG_CPU_SH4=y
+CONFIG_CPU_SH4A=y
+# CONFIG_CPU_SUBTYPE_SH7619 is not set
+# CONFIG_CPU_SUBTYPE_SH7206 is not set
+# CONFIG_CPU_SUBTYPE_SH7300 is not set
+# CONFIG_CPU_SUBTYPE_SH7705 is not set
+# CONFIG_CPU_SUBTYPE_SH7706 is not set
+# CONFIG_CPU_SUBTYPE_SH7707 is not set
+# CONFIG_CPU_SUBTYPE_SH7708 is not set
+# CONFIG_CPU_SUBTYPE_SH7709 is not set
+# CONFIG_CPU_SUBTYPE_SH7710 is not set
+# CONFIG_CPU_SUBTYPE_SH7712 is not set
+# CONFIG_CPU_SUBTYPE_SH7750 is not set
+# CONFIG_CPU_SUBTYPE_SH7091 is not set
+# CONFIG_CPU_SUBTYPE_SH7750R is not set
+# CONFIG_CPU_SUBTYPE_SH7750S is not set
+# CONFIG_CPU_SUBTYPE_SH7751 is not set
+# CONFIG_CPU_SUBTYPE_SH7751R is not set
+# CONFIG_CPU_SUBTYPE_SH7760 is not set
+# CONFIG_CPU_SUBTYPE_SH4_202 is not set
+# CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+# CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+# CONFIG_CPU_SUBTYPE_SH7770 is not set
+CONFIG_CPU_SUBTYPE_SH7780=y
+# CONFIG_CPU_SUBTYPE_SH7785 is not set
+# CONFIG_CPU_SUBTYPE_SH73180 is not set
+# CONFIG_CPU_SUBTYPE_SH7343 is not set
+# CONFIG_CPU_SUBTYPE_SH7722 is not set
+
+#
+# Memory management options
+#
+CONFIG_QUICKLIST=y
+CONFIG_MMU=y
+CONFIG_PAGE_OFFSET=0x80000000
+CONFIG_MEMORY_START=0x08000000
+CONFIG_MEMORY_SIZE=0x08000000
+# CONFIG_32BIT is not set
+CONFIG_VSYSCALL=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
+CONFIG_MAX_ACTIVE_REGIONS=1
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_PAGE_SIZE_4KB=y
+# CONFIG_PAGE_SIZE_8KB is not set
+# CONFIG_PAGE_SIZE_64KB is not set
+CONFIG_HUGETLB_PAGE_SIZE_64K=y
+# CONFIG_HUGETLB_PAGE_SIZE_256K is not set
+# CONFIG_HUGETLB_PAGE_SIZE_1MB is not set
+# CONFIG_HUGETLB_PAGE_SIZE_4MB is not set
+# CONFIG_HUGETLB_PAGE_SIZE_64MB is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_SPARSEMEM_STATIC=y
+CONFIG_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_NR_QUICK=2
+
+#
+# Cache configuration
+#
+# CONFIG_SH_DIRECT_MAPPED is not set
+# CONFIG_SH_WRITETHROUGH is not set
+# CONFIG_SH_OCRAM is not set
+
+#
+# Processor features
+#
+CONFIG_CPU_LITTLE_ENDIAN=y
+# CONFIG_CPU_BIG_ENDIAN is not set
+CONFIG_SH_FPU=y
+# CONFIG_SH_DSP is not set
+CONFIG_SH_STORE_QUEUES=y
+CONFIG_SPECULATIVE_EXECUTION=y
+CONFIG_CPU_HAS_INTEVT=y
+CONFIG_CPU_HAS_INTC2_IRQ=y
+CONFIG_CPU_HAS_SR_RB=y
+
+#
+# Board support
+#
+# CONFIG_SH_7780_SOLUTION_ENGINE is not set
+CONFIG_SH_HIGHLANDER=y
+# CONFIG_SH_R7780RP is not set
+CONFIG_SH_R7780MP=y
+# CONFIG_SH_R7785RP is not set
+
+#
+# Timer and clock configuration
+#
+CONFIG_SH_TMU=y
+CONFIG_SH_TIMER_IRQ=28
+CONFIG_SH_PCLK_FREQ=32000000
+# CONFIG_TICK_ONESHOT is not set
+# CONFIG_NO_HZ is not set
+# CONFIG_HIGH_RES_TIMERS is not set
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ is not set
+
+#
+# DMA support
+#
+# CONFIG_SH_DMA is not set
+
+#
+# Companion Chips
+#
+# CONFIG_HD6446X_SERIES is not set
+
+#
+# Additional SuperH Device Drivers
+#
+# CONFIG_HEARTBEAT is not set
+CONFIG_PUSH_SWITCH=y
+
+#
+# Kernel features
+#
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=250
+CONFIG_KEXEC=y
+# CONFIG_CRASH_DUMP is not set
+# CONFIG_SMP is not set
+# CONFIG_PREEMPT_NONE is not set
+# CONFIG_PREEMPT_VOLUNTARY is not set
+CONFIG_PREEMPT=y
+CONFIG_PREEMPT_BKL=y
+
+#
+# Boot options
+#
+CONFIG_ZERO_PAGE_OFFSET=0x00001000
+CONFIG_BOOT_LINK_OFFSET=0x00800000
+# CONFIG_UBC_WAKEUP is not set
+CONFIG_CMDLINE_BOOL=y
+CONFIG_CMDLINE="console=ttySC0,115200 root=/dev/sda1"
+
+#
+# Bus options
+#
+CONFIG_PCI=y
+CONFIG_SH_PCIDMA_NONCOHERENT=y
+CONFIG_PCI_AUTO=y
+CONFIG_PCI_AUTO_UPDATE_RESOURCES=y
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+# CONFIG_PCI_DEBUG is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options (EXPERIMENTAL)
+#
+# CONFIG_PM is not set
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_ASK_IP_FIB_HASH=y
+# CONFIG_IP_FIB_TRIE is not set
+CONFIG_IP_FIB_HASH=y
+# CONFIG_IP_MULTIPLE_TABLES is not set
+# CONFIG_IP_ROUTE_MULTIPATH is not set
+# CONFIG_IP_ROUTE_VERBOSE is not set
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+CONFIG_BRIDGE=m
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+CONFIG_LLC=m
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+CONFIG_WIRELESS_EXT=y
+# CONFIG_MAC80211 is not set
+# CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=m
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_SX8 is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# Misc devices
+#
+# CONFIG_PHANTOM is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+# CONFIG_BLINK is not set
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=y
+# CONFIG_SCSI_TGT is not set
+# CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_BLK_DEV_SR is not set
+CONFIG_CHR_DEV_SG=m
+# CONFIG_CHR_DEV_SCH is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+CONFIG_SCSI_WAIT_SCAN=m
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+# CONFIG_SCSI_3W_9XXX is not set
+# CONFIG_SCSI_ACARD is not set
+# CONFIG_SCSI_AACRAID is not set
+# CONFIG_SCSI_AIC7XXX is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_AIC79XX is not set
+# CONFIG_SCSI_AIC94XX is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_ARCMSR is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+# CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
+# CONFIG_SCSI_HPTIOP is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_STEX is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_IPR is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_QLA_FC is not set
+# CONFIG_SCSI_QLA_ISCSI is not set
+# CONFIG_SCSI_LPFC is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_DEBUG is not set
+# CONFIG_SCSI_SRP is not set
+CONFIG_ATA=y
+# CONFIG_ATA_NONSTANDARD is not set
+# CONFIG_SATA_AHCI is not set
+# CONFIG_SATA_SVW is not set
+# CONFIG_ATA_PIIX is not set
+# CONFIG_SATA_MV is not set
+# CONFIG_SATA_NV is not set
+# CONFIG_PDC_ADMA is not set
+# CONFIG_SATA_QSTOR is not set
+# CONFIG_SATA_PROMISE is not set
+# CONFIG_SATA_SX4 is not set
+CONFIG_SATA_SIL=y
+# CONFIG_SATA_SIL24 is not set
+# CONFIG_SATA_SIS is not set
+# CONFIG_SATA_ULI is not set
+# CONFIG_SATA_VIA is not set
+# CONFIG_SATA_VITESSE is not set
+# CONFIG_SATA_INIC162X is not set
+# CONFIG_PATA_ALI is not set
+# CONFIG_PATA_AMD is not set
+# CONFIG_PATA_ARTOP is not set
+# CONFIG_PATA_ATIIXP is not set
+# CONFIG_PATA_CMD640_PCI is not set
+# CONFIG_PATA_CMD64X is not set
+# CONFIG_PATA_CS5520 is not set
+# CONFIG_PATA_CS5530 is not set
+# CONFIG_PATA_CYPRESS is not set
+# CONFIG_PATA_EFAR is not set
+# CONFIG_ATA_GENERIC is not set
+# CONFIG_PATA_HPT366 is not set
+# CONFIG_PATA_HPT37X is not set
+# CONFIG_PATA_HPT3X2N is not set
+# CONFIG_PATA_HPT3X3 is not set
+# CONFIG_PATA_IT821X is not set
+# CONFIG_PATA_IT8213 is not set
+# CONFIG_PATA_JMICRON is not set
+# CONFIG_PATA_TRIFLEX is not set
+# CONFIG_PATA_MARVELL is not set
+# CONFIG_PATA_MPIIX is not set
+# CONFIG_PATA_OLDPIIX is not set
+# CONFIG_PATA_NETCELL is not set
+# CONFIG_PATA_NS87410 is not set
+# CONFIG_PATA_OPTI is not set
+# CONFIG_PATA_OPTIDMA is not set
+# CONFIG_PATA_PDC_OLD is not set
+# CONFIG_PATA_RADISYS is not set
+# CONFIG_PATA_RZ1000 is not set
+# CONFIG_PATA_SC1200 is not set
+# CONFIG_PATA_SERVERWORKS is not set
+# CONFIG_PATA_PDC2027X is not set
+# CONFIG_PATA_SIL680 is not set
+# CONFIG_PATA_SIS is not set
+# CONFIG_PATA_VIA is not set
+# CONFIG_PATA_WINBOND is not set
+CONFIG_PATA_PLATFORM=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+# CONFIG_FUSION_SPI is not set
+# CONFIG_FUSION_FC is not set
+# CONFIG_FUSION_SAS is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+# CONFIG_FIREWIRE is not set
+# CONFIG_IEEE1394 is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_ARCNET is not set
+# CONFIG_PHYLIB is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_STNIC is not set
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_CASSINI is not set
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_SMC91X is not set
+
+#
+# Tulip family network device support
+#
+# CONFIG_NET_TULIP is not set
+# CONFIG_HP100 is not set
+CONFIG_NET_PCI=y
+CONFIG_PCNET32=m
+# CONFIG_PCNET32_NAPI is not set
+# CONFIG_AMD8111_ETH is not set
+# CONFIG_ADAPTEC_STARFIRE is not set
+# CONFIG_B44 is not set
+# CONFIG_FORCEDETH is not set
+# CONFIG_DGRS is not set
+# CONFIG_EEPRO100 is not set
+# CONFIG_E100 is not set
+# CONFIG_FEALNX is not set
+# CONFIG_NATSEMI is not set
+# CONFIG_NE2K_PCI is not set
+CONFIG_8139CP=m
+CONFIG_8139TOO=m
+# CONFIG_8139TOO_PIO is not set
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+CONFIG_8139TOO_8129=y
+# CONFIG_8139_OLD_RX_RESET is not set
+# CONFIG_SIS900 is not set
+# CONFIG_EPIC100 is not set
+# CONFIG_SUNDANCE is not set
+# CONFIG_TLAN is not set
+CONFIG_VIA_RHINE=m
+CONFIG_VIA_RHINE_MMIO=y
+# CONFIG_VIA_RHINE_NAPI is not set
+# CONFIG_SC92031 is not set
+CONFIG_NETDEV_1000=y
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+CONFIG_E1000=m
+# CONFIG_E1000_NAPI is not set
+# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
+# CONFIG_NS83820 is not set
+# CONFIG_HAMACHI is not set
+# CONFIG_YELLOWFIN is not set
+CONFIG_R8169=y
+# CONFIG_R8169_NAPI is not set
+# CONFIG_SIS190 is not set
+# CONFIG_SKGE is not set
+# CONFIG_SKY2 is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_VIA_VELOCITY is not set
+# CONFIG_TIGON3 is not set
+# CONFIG_BNX2 is not set
+# CONFIG_QLA3XXX is not set
+# CONFIG_ATL1 is not set
+CONFIG_NETDEV_10000=y
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_CHELSIO_T3 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC is not set
+# CONFIG_MLX4_CORE is not set
+# CONFIG_TR is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
+# CONFIG_WAN is not set
+# CONFIG_FDDI is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NET_FC is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+# CONFIG_SERIO_I8042 is not set
+# CONFIG_SERIO_SERPORT is not set
+# CONFIG_SERIO_PCIPS2 is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+# CONFIG_VT is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_SH_SCI=y
+CONFIG_SERIAL_SH_SCI_NR_UARTS=2
+CONFIG_SERIAL_SH_SCI_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_JSM is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+CONFIG_DEVPORT=y
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_W83627HF is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+CONFIG_DAB=y
+
+#
+# Graphics support
+#
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
+# CONFIG_FB is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=m
+
+#
+# Advanced Linux Sound Architecture
+#
+# CONFIG_SND is not set
+
+#
+# Open Sound System
+#
+CONFIG_SOUND_PRIME=m
+# CONFIG_OSS_OBSOLETE is not set
+# CONFIG_SOUND_TRIDENT is not set
+# CONFIG_SOUND_MSNDCLAS is not set
+# CONFIG_SOUND_MSNDPIN is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=y
+# CONFIG_HID_DEBUG is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=y
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+# CONFIG_RTC_DRV_TEST is not set
+
+#
+# I2C RTC drivers
+#
+
+#
+# SPI RTC drivers
+#
+
+#
+# Platform RTC drivers
+#
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+CONFIG_RTC_DRV_SH=y
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
+# CONFIG_EXT4DEV_FS is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+CONFIG_FS_POSIX_ACL=y
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+CONFIG_MINIX_FS=y
+# CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+CONFIG_NTFS_FS=y
+# CONFIG_NTFS_DEBUG is not set
+CONFIG_NTFS_RW=y
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+CONFIG_HUGETLBFS=y
+CONFIG_HUGETLB_PAGE=y
+CONFIG_RAMFS=y
+CONFIG_CONFIGFS_FS=m
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+CONFIG_NFS_V4=y
+# CONFIG_NFS_DIRECTIO is not set
+CONFIG_NFSD=y
+CONFIG_NFSD_V3=y
+# CONFIG_NFSD_V3_ACL is not set
+CONFIG_NFSD_V4=y
+CONFIG_NFSD_TCP=y
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+# CONFIG_SUNRPC_BIND34 is not set
+CONFIG_RPCSEC_GSS_KRB5=y
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+CONFIG_NLS_CODEPAGE_932=y
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=y
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+
+#
+# Kernel hacking
+#
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_PREEMPT is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_FRAME_POINTER is not set
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_SH_STANDARD_BIOS=y
+# CONFIG_EARLY_SCIF_CONSOLE is not set
+CONFIG_EARLY_PRINTK=y
+# CONFIG_DEBUG_BOOTMEM is not set
+CONFIG_DEBUG_STACKOVERFLOW=y
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_4KSTACKS is not set
+# CONFIG_SH_KGDB is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_HMAC=y
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_CRYPTD is not set
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
index 0f5ec649daf8cd1a97b648b1706ba4c2e2ffe6c8..5c29338532da14209164a5c1366058cd8f606601 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.21-rc3
-# Mon Mar 12 14:26:33 2007
+# Linux kernel version: 2.6.22-rc4
+# Thu Jul 12 12:33:15 2007
 #
 CONFIG_SUPERH=y
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
@@ -11,7 +11,9 @@ CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
-# CONFIG_GENERIC_TIME is not set
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_SYS_SUPPORTS_PCI=y
 CONFIG_STACKTRACE_SUPPORT=y
 CONFIG_LOCKDEP_SUPPORT=y
 # CONFIG_ARCH_HAS_ILOG2_U32 is not set
@@ -43,6 +45,7 @@ CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_AUDIT is not set
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_SYSFS_DEPRECATED is not set
 # CONFIG_RELAY is not set
 # CONFIG_BLK_DEV_INITRD is not set
@@ -60,13 +63,18 @@ CONFIG_BUG=y
 CONFIG_ELF_CORE=y
 CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
+CONFIG_ANON_INODES=y
 # CONFIG_EPOLL is not set
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
 CONFIG_SHMEM=y
-CONFIG_SLAB=y
 CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
 
 #
 # Loadable module support
@@ -102,55 +110,11 @@ CONFIG_DEFAULT_IOSCHED="noop"
 #
 # System type
 #
-# CONFIG_SH_SOLUTION_ENGINE is not set
-# CONFIG_SH_7751_SOLUTION_ENGINE is not set
-# CONFIG_SH_7300_SOLUTION_ENGINE is not set
-# CONFIG_SH_7343_SOLUTION_ENGINE is not set
-# CONFIG_SH_73180_SOLUTION_ENGINE is not set
-# CONFIG_SH_7751_SYSTEMH is not set
-# CONFIG_SH_HP6XX is not set
-# CONFIG_SH_SATURN is not set
-# CONFIG_SH_DREAMCAST is not set
-# CONFIG_SH_MPC1211 is not set
-# CONFIG_SH_SH03 is not set
-# CONFIG_SH_SECUREEDGE5410 is not set
-# CONFIG_SH_HS7751RVOIP is not set
-# CONFIG_SH_7710VOIPGW is not set
-# CONFIG_SH_RTS7751R2D is not set
-CONFIG_SH_HIGHLANDER=y
-# CONFIG_SH_EDOSK7705 is not set
-# CONFIG_SH_SH4202_MICRODEV is not set
-# CONFIG_SH_LANDISK is not set
-# CONFIG_SH_TITAN is not set
-# CONFIG_SH_SHMIN is not set
-# CONFIG_SH_7206_SOLUTION_ENGINE is not set
-# CONFIG_SH_7619_SOLUTION_ENGINE is not set
-# CONFIG_SH_UNKNOWN is not set
-# CONFIG_SH_R7780RP is not set
-# CONFIG_SH_R7780MP is not set
-CONFIG_SH_R7785RP=y
-
-#
-# Processor selection
-#
 CONFIG_CPU_SH4=y
 CONFIG_CPU_SH4A=y
 CONFIG_CPU_SHX2=y
-
-#
-# SH-2 Processor Support
-#
-# CONFIG_CPU_SUBTYPE_SH7604 is not set
 # CONFIG_CPU_SUBTYPE_SH7619 is not set
-
-#
-# SH-2A Processor Support
-#
 # CONFIG_CPU_SUBTYPE_SH7206 is not set
-
-#
-# SH-3 Processor Support
-#
 # CONFIG_CPU_SUBTYPE_SH7300 is not set
 # CONFIG_CPU_SUBTYPE_SH7705 is not set
 # CONFIG_CPU_SUBTYPE_SH7706 is not set
@@ -158,10 +122,7 @@ CONFIG_CPU_SHX2=y
 # CONFIG_CPU_SUBTYPE_SH7708 is not set
 # CONFIG_CPU_SUBTYPE_SH7709 is not set
 # CONFIG_CPU_SUBTYPE_SH7710 is not set
-
-#
-# SH-4 Processor Support
-#
+# CONFIG_CPU_SUBTYPE_SH7712 is not set
 # CONFIG_CPU_SUBTYPE_SH7750 is not set
 # CONFIG_CPU_SUBTYPE_SH7091 is not set
 # CONFIG_CPU_SUBTYPE_SH7750R is not set
@@ -170,23 +131,12 @@ CONFIG_CPU_SHX2=y
 # CONFIG_CPU_SUBTYPE_SH7751R is not set
 # CONFIG_CPU_SUBTYPE_SH7760 is not set
 # CONFIG_CPU_SUBTYPE_SH4_202 is not set
-
-#
-# ST40 Processor Support
-#
 # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
 # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
-
-#
-# SH-4A Processor Support
-#
 # CONFIG_CPU_SUBTYPE_SH7770 is not set
 # CONFIG_CPU_SUBTYPE_SH7780 is not set
 CONFIG_CPU_SUBTYPE_SH7785=y
-
-#
-# SH4AL-DSP Processor Support
-#
+# CONFIG_CPU_SUBTYPE_SHX3 is not set
 # CONFIG_CPU_SUBTYPE_SH73180 is not set
 # CONFIG_CPU_SUBTYPE_SH7343 is not set
 # CONFIG_CPU_SUBTYPE_SH7722 is not set
@@ -194,6 +144,7 @@ CONFIG_CPU_SUBTYPE_SH7785=y
 #
 # Memory management options
 #
+CONFIG_QUICKLIST=y
 CONFIG_MMU=y
 CONFIG_PAGE_OFFSET=0x80000000
 CONFIG_MEMORY_START=0x08000000
@@ -201,6 +152,12 @@ CONFIG_MEMORY_SIZE=0x08000000
 CONFIG_32BIT=y
 # CONFIG_X2TLB is not set
 CONFIG_VSYSCALL=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
+CONFIG_MAX_ACTIVE_REGIONS=1
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
 CONFIG_PAGE_SIZE_4KB=y
 # CONFIG_PAGE_SIZE_8KB is not set
 # CONFIG_PAGE_SIZE_64KB is not set
@@ -215,17 +172,17 @@ CONFIG_FLATMEM_MANUAL=y
 # CONFIG_SPARSEMEM_MANUAL is not set
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPARSEMEM_STATIC=y
 CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_RESOURCES_64BIT is not set
 CONFIG_ZONE_DMA_FLAG=0
+CONFIG_NR_QUICK=2
 
 #
 # Cache configuration
 #
 # CONFIG_SH_DIRECT_MAPPED is not set
 # CONFIG_SH_WRITETHROUGH is not set
-# CONFIG_SH_OCRAM is not set
 
 #
 # Processor features
@@ -240,13 +197,23 @@ CONFIG_CPU_HAS_INTC2_IRQ=y
 CONFIG_CPU_HAS_SR_RB=y
 CONFIG_CPU_HAS_PTEA=y
 
+#
+# Board support
+#
+CONFIG_SH_HIGHLANDER=y
+# CONFIG_SH_R7780RP is not set
+# CONFIG_SH_R7780MP is not set
+CONFIG_SH_R7785RP=y
+
 #
 # Timer and clock configuration
 #
 CONFIG_SH_TMU=y
 CONFIG_SH_TIMER_IRQ=28
-CONFIG_NO_IDLE_HZ=y
 CONFIG_SH_PCLK_FREQ=50000000
+# CONFIG_TICK_ONESHOT is not set
+# CONFIG_NO_HZ is not set
+# CONFIG_HIGH_RES_TIMERS is not set
 
 #
 # CPU Frequency scaling
@@ -261,7 +228,6 @@ CONFIG_SH_PCLK_FREQ=50000000
 #
 # Companion Chips
 #
-# CONFIG_HD6446X_SERIES is not set
 
 #
 # Additional SuperH Device Drivers
@@ -278,7 +244,7 @@ CONFIG_HZ_250=y
 # CONFIG_HZ_1000 is not set
 CONFIG_HZ=250
 CONFIG_KEXEC=y
-# CONFIG_SMP is not set
+# CONFIG_CRASH_DUMP is not set
 # CONFIG_PREEMPT_NONE is not set
 # CONFIG_PREEMPT_VOLUNTARY is not set
 CONFIG_PREEMPT=y
@@ -300,30 +266,21 @@ CONFIG_PCI=y
 CONFIG_SH_PCIDMA_NONCOHERENT=y
 CONFIG_PCI_AUTO=y
 CONFIG_PCI_AUTO_UPDATE_RESOURCES=y
+# CONFIG_ARCH_SUPPORTS_MSI is not set
 # CONFIG_PCI_DEBUG is not set
 
 #
 # PCCARD (PCMCIA/CardBus) support
 #
 # CONFIG_PCCARD is not set
-
-#
-# PCI Hotplug Support
-#
 # CONFIG_HOTPLUG_PCI is not set
 
 #
 # Executable file formats
 #
 CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_FLAT is not set
 # CONFIG_BINFMT_MISC is not set
 
-#
-# Power management options (EXPERIMENTAL)
-#
-# CONFIG_PM is not set
-
 #
 # Networking
 #
@@ -332,7 +289,6 @@ CONFIG_NET=y
 #
 # Networking options
 #
-# CONFIG_NETDEBUG is not set
 CONFIG_PACKET=y
 # CONFIG_PACKET_MMAP is not set
 CONFIG_UNIX=y
@@ -377,20 +333,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
 # CONFIG_INET6_TUNNEL is not set
 # CONFIG_NETWORK_SECMARK is not set
 # CONFIG_NETFILTER is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
 # CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
 # CONFIG_IP_SCTP is not set
-
-#
-# TIPC Configuration (EXPERIMENTAL)
-#
 # CONFIG_TIPC is not set
 # CONFIG_ATM is not set
 CONFIG_BRIDGE=m
@@ -417,8 +361,16 @@ CONFIG_LLC=m
 # CONFIG_HAMRADIO is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
+# CONFIG_AF_RXRPC is not set
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
 CONFIG_WIRELESS_EXT=y
+# CONFIG_MAC80211 is not set
+# CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
 
 #
 # Device Drivers
@@ -438,10 +390,6 @@ CONFIG_FW_LOADER=m
 # Connector - unified userspace <-> kernelspace linker
 #
 # CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
 # CONFIG_MTD is not set
 
 #
@@ -475,12 +423,10 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
 #
 # Misc devices
 #
+# CONFIG_PHANTOM is not set
 # CONFIG_SGI_IOC4 is not set
 # CONFIG_TIFM_CORE is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
+# CONFIG_BLINK is not set
 # CONFIG_IDE is not set
 
 #
@@ -509,6 +455,7 @@ CONFIG_CHR_DEV_SG=m
 # CONFIG_SCSI_CONSTANTS is not set
 # CONFIG_SCSI_LOGGING is not set
 # CONFIG_SCSI_SCAN_ASYNC is not set
+CONFIG_SCSI_WAIT_SCAN=m
 
 #
 # SCSI Transports
@@ -554,10 +501,6 @@ CONFIG_CHR_DEV_SG=m
 # CONFIG_SCSI_NSP32 is not set
 # CONFIG_SCSI_DEBUG is not set
 # CONFIG_SCSI_SRP is not set
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
 CONFIG_ATA=y
 # CONFIG_ATA_NONSTANDARD is not set
 # CONFIG_SATA_AHCI is not set
@@ -580,6 +523,7 @@ CONFIG_SATA_SIL=y
 # CONFIG_PATA_AMD is not set
 # CONFIG_PATA_ARTOP is not set
 # CONFIG_PATA_ATIIXP is not set
+# CONFIG_PATA_CMD640_PCI is not set
 # CONFIG_PATA_CMD64X is not set
 # CONFIG_PATA_CS5520 is not set
 # CONFIG_PATA_CS5530 is not set
@@ -629,6 +573,7 @@ CONFIG_PATA_PLATFORM=y
 #
 # IEEE 1394 (FireWire) support
 #
+# CONFIG_FIREWIRE is not set
 # CONFIG_IEEE1394 is not set
 
 #
@@ -644,15 +589,7 @@ CONFIG_NETDEVICES=y
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
-
-#
-# ARCnet devices
-#
 # CONFIG_ARCNET is not set
-
-#
-# PHY device support
-#
 # CONFIG_PHYLIB is not set
 
 #
@@ -673,10 +610,7 @@ CONFIG_MII=y
 # CONFIG_NET_TULIP is not set
 # CONFIG_HP100 is not set
 # CONFIG_NET_PCI is not set
-
-#
-# Ethernet (1000 Mbit)
-#
+CONFIG_NETDEV_1000=y
 # CONFIG_ACENIC is not set
 # CONFIG_DL2K is not set
 # CONFIG_E1000 is not set
@@ -689,55 +623,26 @@ CONFIG_R8169=y
 # CONFIG_SKGE is not set
 # CONFIG_SKY2 is not set
 # CONFIG_SK98LIN is not set
+# CONFIG_VIA_VELOCITY is not set
 # CONFIG_TIGON3 is not set
 # CONFIG_BNX2 is not set
 # CONFIG_QLA3XXX is not set
 # CONFIG_ATL1 is not set
-
-#
-# Ethernet (10000 Mbit)
-#
+CONFIG_NETDEV_10000=y
 # CONFIG_CHELSIO_T1 is not set
 # CONFIG_CHELSIO_T3 is not set
 # CONFIG_IXGB is not set
 # CONFIG_S2IO is not set
 # CONFIG_MYRI10GE is not set
 # CONFIG_NETXEN_NIC is not set
-
-#
-# Token Ring devices
-#
+# CONFIG_MLX4_CORE is not set
 # CONFIG_TR is not set
 
 #
-# Wireless LAN (non-hamradio)
-#
-CONFIG_NET_RADIO=y
-# CONFIG_NET_WIRELESS_RTNETLINK is not set
-
-#
-# Obsolete Wireless cards support (pre-802.11)
-#
-# CONFIG_STRIP is not set
-
-#
-# Wireless 802.11b ISA/PCI cards support
-#
-# CONFIG_IPW2100 is not set
-# CONFIG_IPW2200 is not set
-# CONFIG_HERMES is not set
-# CONFIG_ATMEL is not set
-
-#
-# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
-#
-# CONFIG_PRISM54 is not set
-# CONFIG_HOSTAP is not set
-CONFIG_NET_WIRELESS=y
-
-#
-# Wan interfaces
+# Wireless LAN
 #
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
 # CONFIG_WAN is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
@@ -789,6 +694,7 @@ CONFIG_KEYBOARD_ATKBD=y
 # CONFIG_KEYBOARD_STOWAWAY is not set
 # CONFIG_INPUT_MOUSE is not set
 # CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
 # CONFIG_INPUT_TOUCHSCREEN is not set
 # CONFIG_INPUT_MISC is not set
 
@@ -831,14 +737,8 @@ CONFIG_LEGACY_PTY_COUNT=256
 # IPMI
 #
 # CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
 # CONFIG_WATCHDOG is not set
 CONFIG_HW_RANDOM=y
-# CONFIG_GEN_RTC is not set
-# CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
 # CONFIG_DRM is not set
@@ -848,10 +748,7 @@ CONFIG_HW_RANDOM=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
-
-#
-# I2C support
-#
+CONFIG_DEVPORT=y
 # CONFIG_I2C is not set
 
 #
@@ -864,16 +761,15 @@ CONFIG_HW_RANDOM=y
 # Dallas's 1-wire bus
 #
 # CONFIG_W1 is not set
-
-#
-# Hardware Monitoring support
-#
 CONFIG_HWMON=y
 # CONFIG_HWMON_VID is not set
 # CONFIG_SENSORS_ABITUGURU is not set
 # CONFIG_SENSORS_F71805F is not set
 # CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
 # CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_W83627HF is not set
 # CONFIG_HWMON_DEBUG_CHIP is not set
 
 #
@@ -885,22 +781,30 @@ CONFIG_HWMON=y
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+# CONFIG_DAB is not set
 
 #
-# Digital Video Broadcasting Devices
+# Graphics support
 #
-# CONFIG_DVB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
-# Graphics support
+# Display device support
 #
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
 CONFIG_FB=y
 # CONFIG_FIRMWARE_EDID is not set
 # CONFIG_FB_DDC is not set
 # CONFIG_FB_CFB_FILLRECT is not set
 # CONFIG_FB_CFB_COPYAREA is not set
 # CONFIG_FB_CFB_IMAGEBLIT is not set
+# CONFIG_FB_SYS_FILLRECT is not set
+# CONFIG_FB_SYS_COPYAREA is not set
+# CONFIG_FB_SYS_IMAGEBLIT is not set
+# CONFIG_FB_SYS_FOPS is not set
+CONFIG_FB_DEFERRED_IO=y
 # CONFIG_FB_SVGALIB is not set
 # CONFIG_FB_MACMODES is not set
 # CONFIG_FB_BACKLIGHT is not set
@@ -908,7 +812,7 @@ CONFIG_FB=y
 # CONFIG_FB_TILEBLITTING is not set
 
 #
-# Frambuffer hardware drivers
+# Frambuffer hardware drivers
 #
 # CONFIG_FB_CIRRUS is not set
 # CONFIG_FB_PM2 is not set
@@ -930,12 +834,11 @@ CONFIG_FB=y
 # CONFIG_FB_KYRO is not set
 # CONFIG_FB_3DFX is not set
 # CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_VT8623 is not set
 # CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_ARK is not set
+# CONFIG_FB_PM3 is not set
 # CONFIG_FB_VIRTUAL is not set
-
-#
-# Logo configuration
-#
 # CONFIG_LOGO is not set
 
 #
@@ -952,13 +855,10 @@ CONFIG_SOUND=m
 # Open Sound System
 #
 CONFIG_SOUND_PRIME=m
-# CONFIG_OBSOLETE_OSS is not set
-# CONFIG_SOUND_BT878 is not set
-# CONFIG_SOUND_ICH is not set
+# CONFIG_OSS_OBSOLETE is not set
 # CONFIG_SOUND_TRIDENT is not set
 # CONFIG_SOUND_MSNDCLAS is not set
 # CONFIG_SOUND_MSNDPIN is not set
-# CONFIG_SOUND_VIA82CXXX is not set
 
 #
 # HID Devices
@@ -982,10 +882,6 @@ CONFIG_USB_ARCH_HAS_EHCI=y
 # USB Gadget Support
 #
 # CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
 # CONFIG_MMC is not set
 
 #
@@ -1026,17 +922,29 @@ CONFIG_RTC_INTF_SYSFS=y
 CONFIG_RTC_INTF_PROC=y
 CONFIG_RTC_INTF_DEV=y
 # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+# CONFIG_RTC_DRV_TEST is not set
+
+#
+# I2C RTC drivers
+#
 
 #
-# RTC drivers
+# SPI RTC drivers
+#
+
+#
+# Platform RTC drivers
 #
 # CONFIG_RTC_DRV_DS1553 is not set
 # CONFIG_RTC_DRV_DS1742 is not set
 # CONFIG_RTC_DRV_M48T86 is not set
-CONFIG_RTC_DRV_SH=y
-# CONFIG_RTC_DRV_TEST is not set
 # CONFIG_RTC_DRV_V3020 is not set
 
+#
+# on-CPU RTC drivers
+#
+CONFIG_RTC_DRV_SH=y
+
 #
 # DMA Engine support
 #
@@ -1050,14 +958,6 @@ CONFIG_RTC_DRV_SH=y
 # DMA Devices
 #
 
-#
-# Auxiliary Display support
-#
-
-#
-# Virtualization
-#
-
 #
 # File systems
 #
@@ -1157,6 +1057,7 @@ CONFIG_EXPORTFS=y
 CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
 CONFIG_SUNRPC_GSS=y
+# CONFIG_SUNRPC_BIND34 is not set
 CONFIG_RPCSEC_GSS_KRB5=y
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
 # CONFIG_SMB_FS is not set
@@ -1239,7 +1140,6 @@ CONFIG_DEBUG_FS=y
 # CONFIG_HEADERS_CHECK is not set
 CONFIG_DEBUG_KERNEL=y
 # CONFIG_DEBUG_SHIRQ is not set
-CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DETECT_SOFTLOCKUP is not set
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_TIMER_STATS is not set
@@ -1266,6 +1166,7 @@ CONFIG_FORCED_INLINING=y
 CONFIG_SH_STANDARD_BIOS=y
 # CONFIG_EARLY_SCIF_CONSOLE is not set
 CONFIG_EARLY_PRINTK=y
+# CONFIG_DEBUG_BOOTMEM is not set
 CONFIG_DEBUG_STACKOVERFLOW=y
 CONFIG_DEBUG_STACK_USAGE=y
 # CONFIG_4KSTACKS is not set
@@ -1300,6 +1201,7 @@ CONFIG_CRYPTO_ECB=m
 CONFIG_CRYPTO_CBC=y
 CONFIG_CRYPTO_PCBC=m
 # CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_CRYPTD is not set
 CONFIG_CRYPTO_DES=y
 # CONFIG_CRYPTO_FCRYPT is not set
 # CONFIG_CRYPTO_BLOWFISH is not set
@@ -1328,7 +1230,9 @@ CONFIG_CRYPTO_DES=y
 CONFIG_BITREVERSE=y
 # CONFIG_CRC_CCITT is not set
 # CONFIG_CRC16 is not set
+# CONFIG_CRC_ITU_T is not set
 CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
 CONFIG_HAS_IOMEM=y
 CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
index 87ab9080fd1db3b5a4a26cdca8e686e4e6c20709..f2f2a3c9c32db0456504ac8c8e10e64bf05c91bb 100644 (file)
@@ -1,18 +1,22 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.19
-# Wed Dec  6 14:40:15 2006
+# Linux kernel version: 2.6.22-rc4
+# Fri Jun 15 19:37:46 2007
 #
 CONFIG_SUPERH=y
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_BUG=y
 CONFIG_GENERIC_FIND_NEXT_BIT=y
 CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 # CONFIG_GENERIC_TIME is not set
+# CONFIG_GENERIC_CLOCKEVENTS is not set
 CONFIG_STACKTRACE_SUPPORT=y
 CONFIG_LOCKDEP_SUPPORT=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
@@ -34,8 +38,10 @@ CONFIG_LOCALVERSION=""
 # CONFIG_UTS_NS is not set
 # CONFIG_AUDIT is not set
 # CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_SYSFS_DEPRECATED=y
 # CONFIG_RELAY is not set
-CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_BLK_DEV_INITRD is not set
 CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 CONFIG_SYSCTL=y
 CONFIG_EMBEDDED=y
@@ -48,12 +54,17 @@ CONFIG_BUG=y
 # CONFIG_ELF_CORE is not set
 # CONFIG_BASE_FULL is not set
 # CONFIG_FUTEX is not set
+CONFIG_ANON_INODES=y
 # CONFIG_EPOLL is not set
-CONFIG_SLAB=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
 # CONFIG_VM_EVENT_COUNTERS is not set
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
 CONFIG_TINY_SHMEM=y
 CONFIG_BASE_SMALL=1
-# CONFIG_SLOB is not set
 
 #
 # Loadable module support
@@ -83,53 +94,10 @@ CONFIG_DEFAULT_IOSCHED="noop"
 #
 # System type
 #
-# CONFIG_SH_SOLUTION_ENGINE is not set
-# CONFIG_SH_7751_SOLUTION_ENGINE is not set
-# CONFIG_SH_7300_SOLUTION_ENGINE is not set
-# CONFIG_SH_7343_SOLUTION_ENGINE is not set
-# CONFIG_SH_73180_SOLUTION_ENGINE is not set
-# CONFIG_SH_7751_SYSTEMH is not set
-# CONFIG_SH_HP6XX is not set
-# CONFIG_SH_EC3104 is not set
-# CONFIG_SH_SATURN is not set
-# CONFIG_SH_DREAMCAST is not set
-# CONFIG_SH_BIGSUR is not set
-# CONFIG_SH_MPC1211 is not set
-# CONFIG_SH_SH03 is not set
-# CONFIG_SH_SECUREEDGE5410 is not set
-# CONFIG_SH_HS7751RVOIP is not set
-# CONFIG_SH_7710VOIPGW is not set
-# CONFIG_SH_RTS7751R2D is not set
-# CONFIG_SH_R7780RP is not set
-# CONFIG_SH_EDOSK7705 is not set
-# CONFIG_SH_SH4202_MICRODEV is not set
-# CONFIG_SH_LANDISK is not set
-# CONFIG_SH_TITAN is not set
-# CONFIG_SH_SHMIN is not set
-CONFIG_SH_7206_SOLUTION_ENGINE=y
-# CONFIG_SH_7619_SOLUTION_ENGINE is not set
-# CONFIG_SH_UNKNOWN is not set
-
-#
-# Processor selection
-#
 CONFIG_CPU_SH2=y
 CONFIG_CPU_SH2A=y
-
-#
-# SH-2 Processor Support
-#
-# CONFIG_CPU_SUBTYPE_SH7604 is not set
 # CONFIG_CPU_SUBTYPE_SH7619 is not set
-
-#
-# SH-2A Processor Support
-#
 CONFIG_CPU_SUBTYPE_SH7206=y
-
-#
-# SH-3 Processor Support
-#
 # CONFIG_CPU_SUBTYPE_SH7300 is not set
 # CONFIG_CPU_SUBTYPE_SH7705 is not set
 # CONFIG_CPU_SUBTYPE_SH7706 is not set
@@ -137,10 +105,7 @@ CONFIG_CPU_SUBTYPE_SH7206=y
 # CONFIG_CPU_SUBTYPE_SH7708 is not set
 # CONFIG_CPU_SUBTYPE_SH7709 is not set
 # CONFIG_CPU_SUBTYPE_SH7710 is not set
-
-#
-# SH-4 Processor Support
-#
+# CONFIG_CPU_SUBTYPE_SH7712 is not set
 # CONFIG_CPU_SUBTYPE_SH7750 is not set
 # CONFIG_CPU_SUBTYPE_SH7091 is not set
 # CONFIG_CPU_SUBTYPE_SH7750R is not set
@@ -149,32 +114,28 @@ CONFIG_CPU_SUBTYPE_SH7206=y
 # CONFIG_CPU_SUBTYPE_SH7751R is not set
 # CONFIG_CPU_SUBTYPE_SH7760 is not set
 # CONFIG_CPU_SUBTYPE_SH4_202 is not set
-
-#
-# ST40 Processor Support
-#
 # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
 # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
-
-#
-# SH-4A Processor Support
-#
 # CONFIG_CPU_SUBTYPE_SH7770 is not set
 # CONFIG_CPU_SUBTYPE_SH7780 is not set
 # CONFIG_CPU_SUBTYPE_SH7785 is not set
-
-#
-# SH4AL-DSP Processor Support
-#
 # CONFIG_CPU_SUBTYPE_SH73180 is not set
 # CONFIG_CPU_SUBTYPE_SH7343 is not set
+# CONFIG_CPU_SUBTYPE_SH7722 is not set
 
 #
 # Memory management options
 #
+CONFIG_QUICKLIST=y
 CONFIG_PAGE_OFFSET=0x00000000
 CONFIG_MEMORY_START=0x0c000000
 CONFIG_MEMORY_SIZE=0x04000000
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
+CONFIG_MAX_ACTIVE_REGIONS=1
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
 CONFIG_PAGE_SIZE_4KB=y
 # CONFIG_PAGE_SIZE_8KB is not set
 # CONFIG_PAGE_SIZE_64KB is not set
@@ -184,35 +145,42 @@ CONFIG_FLATMEM_MANUAL=y
 # CONFIG_SPARSEMEM_MANUAL is not set
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPARSEMEM_STATIC=y
 CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_NR_QUICK=2
 
 #
 # Cache configuration
 #
 # CONFIG_SH_DIRECT_MAPPED is not set
 # CONFIG_SH_WRITETHROUGH is not set
-# CONFIG_SH_OCRAM is not set
 
 #
 # Processor features
 #
 # CONFIG_CPU_LITTLE_ENDIAN is not set
 CONFIG_CPU_BIG_ENDIAN=y
-# CONFIG_SH_FPU is not set
 # CONFIG_SH_FPU_EMU is not set
 # CONFIG_SH_DSP is not set
+CONFIG_CPU_HAS_IPR_IRQ=y
+
+#
+# Board support
+#
+CONFIG_SOLUTION_ENGINE=y
+CONFIG_SH_7206_SOLUTION_ENGINE=y
 
 #
-# Timer support
+# Timer and clock configuration
 #
 CONFIG_SH_CMT=y
 # CONFIG_SH_MTU2 is not set
 CONFIG_SH_TIMER_IRQ=140
-# CONFIG_NO_IDLE_HZ is not set
 CONFIG_SH_PCLK_FREQ=33333333
 CONFIG_SH_CLK_MD=6
+# CONFIG_TICK_ONESHOT is not set
 
 #
 # CPU Frequency scaling
@@ -227,11 +195,11 @@ CONFIG_SH_CLK_MD=6
 #
 # Companion Chips
 #
-# CONFIG_HD6446X_SERIES is not set
 
 #
 # Additional SuperH Device Drivers
 #
+# CONFIG_HEARTBEAT is not set
 # CONFIG_PUSH_SWITCH is not set
 
 #
@@ -239,10 +207,11 @@ CONFIG_SH_CLK_MD=6
 #
 CONFIG_HZ_100=y
 # CONFIG_HZ_250 is not set
+# CONFIG_HZ_300 is not set
 # CONFIG_HZ_1000 is not set
 CONFIG_HZ=100
 # CONFIG_KEXEC is not set
-# CONFIG_SMP is not set
+# CONFIG_CRASH_DUMP is not set
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -252,22 +221,17 @@ CONFIG_PREEMPT_NONE=y
 #
 CONFIG_ZERO_PAGE_OFFSET=0x00001000
 CONFIG_BOOT_LINK_OFFSET=0x00800000
-# CONFIG_UBC_WAKEUP is not set
 # CONFIG_CMDLINE_BOOL is not set
 
 #
 # Bus options
 #
-# CONFIG_PCI is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
 
 #
 # PCCARD (PCMCIA/CardBus) support
 #
 
-#
-# PCI Hotplug Support
-#
-
 #
 # Executable file formats
 #
@@ -276,11 +240,6 @@ CONFIG_BINFMT_ZFLAT=y
 # CONFIG_BINFMT_SHARED_FLAT is not set
 # CONFIG_BINFMT_MISC is not set
 
-#
-# Power management options (EXPERIMENTAL)
-#
-# CONFIG_PM is not set
-
 #
 # Networking
 #
@@ -289,7 +248,6 @@ CONFIG_NET=y
 #
 # Networking options
 #
-# CONFIG_NETDEBUG is not set
 # CONFIG_PACKET is not set
 # CONFIG_UNIX is not set
 # CONFIG_NET_KEY is not set
@@ -314,25 +272,14 @@ CONFIG_IP_FIB_HASH=y
 # CONFIG_TCP_CONG_ADVANCED is not set
 CONFIG_TCP_CONG_CUBIC=y
 CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
 # CONFIG_IPV6 is not set
 # CONFIG_INET6_XFRM_TUNNEL is not set
 # CONFIG_INET6_TUNNEL is not set
 # CONFIG_NETWORK_SECMARK is not set
 # CONFIG_NETFILTER is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
 # CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
 # CONFIG_IP_SCTP is not set
-
-#
-# TIPC Configuration (EXPERIMENTAL)
-#
 # CONFIG_TIPC is not set
 # CONFIG_ATM is not set
 # CONFIG_BRIDGE is not set
@@ -358,7 +305,16 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
 # CONFIG_HAMRADIO is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_MAC80211 is not set
 # CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
 
 #
 # Device Drivers
@@ -375,10 +331,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
 # Connector - unified userspace <-> kernelspace linker
 #
 # CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
 CONFIG_MTD=y
 # CONFIG_MTD_DEBUG is not set
 CONFIG_MTD_CONCAT=y
@@ -393,6 +345,7 @@ CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
 # User Modules And Translation Layers
 #
 CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
 CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
@@ -424,7 +377,6 @@ CONFIG_MTD_CFI_UTIL=y
 # CONFIG_MTD_RAM is not set
 # CONFIG_MTD_ROM is not set
 # CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
 
 #
 # Mapping drivers for chip access
@@ -452,16 +404,13 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=4
 # CONFIG_MTD_DOC2000 is not set
 # CONFIG_MTD_DOC2001 is not set
 # CONFIG_MTD_DOC2001PLUS is not set
-
-#
-# NAND Flash Device Drivers
-#
 # CONFIG_MTD_NAND is not set
+# CONFIG_MTD_ONENAND is not set
 
 #
-# OneNAND Flash Device Drivers
+# UBI - Unsorted block images
 #
-# CONFIG_MTD_ONENAND is not set
+# CONFIG_MTD_UBI is not set
 
 #
 # Parallel port support
@@ -471,6 +420,7 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=4
 #
 # Plug and Play support
 #
+# CONFIG_PNPACPI is not set
 
 #
 # Block devices
@@ -479,18 +429,13 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=4
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_CDROM_PKTCDVD is not set
 # CONFIG_ATA_OVER_ETH is not set
 
 #
 # Misc devices
 #
-# CONFIG_TIFM_CORE is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
+# CONFIG_BLINK is not set
 # CONFIG_IDE is not set
 
 #
@@ -499,10 +444,6 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=4
 # CONFIG_RAID_ATTRS is not set
 # CONFIG_SCSI is not set
 # CONFIG_SCSI_NETLINK is not set
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
 # CONFIG_ATA is not set
 
 #
@@ -510,19 +451,6 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=4
 #
 # CONFIG_MD is not set
 
-#
-# Fusion MPT device support
-#
-# CONFIG_FUSION is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-
-#
-# I2O device support
-#
-
 #
 # Network device support
 #
@@ -531,10 +459,6 @@ CONFIG_NETDEVICES=y
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
-
-#
-# PHY device support
-#
 # CONFIG_PHYLIB is not set
 
 #
@@ -544,27 +468,14 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_STNIC is not set
 CONFIG_SMC91X=y
+CONFIG_NETDEV_1000=y
+CONFIG_NETDEV_10000=y
 
 #
-# Ethernet (1000 Mbit)
-#
-
-#
-# Ethernet (10000 Mbit)
-#
-
-#
-# Token Ring devices
-#
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
+# Wireless LAN
 #
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
 # CONFIG_WAN is not set
 # CONFIG_PPP is not set
 # CONFIG_SLIP is not set
@@ -604,6 +515,7 @@ CONFIG_INPUT=y
 # CONFIG_INPUT_KEYBOARD is not set
 # CONFIG_INPUT_MOUSE is not set
 # CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
 # CONFIG_INPUT_TOUCHSCREEN is not set
 # CONFIG_INPUT_MISC is not set
 
@@ -639,29 +551,15 @@ CONFIG_SERIAL_CORE_CONSOLE=y
 # IPMI
 #
 # CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
 # CONFIG_WATCHDOG is not set
 # CONFIG_HW_RANDOM is not set
-# CONFIG_GEN_RTC is not set
-# CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
-
-#
-# Ftape, the floppy tape device driver
-#
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
-
-#
-# I2C support
-#
 # CONFIG_I2C is not set
 
 #
@@ -674,27 +572,30 @@ CONFIG_SERIAL_CORE_CONSOLE=y
 # Dallas's 1-wire bus
 #
 # CONFIG_W1 is not set
+# CONFIG_HWMON is not set
 
 #
-# Hardware Monitoring support
+# Multifunction device drivers
 #
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
+# CONFIG_MFD_SM501 is not set
 
 #
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+CONFIG_DAB=y
 
 #
-# Digital Video Broadcasting Devices
+# Graphics support
 #
-# CONFIG_DVB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
-# Graphics support
+# Display device support
 #
-# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
 # CONFIG_FB is not set
 
 #
@@ -702,6 +603,12 @@ CONFIG_SERIAL_CORE_CONSOLE=y
 #
 # CONFIG_SOUND is not set
 
+#
+# HID Devices
+#
+CONFIG_HID=y
+# CONFIG_HID_DEBUG is not set
+
 #
 # USB support
 #
@@ -717,10 +624,6 @@ CONFIG_SERIAL_CORE_CONSOLE=y
 # USB Gadget Support
 #
 # CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
 # CONFIG_MMC is not set
 
 #
@@ -802,7 +705,6 @@ CONFIG_PROC_FS=y
 CONFIG_PROC_SYSCTL=y
 # CONFIG_SYSFS is not set
 # CONFIG_TMPFS is not set
-# CONFIG_HUGETLBFS is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
 
@@ -816,7 +718,6 @@ CONFIG_RAMFS=y
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
 # CONFIG_JFFS2_FS is not set
 # CONFIG_CRAMFS is not set
 # CONFIG_VXFS_FS is not set
@@ -848,6 +749,11 @@ CONFIG_MSDOS_PARTITION=y
 #
 # CONFIG_NLS is not set
 
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
 #
 # Profiling support
 #
@@ -861,14 +767,11 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y
 # CONFIG_ENABLE_MUST_CHECK is not set
 # CONFIG_MAGIC_SYSRQ is not set
 # CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_HEADERS_CHECK is not set
 # CONFIG_DEBUG_KERNEL is not set
-CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_UNWIND_INFO is not set
-# CONFIG_HEADERS_CHECK is not set
 # CONFIG_SH_STANDARD_BIOS is not set
 # CONFIG_EARLY_SCIF_CONSOLE is not set
-# CONFIG_KGDB is not set
 
 #
 # Security options
@@ -883,8 +786,13 @@ CONFIG_LOG_BUF_SHIFT=14
 #
 # Library routines
 #
+CONFIG_BITREVERSE=y
 # CONFIG_CRC_CCITT is not set
 # CONFIG_CRC16 is not set
+# CONFIG_CRC_ITU_T is not set
 CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
 CONFIG_ZLIB_INFLATE=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
index 20ac7f4c53fb1a7a9bdd1227b4edd927700d6f66..3a3c3c1f507d92f5e61d5692c4479e54accae1cf 100644 (file)
@@ -1,18 +1,22 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.19
-# Wed Dec  6 16:35:36 2006
+# Linux kernel version: 2.6.22-rc4
+# Fri Jun 15 19:43:06 2007
 #
 CONFIG_SUPERH=y
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_BUG=y
 CONFIG_GENERIC_FIND_NEXT_BIT=y
 CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 # CONFIG_GENERIC_TIME is not set
+# CONFIG_GENERIC_CLOCKEVENTS is not set
 CONFIG_STACKTRACE_SUPPORT=y
 CONFIG_LOCKDEP_SUPPORT=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
@@ -31,8 +35,10 @@ CONFIG_LOCALVERSION=""
 # CONFIG_BSD_PROCESS_ACCT is not set
 # CONFIG_UTS_NS is not set
 # CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_SYSFS_DEPRECATED=y
 # CONFIG_RELAY is not set
-CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_BLK_DEV_INITRD is not set
 CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 CONFIG_SYSCTL=y
 CONFIG_EMBEDDED=y
@@ -45,12 +51,17 @@ CONFIG_BUG=y
 # CONFIG_ELF_CORE is not set
 # CONFIG_BASE_FULL is not set
 # CONFIG_FUTEX is not set
+CONFIG_ANON_INODES=y
 # CONFIG_EPOLL is not set
-CONFIG_SLAB=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
 # CONFIG_VM_EVENT_COUNTERS is not set
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
 CONFIG_TINY_SHMEM=y
 CONFIG_BASE_SMALL=1
-# CONFIG_SLOB is not set
 
 #
 # Loadable module support
@@ -80,52 +91,9 @@ CONFIG_DEFAULT_IOSCHED="noop"
 #
 # System type
 #
-# CONFIG_SH_SOLUTION_ENGINE is not set
-# CONFIG_SH_7751_SOLUTION_ENGINE is not set
-# CONFIG_SH_7300_SOLUTION_ENGINE is not set
-# CONFIG_SH_7343_SOLUTION_ENGINE is not set
-# CONFIG_SH_73180_SOLUTION_ENGINE is not set
-# CONFIG_SH_7751_SYSTEMH is not set
-# CONFIG_SH_HP6XX is not set
-# CONFIG_SH_EC3104 is not set
-# CONFIG_SH_SATURN is not set
-# CONFIG_SH_DREAMCAST is not set
-# CONFIG_SH_BIGSUR is not set
-# CONFIG_SH_MPC1211 is not set
-# CONFIG_SH_SH03 is not set
-# CONFIG_SH_SECUREEDGE5410 is not set
-# CONFIG_SH_HS7751RVOIP is not set
-# CONFIG_SH_7710VOIPGW is not set
-# CONFIG_SH_RTS7751R2D is not set
-# CONFIG_SH_R7780RP is not set
-# CONFIG_SH_EDOSK7705 is not set
-# CONFIG_SH_SH4202_MICRODEV is not set
-# CONFIG_SH_LANDISK is not set
-# CONFIG_SH_TITAN is not set
-# CONFIG_SH_SHMIN is not set
-# CONFIG_SH_7206_SOLUTION_ENGINE is not set
-CONFIG_SH_7619_SOLUTION_ENGINE=y
-# CONFIG_SH_UNKNOWN is not set
-
-#
-# Processor selection
-#
 CONFIG_CPU_SH2=y
-
-#
-# SH-2 Processor Support
-#
-# CONFIG_CPU_SUBTYPE_SH7604 is not set
 CONFIG_CPU_SUBTYPE_SH7619=y
-
-#
-# SH-2A Processor Support
-#
 # CONFIG_CPU_SUBTYPE_SH7206 is not set
-
-#
-# SH-3 Processor Support
-#
 # CONFIG_CPU_SUBTYPE_SH7300 is not set
 # CONFIG_CPU_SUBTYPE_SH7705 is not set
 # CONFIG_CPU_SUBTYPE_SH7706 is not set
@@ -133,10 +101,7 @@ CONFIG_CPU_SUBTYPE_SH7619=y
 # CONFIG_CPU_SUBTYPE_SH7708 is not set
 # CONFIG_CPU_SUBTYPE_SH7709 is not set
 # CONFIG_CPU_SUBTYPE_SH7710 is not set
-
-#
-# SH-4 Processor Support
-#
+# CONFIG_CPU_SUBTYPE_SH7712 is not set
 # CONFIG_CPU_SUBTYPE_SH7750 is not set
 # CONFIG_CPU_SUBTYPE_SH7091 is not set
 # CONFIG_CPU_SUBTYPE_SH7750R is not set
@@ -145,32 +110,28 @@ CONFIG_CPU_SUBTYPE_SH7619=y
 # CONFIG_CPU_SUBTYPE_SH7751R is not set
 # CONFIG_CPU_SUBTYPE_SH7760 is not set
 # CONFIG_CPU_SUBTYPE_SH4_202 is not set
-
-#
-# ST40 Processor Support
-#
 # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
 # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
-
-#
-# SH-4A Processor Support
-#
 # CONFIG_CPU_SUBTYPE_SH7770 is not set
 # CONFIG_CPU_SUBTYPE_SH7780 is not set
 # CONFIG_CPU_SUBTYPE_SH7785 is not set
-
-#
-# SH4AL-DSP Processor Support
-#
 # CONFIG_CPU_SUBTYPE_SH73180 is not set
 # CONFIG_CPU_SUBTYPE_SH7343 is not set
+# CONFIG_CPU_SUBTYPE_SH7722 is not set
 
 #
 # Memory management options
 #
+CONFIG_QUICKLIST=y
 CONFIG_PAGE_OFFSET=0x00000000
 CONFIG_MEMORY_START=0x0c000000
 CONFIG_MEMORY_SIZE=0x04000000
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
+CONFIG_MAX_ACTIVE_REGIONS=1
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
 CONFIG_PAGE_SIZE_4KB=y
 # CONFIG_PAGE_SIZE_8KB is not set
 # CONFIG_PAGE_SIZE_64KB is not set
@@ -180,34 +141,41 @@ CONFIG_FLATMEM_MANUAL=y
 # CONFIG_SPARSEMEM_MANUAL is not set
 CONFIG_FLATMEM=y
 CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPARSEMEM_STATIC=y
 CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_NR_QUICK=2
 
 #
 # Cache configuration
 #
 # CONFIG_SH_DIRECT_MAPPED is not set
 CONFIG_SH_WRITETHROUGH=y
-# CONFIG_SH_OCRAM is not set
 
 #
 # Processor features
 #
 # CONFIG_CPU_LITTLE_ENDIAN is not set
 CONFIG_CPU_BIG_ENDIAN=y
-# CONFIG_SH_FPU is not set
 # CONFIG_SH_FPU_EMU is not set
 # CONFIG_SH_DSP is not set
+CONFIG_CPU_HAS_IPR_IRQ=y
+
+#
+# Board support
+#
+CONFIG_SOLUTION_ENGINE=y
+CONFIG_SH_7619_SOLUTION_ENGINE=y
 
 #
-# Timer support
+# Timer and clock configuration
 #
 CONFIG_SH_CMT=y
 CONFIG_SH_TIMER_IRQ=86
-# CONFIG_NO_IDLE_HZ is not set
 CONFIG_SH_PCLK_FREQ=31250000
 CONFIG_SH_CLK_MD=5
+# CONFIG_TICK_ONESHOT is not set
 
 #
 # CPU Frequency scaling
@@ -222,11 +190,11 @@ CONFIG_SH_CLK_MD=5
 #
 # Companion Chips
 #
-# CONFIG_HD6446X_SERIES is not set
 
 #
 # Additional SuperH Device Drivers
 #
+# CONFIG_HEARTBEAT is not set
 # CONFIG_PUSH_SWITCH is not set
 
 #
@@ -234,10 +202,11 @@ CONFIG_SH_CLK_MD=5
 #
 CONFIG_HZ_100=y
 # CONFIG_HZ_250 is not set
+# CONFIG_HZ_300 is not set
 # CONFIG_HZ_1000 is not set
 CONFIG_HZ=100
 # CONFIG_KEXEC is not set
-# CONFIG_SMP is not set
+# CONFIG_CRASH_DUMP is not set
 CONFIG_PREEMPT_NONE=y
 # CONFIG_PREEMPT_VOLUNTARY is not set
 # CONFIG_PREEMPT is not set
@@ -247,22 +216,17 @@ CONFIG_PREEMPT_NONE=y
 #
 CONFIG_ZERO_PAGE_OFFSET=0x00001000
 CONFIG_BOOT_LINK_OFFSET=0x00800000
-# CONFIG_UBC_WAKEUP is not set
 # CONFIG_CMDLINE_BOOL is not set
 
 #
 # Bus options
 #
-# CONFIG_PCI is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
 
 #
 # PCCARD (PCMCIA/CardBus) support
 #
 
-#
-# PCI Hotplug Support
-#
-
 #
 # Executable file formats
 #
@@ -271,11 +235,6 @@ CONFIG_BINFMT_ZFLAT=y
 # CONFIG_BINFMT_SHARED_FLAT is not set
 # CONFIG_BINFMT_MISC is not set
 
-#
-# Power management options (EXPERIMENTAL)
-#
-# CONFIG_PM is not set
-
 #
 # Networking
 #
@@ -295,10 +254,6 @@ CONFIG_BINFMT_ZFLAT=y
 #
 # Connector - unified userspace <-> kernelspace linker
 #
-
-#
-# Memory Technology Devices (MTD)
-#
 CONFIG_MTD=y
 # CONFIG_MTD_DEBUG is not set
 CONFIG_MTD_CONCAT=y
@@ -313,6 +268,7 @@ CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
 # User Modules And Translation Layers
 #
 CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
 CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
@@ -344,7 +300,6 @@ CONFIG_MTD_CFI_UTIL=y
 # CONFIG_MTD_RAM is not set
 # CONFIG_MTD_ROM is not set
 # CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
 
 #
 # Mapping drivers for chip access
@@ -372,16 +327,13 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
 # CONFIG_MTD_DOC2000 is not set
 # CONFIG_MTD_DOC2001 is not set
 # CONFIG_MTD_DOC2001PLUS is not set
-
-#
-# NAND Flash Device Drivers
-#
 # CONFIG_MTD_NAND is not set
+# CONFIG_MTD_ONENAND is not set
 
 #
-# OneNAND Flash Device Drivers
+# UBI - Unsorted block images
 #
-# CONFIG_MTD_ONENAND is not set
+# CONFIG_MTD_UBI is not set
 
 #
 # Parallel port support
@@ -391,6 +343,7 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
 #
 # Plug and Play support
 #
+# CONFIG_PNPACPI is not set
 
 #
 # Block devices
@@ -398,17 +351,12 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
 # CONFIG_BLK_DEV_COW_COMMON is not set
 # CONFIG_BLK_DEV_LOOP is not set
 # CONFIG_BLK_DEV_RAM is not set
-# CONFIG_BLK_DEV_INITRD is not set
 # CONFIG_CDROM_PKTCDVD is not set
 
 #
 # Misc devices
 #
-# CONFIG_TIFM_CORE is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
+# CONFIG_BLINK is not set
 # CONFIG_IDE is not set
 
 #
@@ -417,10 +365,6 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
 # CONFIG_RAID_ATTRS is not set
 # CONFIG_SCSI is not set
 # CONFIG_SCSI_NETLINK is not set
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
 # CONFIG_ATA is not set
 
 #
@@ -428,19 +372,6 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
 #
 # CONFIG_MD is not set
 
-#
-# Fusion MPT device support
-#
-# CONFIG_FUSION is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-
-#
-# I2O device support
-#
-
 #
 # ISDN subsystem
 #
@@ -471,6 +402,7 @@ CONFIG_INPUT=y
 # CONFIG_INPUT_KEYBOARD is not set
 # CONFIG_INPUT_MOUSE is not set
 # CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
 # CONFIG_INPUT_TOUCHSCREEN is not set
 # CONFIG_INPUT_MISC is not set
 
@@ -506,29 +438,15 @@ CONFIG_SERIAL_CORE_CONSOLE=y
 # IPMI
 #
 # CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
 # CONFIG_WATCHDOG is not set
 # CONFIG_HW_RANDOM is not set
-# CONFIG_GEN_RTC is not set
-# CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
-
-#
-# Ftape, the floppy tape device driver
-#
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
-
-#
-# I2C support
-#
 # CONFIG_I2C is not set
 
 #
@@ -541,26 +459,29 @@ CONFIG_SERIAL_CORE_CONSOLE=y
 # Dallas's 1-wire bus
 #
 # CONFIG_W1 is not set
+# CONFIG_HWMON is not set
 
 #
-# Hardware Monitoring support
+# Multifunction device drivers
 #
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
+# CONFIG_MFD_SM501 is not set
 
 #
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
+CONFIG_DAB=y
 
 #
-# Digital Video Broadcasting Devices
+# Graphics support
 #
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
-# Graphics support
+# Display device support
 #
-# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
 # CONFIG_FB is not set
 
 #
@@ -568,6 +489,12 @@ CONFIG_SERIAL_CORE_CONSOLE=y
 #
 # CONFIG_SOUND is not set
 
+#
+# HID Devices
+#
+CONFIG_HID=y
+# CONFIG_HID_DEBUG is not set
+
 #
 # USB support
 #
@@ -583,10 +510,6 @@ CONFIG_SERIAL_CORE_CONSOLE=y
 # USB Gadget Support
 #
 # CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
 # CONFIG_MMC is not set
 
 #
@@ -668,7 +591,6 @@ CONFIG_PROC_FS=y
 CONFIG_PROC_SYSCTL=y
 # CONFIG_SYSFS is not set
 # CONFIG_TMPFS is not set
-# CONFIG_HUGETLBFS is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
 
@@ -682,7 +604,6 @@ CONFIG_RAMFS=y
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
 # CONFIG_JFFS2_FS is not set
 # CONFIG_CRAMFS is not set
 # CONFIG_VXFS_FS is not set
@@ -715,14 +636,11 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y
 # CONFIG_ENABLE_MUST_CHECK is not set
 # CONFIG_MAGIC_SYSRQ is not set
 # CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_HEADERS_CHECK is not set
 # CONFIG_DEBUG_KERNEL is not set
-CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_UNWIND_INFO is not set
-# CONFIG_HEADERS_CHECK is not set
 # CONFIG_SH_STANDARD_BIOS is not set
 # CONFIG_EARLY_SCIF_CONSOLE is not set
-# CONFIG_KGDB is not set
 
 #
 # Security options
@@ -737,8 +655,13 @@ CONFIG_LOG_BUF_SHIFT=14
 #
 # Library routines
 #
+CONFIG_BITREVERSE=y
 # CONFIG_CRC_CCITT is not set
 # CONFIG_CRC16 is not set
+# CONFIG_CRC_ITU_T is not set
 CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
 CONFIG_ZLIB_INFLATE=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
index ca4c663dfa37a3a394dcbdb2fc4eb57bb6431939..764b813c4051df05115a1a2160b8d002c5b72d07 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.21-rc7
-# Fri Apr 27 16:30:30 2007
+# Linux kernel version: 2.6.22-rc4
+# Wed Jun 20 18:08:04 2007
 #
 CONFIG_SUPERH=y
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
@@ -11,7 +11,9 @@ CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
-# CONFIG_GENERIC_TIME is not set
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_SYS_SUPPORTS_NUMA=y
 CONFIG_STACKTRACE_SUPPORT=y
 CONFIG_LOCKDEP_SUPPORT=y
 # CONFIG_ARCH_HAS_ILOG2_U32 is not set
@@ -43,6 +45,7 @@ CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_AUDIT is not set
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_SYSFS_DEPRECATED is not set
 # CONFIG_RELAY is not set
 CONFIG_BLK_DEV_INITRD=y
@@ -60,14 +63,20 @@ CONFIG_BUG=y
 CONFIG_ELF_CORE=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
+CONFIG_ANON_INODES=y
 CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
 CONFIG_SHMEM=y
-CONFIG_SLAB=y
 CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLUB_DEBUG=y
+# CONFIG_SLAB is not set
+CONFIG_SLUB=y
+# CONFIG_SLOB is not set
 CONFIG_RT_MUTEXES=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
 
 #
 # Loadable module support
@@ -103,57 +112,12 @@ CONFIG_DEFAULT_IOSCHED="noop"
 #
 # System type
 #
-CONFIG_SOLUTION_ENGINE=y
-# CONFIG_SH_SOLUTION_ENGINE is not set
-CONFIG_SH_7722_SOLUTION_ENGINE=y
-# CONFIG_SH_7751_SOLUTION_ENGINE is not set
-# CONFIG_SH_7780_SOLUTION_ENGINE is not set
-# CONFIG_SH_7300_SOLUTION_ENGINE is not set
-# CONFIG_SH_7343_SOLUTION_ENGINE is not set
-# CONFIG_SH_73180_SOLUTION_ENGINE is not set
-# CONFIG_SH_7751_SYSTEMH is not set
-# CONFIG_SH_HP6XX is not set
-# CONFIG_SH_SATURN is not set
-# CONFIG_SH_DREAMCAST is not set
-# CONFIG_SH_MPC1211 is not set
-# CONFIG_SH_SH03 is not set
-# CONFIG_SH_SECUREEDGE5410 is not set
-# CONFIG_SH_HS7751RVOIP is not set
-# CONFIG_SH_7710VOIPGW is not set
-# CONFIG_SH_RTS7751R2D is not set
-# CONFIG_SH_HIGHLANDER is not set
-# CONFIG_SH_EDOSK7705 is not set
-# CONFIG_SH_SH4202_MICRODEV is not set
-# CONFIG_SH_LANDISK is not set
-# CONFIG_SH_TITAN is not set
-# CONFIG_SH_SHMIN is not set
-# CONFIG_SH_7206_SOLUTION_ENGINE is not set
-# CONFIG_SH_7619_SOLUTION_ENGINE is not set
-# CONFIG_SH_LBOX_RE2 is not set
-# CONFIG_SH_UNKNOWN is not set
-
-#
-# Processor selection
-#
 CONFIG_CPU_SH4=y
 CONFIG_CPU_SH4A=y
 CONFIG_CPU_SH4AL_DSP=y
 CONFIG_CPU_SHX2=y
-
-#
-# SH-2 Processor Support
-#
-# CONFIG_CPU_SUBTYPE_SH7604 is not set
 # CONFIG_CPU_SUBTYPE_SH7619 is not set
-
-#
-# SH-2A Processor Support
-#
 # CONFIG_CPU_SUBTYPE_SH7206 is not set
-
-#
-# SH-3 Processor Support
-#
 # CONFIG_CPU_SUBTYPE_SH7300 is not set
 # CONFIG_CPU_SUBTYPE_SH7705 is not set
 # CONFIG_CPU_SUBTYPE_SH7706 is not set
@@ -162,10 +126,6 @@ CONFIG_CPU_SHX2=y
 # CONFIG_CPU_SUBTYPE_SH7709 is not set
 # CONFIG_CPU_SUBTYPE_SH7710 is not set
 # CONFIG_CPU_SUBTYPE_SH7712 is not set
-
-#
-# SH-4 Processor Support
-#
 # CONFIG_CPU_SUBTYPE_SH7750 is not set
 # CONFIG_CPU_SUBTYPE_SH7091 is not set
 # CONFIG_CPU_SUBTYPE_SH7750R is not set
@@ -174,23 +134,11 @@ CONFIG_CPU_SHX2=y
 # CONFIG_CPU_SUBTYPE_SH7751R is not set
 # CONFIG_CPU_SUBTYPE_SH7760 is not set
 # CONFIG_CPU_SUBTYPE_SH4_202 is not set
-
-#
-# ST40 Processor Support
-#
 # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
 # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
-
-#
-# SH-4A Processor Support
-#
 # CONFIG_CPU_SUBTYPE_SH7770 is not set
 # CONFIG_CPU_SUBTYPE_SH7780 is not set
 # CONFIG_CPU_SUBTYPE_SH7785 is not set
-
-#
-# SH4AL-DSP Processor Support
-#
 # CONFIG_CPU_SUBTYPE_SH73180 is not set
 # CONFIG_CPU_SUBTYPE_SH7343 is not set
 CONFIG_CPU_SUBTYPE_SH7722=y
@@ -198,15 +146,21 @@ CONFIG_CPU_SUBTYPE_SH7722=y
 #
 # Memory management options
 #
+CONFIG_QUICKLIST=y
 CONFIG_MMU=y
 CONFIG_PAGE_OFFSET=0x80000000
 CONFIG_MEMORY_START=0x0c000000
 CONFIG_MEMORY_SIZE=0x04000000
-# CONFIG_32BIT is not set
 # CONFIG_X2TLB is not set
 CONFIG_VSYSCALL=y
-CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_NUMA=y
+CONFIG_NODES_SHIFT=1
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
+CONFIG_MAX_ACTIVE_REGIONS=2
 CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
 CONFIG_PAGE_SIZE_4KB=y
 # CONFIG_PAGE_SIZE_8KB is not set
 # CONFIG_PAGE_SIZE_64KB is not set
@@ -216,26 +170,25 @@ CONFIG_HUGETLB_PAGE_SIZE_64K=y
 # CONFIG_HUGETLB_PAGE_SIZE_4MB is not set
 # CONFIG_HUGETLB_PAGE_SIZE_64MB is not set
 CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
+# CONFIG_FLATMEM_MANUAL is not set
 # CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPARSEMEM_MANUAL=y
+CONFIG_SPARSEMEM=y
+CONFIG_NEED_MULTIPLE_NODES=y
+CONFIG_HAVE_MEMORY_PRESENT=y
+CONFIG_SPARSEMEM_STATIC=y
+# CONFIG_MEMORY_HOTPLUG is not set
 CONFIG_SPLIT_PTLOCK_CPUS=4
+CONFIG_MIGRATION=y
 # CONFIG_RESOURCES_64BIT is not set
 CONFIG_ZONE_DMA_FLAG=0
+CONFIG_NR_QUICK=2
 
 #
 # Cache configuration
 #
 # CONFIG_SH_DIRECT_MAPPED is not set
 # CONFIG_SH_WRITETHROUGH is not set
-# CONFIG_SH_OCRAM is not set
-CONFIG_CF_ENABLER=y
-# CONFIG_CF_AREA5 is not set
-CONFIG_CF_AREA6=y
-CONFIG_CF_BASE_ADDR=0xb8000000
 
 #
 # Processor features
@@ -251,13 +204,21 @@ CONFIG_CPU_HAS_IPR_IRQ=y
 CONFIG_CPU_HAS_SR_RB=y
 CONFIG_CPU_HAS_PTEA=y
 
+#
+# Board support
+#
+CONFIG_SOLUTION_ENGINE=y
+CONFIG_SH_7722_SOLUTION_ENGINE=y
+
 #
 # Timer and clock configuration
 #
 CONFIG_SH_TMU=y
 CONFIG_SH_TIMER_IRQ=16
-CONFIG_NO_IDLE_HZ=y
 CONFIG_SH_PCLK_FREQ=33333333
+CONFIG_TICK_ONESHOT=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
 
 #
 # CPU Frequency scaling
@@ -272,7 +233,6 @@ CONFIG_SH_PCLK_FREQ=33333333
 #
 # Companion Chips
 #
-# CONFIG_HD6446X_SERIES is not set
 
 #
 # Additional SuperH Device Drivers
@@ -290,7 +250,6 @@ CONFIG_HZ_250=y
 CONFIG_HZ=250
 CONFIG_KEXEC=y
 # CONFIG_CRASH_DUMP is not set
-# CONFIG_SMP is not set
 # CONFIG_PREEMPT_NONE is not set
 # CONFIG_PREEMPT_VOLUNTARY is not set
 CONFIG_PREEMPT=y
@@ -307,29 +266,23 @@ CONFIG_BOOT_LINK_OFFSET=0x00800000
 #
 # Bus options
 #
-# CONFIG_PCI is not set
+CONFIG_CF_ENABLER=y
+# CONFIG_CF_AREA5 is not set
+CONFIG_CF_AREA6=y
+CONFIG_CF_BASE_ADDR=0xb8000000
+# CONFIG_ARCH_SUPPORTS_MSI is not set
 
 #
 # PCCARD (PCMCIA/CardBus) support
 #
 # CONFIG_PCCARD is not set
 
-#
-# PCI Hotplug Support
-#
-
 #
 # Executable file formats
 #
 CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_FLAT is not set
 # CONFIG_BINFMT_MISC is not set
 
-#
-# Power management options (EXPERIMENTAL)
-#
-# CONFIG_PM is not set
-
 #
 # Networking
 #
@@ -338,7 +291,6 @@ CONFIG_NET=y
 #
 # Networking options
 #
-# CONFIG_NETDEBUG is not set
 CONFIG_PACKET=y
 CONFIG_PACKET_MMAP=y
 CONFIG_UNIX=y
@@ -375,20 +327,8 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
 # CONFIG_INET6_TUNNEL is not set
 # CONFIG_NETWORK_SECMARK is not set
 # CONFIG_NETFILTER is not set
-
-#
-# DCCP Configuration (EXPERIMENTAL)
-#
 # CONFIG_IP_DCCP is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
 # CONFIG_IP_SCTP is not set
-
-#
-# TIPC Configuration (EXPERIMENTAL)
-#
 # CONFIG_TIPC is not set
 # CONFIG_ATM is not set
 # CONFIG_BRIDGE is not set
@@ -414,7 +354,16 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
 # CONFIG_HAMRADIO is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_MAC80211 is not set
 # CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
 
 #
 # Device Drivers
@@ -432,10 +381,6 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 # Connector - unified userspace <-> kernelspace linker
 #
 # CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
 # CONFIG_MTD is not set
 
 #
@@ -464,10 +409,7 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
 #
 # Misc devices
 #
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
+# CONFIG_BLINK is not set
 # CONFIG_IDE is not set
 
 #
@@ -496,6 +438,7 @@ CONFIG_BLK_DEV_SD=y
 # CONFIG_SCSI_CONSTANTS is not set
 # CONFIG_SCSI_LOGGING is not set
 # CONFIG_SCSI_SCAN_ASYNC is not set
+CONFIG_SCSI_WAIT_SCAN=m
 
 #
 # SCSI Transports
@@ -511,10 +454,6 @@ CONFIG_BLK_DEV_SD=y
 #
 # CONFIG_ISCSI_TCP is not set
 # CONFIG_SCSI_DEBUG is not set
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
 CONFIG_ATA=y
 # CONFIG_ATA_NONSTANDARD is not set
 CONFIG_PATA_PLATFORM=y
@@ -524,19 +463,6 @@ CONFIG_PATA_PLATFORM=y
 #
 # CONFIG_MD is not set
 
-#
-# Fusion MPT device support
-#
-# CONFIG_FUSION is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-
-#
-# I2O device support
-#
-
 #
 # Network device support
 #
@@ -545,10 +471,6 @@ CONFIG_NETDEVICES=y
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
-
-#
-# PHY device support
-#
 # CONFIG_PHYLIB is not set
 
 #
@@ -558,27 +480,14 @@ CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_STNIC is not set
 CONFIG_SMC91X=y
+CONFIG_NETDEV_1000=y
+CONFIG_NETDEV_10000=y
 
 #
-# Ethernet (1000 Mbit)
-#
-
-#
-# Ethernet (10000 Mbit)
-#
-
-#
-# Token Ring devices
-#
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Wan interfaces
+# Wireless LAN
 #
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 is not set
 # CONFIG_WAN is not set
 # CONFIG_PPP is not set
 # CONFIG_SLIP is not set
@@ -627,6 +536,7 @@ CONFIG_KEYBOARD_ATKBD=y
 # CONFIG_KEYBOARD_STOWAWAY is not set
 # CONFIG_INPUT_MOUSE is not set
 # CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
 # CONFIG_INPUT_TOUCHSCREEN is not set
 # CONFIG_INPUT_MISC is not set
 
@@ -667,14 +577,8 @@ CONFIG_LEGACY_PTY_COUNT=256
 # IPMI
 #
 # CONFIG_IPMI_HANDLER is not set
-
-#
-# Watchdog Cards
-#
 # CONFIG_WATCHDOG is not set
 CONFIG_HW_RANDOM=y
-# CONFIG_GEN_RTC is not set
-# CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_RAW_DRIVER is not set
 
@@ -682,10 +586,6 @@ CONFIG_HW_RANDOM=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
-
-#
-# I2C support
-#
 # CONFIG_I2C is not set
 
 #
@@ -698,16 +598,15 @@ CONFIG_HW_RANDOM=y
 # Dallas's 1-wire bus
 #
 # CONFIG_W1 is not set
-
-#
-# Hardware Monitoring support
-#
 CONFIG_HWMON=y
 # CONFIG_HWMON_VID is not set
 # CONFIG_SENSORS_ABITUGURU is not set
 # CONFIG_SENSORS_F71805F is not set
 # CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
 # CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_W83627HF is not set
 # CONFIG_HWMON_DEBUG_CHIP is not set
 
 #
@@ -719,16 +618,19 @@ CONFIG_HWMON=y
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+CONFIG_DAB=y
 
 #
-# Digital Video Broadcasting Devices
+# Graphics support
 #
-# CONFIG_DVB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
-# Graphics support
+# Display device support
 #
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
 # CONFIG_FB is not set
 
 #
@@ -757,10 +659,6 @@ CONFIG_HID=y
 # USB Gadget Support
 #
 # CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
 # CONFIG_MMC is not set
 
 #
@@ -800,17 +698,29 @@ CONFIG_RTC_INTF_SYSFS=y
 CONFIG_RTC_INTF_PROC=y
 CONFIG_RTC_INTF_DEV=y
 # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+# CONFIG_RTC_DRV_TEST is not set
 
 #
-# RTC drivers
+# I2C RTC drivers
+#
+
+#
+# SPI RTC drivers
+#
+
+#
+# Platform RTC drivers
 #
 # CONFIG_RTC_DRV_DS1553 is not set
 # CONFIG_RTC_DRV_DS1742 is not set
 # CONFIG_RTC_DRV_M48T86 is not set
-CONFIG_RTC_DRV_SH=y
-# CONFIG_RTC_DRV_TEST is not set
 # CONFIG_RTC_DRV_V3020 is not set
 
+#
+# on-CPU RTC drivers
+#
+CONFIG_RTC_DRV_SH=y
+
 #
 # DMA Engine support
 #
@@ -824,14 +734,6 @@ CONFIG_RTC_DRV_SH=y
 # DMA Devices
 #
 
-#
-# Auxiliary Display support
-#
-
-#
-# Virtualization
-#
-
 #
 # File systems
 #
@@ -937,23 +839,24 @@ CONFIG_MSDOS_PARTITION=y
 #
 # Profiling support
 #
-# CONFIG_PROFILING is not set
+CONFIG_PROFILING=y
+# CONFIG_OPROFILE is not set
 
 #
 # Kernel hacking
 #
 CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-# CONFIG_PRINTK_TIME is not set
+CONFIG_PRINTK_TIME=y
 # CONFIG_ENABLE_MUST_CHECK is not set
-# CONFIG_MAGIC_SYSRQ is not set
+CONFIG_MAGIC_SYSRQ=y
 # CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_DEBUG_FS is not set
+CONFIG_DEBUG_FS=y
 # CONFIG_HEADERS_CHECK is not set
 # CONFIG_DEBUG_KERNEL is not set
-CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_SH_STANDARD_BIOS is not set
+CONFIG_SH_STANDARD_BIOS=y
 # CONFIG_EARLY_SCIF_CONSOLE is not set
+# CONFIG_EARLY_PRINTK is not set
 # CONFIG_SH_KGDB is not set
 
 #
@@ -973,8 +876,10 @@ CONFIG_LOG_BUF_SHIFT=14
 CONFIG_BITREVERSE=y
 # CONFIG_CRC_CCITT is not set
 # CONFIG_CRC16 is not set
+# CONFIG_CRC_ITU_T is not set
 CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
 CONFIG_PLIST=y
 CONFIG_HAS_IOMEM=y
 CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
diff --git a/arch/sh/configs/shx3_defconfig b/arch/sh/configs/shx3_defconfig
new file mode 100644 (file)
index 0000000..219bad5
--- /dev/null
@@ -0,0 +1,756 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.22-rc4
+# Wed Jun 20 14:09:27 2007
+#
+CONFIG_SUPERH=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+# CONFIG_UTS_NS is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_SYSFS_DEPRECATED is not set
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_ALL=y
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_ANON_INODES=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# System type
+#
+CONFIG_CPU_SH4=y
+CONFIG_CPU_SH4A=y
+CONFIG_CPU_SHX3=y
+# CONFIG_CPU_SUBTYPE_SH7619 is not set
+# CONFIG_CPU_SUBTYPE_SH7206 is not set
+# CONFIG_CPU_SUBTYPE_SH7300 is not set
+# CONFIG_CPU_SUBTYPE_SH7705 is not set
+# CONFIG_CPU_SUBTYPE_SH7706 is not set
+# CONFIG_CPU_SUBTYPE_SH7707 is not set
+# CONFIG_CPU_SUBTYPE_SH7708 is not set
+# CONFIG_CPU_SUBTYPE_SH7709 is not set
+# CONFIG_CPU_SUBTYPE_SH7710 is not set
+# CONFIG_CPU_SUBTYPE_SH7712 is not set
+# CONFIG_CPU_SUBTYPE_SH7750 is not set
+# CONFIG_CPU_SUBTYPE_SH7091 is not set
+# CONFIG_CPU_SUBTYPE_SH7750R is not set
+# CONFIG_CPU_SUBTYPE_SH7750S is not set
+# CONFIG_CPU_SUBTYPE_SH7751 is not set
+# CONFIG_CPU_SUBTYPE_SH7751R is not set
+# CONFIG_CPU_SUBTYPE_SH7760 is not set
+# CONFIG_CPU_SUBTYPE_SH4_202 is not set
+# CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+# CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+# CONFIG_CPU_SUBTYPE_SH7770 is not set
+# CONFIG_CPU_SUBTYPE_SH7780 is not set
+# CONFIG_CPU_SUBTYPE_SH7785 is not set
+CONFIG_CPU_SUBTYPE_SHX3=y
+# CONFIG_CPU_SUBTYPE_SH73180 is not set
+# CONFIG_CPU_SUBTYPE_SH7343 is not set
+# CONFIG_CPU_SUBTYPE_SH7722 is not set
+
+#
+# Memory management options
+#
+CONFIG_QUICKLIST=y
+CONFIG_MMU=y
+CONFIG_PAGE_OFFSET=0x80000000
+CONFIG_MEMORY_START=0x0c000000
+CONFIG_MEMORY_SIZE=0x04000000
+CONFIG_VSYSCALL=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
+CONFIG_MAX_ACTIVE_REGIONS=1
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_PAGE_SIZE_4KB=y
+# CONFIG_PAGE_SIZE_8KB is not set
+# CONFIG_PAGE_SIZE_64KB is not set
+CONFIG_HUGETLB_PAGE_SIZE_64K=y
+# CONFIG_HUGETLB_PAGE_SIZE_256K is not set
+# CONFIG_HUGETLB_PAGE_SIZE_1MB is not set
+# CONFIG_HUGETLB_PAGE_SIZE_4MB is not set
+# CONFIG_HUGETLB_PAGE_SIZE_64MB is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_SPARSEMEM_STATIC=y
+CONFIG_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_NR_QUICK=2
+
+#
+# Cache configuration
+#
+# CONFIG_SH_DIRECT_MAPPED is not set
+# CONFIG_SH_WRITETHROUGH is not set
+
+#
+# Processor features
+#
+CONFIG_CPU_LITTLE_ENDIAN=y
+# CONFIG_CPU_BIG_ENDIAN is not set
+# CONFIG_SH_FPU is not set
+# CONFIG_SH_FPU_EMU is not set
+CONFIG_SH_DSP=y
+CONFIG_SH_STORE_QUEUES=y
+CONFIG_CPU_HAS_INTEVT=y
+CONFIG_CPU_HAS_INTC2_IRQ=y
+CONFIG_CPU_HAS_SR_RB=y
+
+#
+# Board support
+#
+
+#
+# Timer and clock configuration
+#
+CONFIG_SH_TMU=y
+CONFIG_SH_TIMER_IRQ=16
+CONFIG_SH_PCLK_FREQ=50000000
+CONFIG_TICK_ONESHOT=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ is not set
+
+#
+# DMA support
+#
+# CONFIG_SH_DMA is not set
+
+#
+# Companion Chips
+#
+
+#
+# Additional SuperH Device Drivers
+#
+CONFIG_HEARTBEAT=y
+# CONFIG_PUSH_SWITCH is not set
+
+#
+# Kernel features
+#
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
+# CONFIG_HZ_1000 is not set
+CONFIG_HZ=250
+CONFIG_KEXEC=y
+# CONFIG_CRASH_DUMP is not set
+# CONFIG_PREEMPT_NONE is not set
+# CONFIG_PREEMPT_VOLUNTARY is not set
+CONFIG_PREEMPT=y
+CONFIG_PREEMPT_BKL=y
+
+#
+# Boot options
+#
+CONFIG_ZERO_PAGE_OFFSET=0x00001000
+CONFIG_BOOT_LINK_OFFSET=0x00800000
+# CONFIG_UBC_WAKEUP is not set
+CONFIG_CMDLINE_BOOL=y
+CONFIG_CMDLINE="console=ttySC0,115200 ip=192.168.1.2:::255.255.255.0 root=/dev/nfs nfsroot=192.168.1.1:/exports/devel/rfs/mobiler noaliencache earlyprintk=bios ignore_loglevel"
+
+#
+# Bus options
+#
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Networking
+#
+# CONFIG_NET is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_FW_LOADER is not set
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+# CONFIG_CDROM_PKTCDVD is not set
+
+#
+# Misc devices
+#
+# CONFIG_BLINK is not set
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=y
+# CONFIG_SCSI_TGT is not set
+# CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_BLK_DEV_SR is not set
+# CONFIG_CHR_DEV_SG is not set
+# CONFIG_CHR_DEV_SCH is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+CONFIG_SCSI_WAIT_SCAN=m
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_SCSI_DEBUG is not set
+CONFIG_ATA=y
+# CONFIG_ATA_NONSTANDARD is not set
+CONFIG_PATA_PLATFORM=y
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# ISDN subsystem
+#
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+# CONFIG_SERIO_I8042 is not set
+# CONFIG_SERIO_SERPORT is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+# CONFIG_VT is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_SH_SCI=y
+CONFIG_SERIAL_SH_SCI_NR_UARTS=2
+CONFIG_SERIAL_SH_SCI_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_R3964 is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+# CONFIG_HWMON is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_DAB is not set
+
+#
+# Graphics support
+#
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
+# CONFIG_FB is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# HID Devices
+#
+# CONFIG_HID is not set
+
+#
+# USB support
+#
+# CONFIG_USB_ARCH_HAS_HCD is not set
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+# CONFIG_RTC_DRV_TEST is not set
+
+#
+# I2C RTC drivers
+#
+
+#
+# SPI RTC drivers
+#
+
+#
+# Platform RTC drivers
+#
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+CONFIG_RTC_DRV_SH=y
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
+# CONFIG_EXT4DEV_FS is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+# CONFIG_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+CONFIG_HUGETLBFS=y
+CONFIG_HUGETLB_PAGE=y
+CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Profiling support
+#
+CONFIG_PROFILING=y
+# CONFIG_OPROFILE is not set
+
+#
+# Kernel hacking
+#
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_PRINTK_TIME=y
+# CONFIG_ENABLE_MUST_CHECK is not set
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+CONFIG_DEBUG_SLAB=y
+CONFIG_DEBUG_SLAB_LEAK=y
+CONFIG_DEBUG_PREEMPT=y
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+CONFIG_DEBUG_SPINLOCK=y
+CONFIG_DEBUG_MUTEXES=y
+CONFIG_DEBUG_LOCK_ALLOC=y
+# CONFIG_PROVE_LOCKING is not set
+CONFIG_LOCKDEP=y
+CONFIG_DEBUG_LOCKDEP=y
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+CONFIG_STACKTRACE=y
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+# CONFIG_DEBUG_INFO is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_SH_STANDARD_BIOS=y
+# CONFIG_EARLY_SCIF_CONSOLE is not set
+CONFIG_EARLY_PRINTK=y
+# CONFIG_DEBUG_BOOTMEM is not set
+CONFIG_DEBUG_STACKOVERFLOW=y
+CONFIG_DEBUG_STACK_USAGE=y
+# CONFIG_4KSTACKS is not set
+# CONFIG_SH_KGDB is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
index 99935f9daf4b89b53825eefdf7df3ae2546e4d10..333898077c7c55f2da5ac60a06e0bf3628e4c2a0 100644 (file)
@@ -36,23 +36,6 @@ config NR_DMA_CHANNELS
          support. Setting this to a higher value allows for cascading DMACs
          with additional channels.
 
-config DMA_PAGE_OPS
-       bool "Use DMAC for page copy/clear"
-       depends on SH_DMA && BROKEN
-       help
-         Selecting this option will use a dual-address mode configured channel
-         in the SH DMAC for copy_page()/clear_page(). Primarily a performance
-         hack.
-
-config DMA_PAGE_OPS_CHANNEL
-       depends on DMA_PAGE_OPS
-       int "DMA channel for sh memory-manager page copy/clear"
-       default "3"
-       help
-         This allows the specification of the dual address dma channel,
-         in case channel 3 is unavailable. On the SH4, channels 1,2, and 3
-         are dual-address capable.
-
 config SH_DMABRG
        bool "SH7760 DMABRG support"
        depends on CPU_SUBTYPE_SH7760
index 6d1cbbe6745ca430d6a8984a1a77dca4882a3a09..fbc6f2c8649fa72f17c3c1157871a043a1ee38de 100644 (file)
@@ -1,5 +1,6 @@
 config PCI
        bool "PCI support"
+       depends on SYS_SUPPORTS_PCI
        help
          Find out whether you have a PCI motherboard. PCI is the name of a
          bus system, i.e. the way the CPU talks to the other stuff inside
index 9104b6257644dbcb2cff22d38f475f038c89656c..1f141a8ba17c09726d026161c9579c835d9896d9 100644 (file)
@@ -4,10 +4,9 @@
 
 extra-y        := head.o init_task.o vmlinux.lds
 
-obj-y  := process.o signal.o traps.o irq.o \
-       ptrace.o setup.o time.o sys_sh.o semaphore.o \
-       io.o io_generic.o sh_ksyms.o syscalls.o \
-       debugtraps.o
+obj-y  := debugtraps.o io.o io_generic.o irq.o machvec.o process.o ptrace.o \
+          semaphore.o setup.o signal.o sys_sh.o syscalls.o \
+          time.o topology.o traps.o
 
 obj-y                          += cpu/ timers/
 obj-$(CONFIG_VSYSCALL)         += vsyscall/
@@ -17,7 +16,7 @@ obj-$(CONFIG_CF_ENABLER)      += cf-enabler.o
 obj-$(CONFIG_SH_STANDARD_BIOS) += sh_bios.o
 obj-$(CONFIG_SH_KGDB)          += kgdb_stub.o kgdb_jmp.o
 obj-$(CONFIG_SH_CPU_FREQ)      += cpufreq.o
-obj-$(CONFIG_MODULES)          += module.o
+obj-$(CONFIG_MODULES)          += sh_ksyms.o module.o
 obj-$(CONFIG_EARLY_PRINTK)     += early_printk.o
 obj-$(CONFIG_KEXEC)            += machine_kexec.o relocate_kernel.o
 obj-$(CONFIG_CRASH_DUMP)       += crash_dump.o
index ebc73b85094a9b9b63a3667556c077c432e0e624..1c3b99642e1c3df4d2d90b37f26a1482655c27d4 100644 (file)
@@ -75,11 +75,7 @@ static int __init cf_init_default(void)
 #if defined(CONFIG_CPU_SH4)
        allocate_cf_area();
 #endif
-#if defined(CONFIG_SH_UNKNOWN)
-       /* This should be done in each board's init_xxx_irq. */
-       make_imask_irq(14);
-       disable_irq(14);
-#endif
+
        return 0;
 }
 
index 6451ad630174b22646d1e7ab574945ff6059e8ec..9172e97dc26ab0d9f6e5155f464a33fa5c227be9 100644 (file)
@@ -21,8 +21,7 @@
 #include <asm/cacheflush.h>
 #include <asm/cache.h>
 #include <asm/io.h>
-
-extern void detect_cpu_and_cache_system(void);
+#include <asm/ubc.h>
 
 /*
  * Generic wrapper for command line arguments to disable on-chip
@@ -152,15 +151,6 @@ static void __init cache_init(void)
        flags |= CCR_CACHE_CB;
 #endif
 
-#ifdef CONFIG_SH_OCRAM
-       /* Turn on OCRAM -- halve the OC */
-       flags |= CCR_CACHE_ORA;
-       current_cpu_data.dcache.sets >>= 1;
-
-       current_cpu_data.dcache.way_size = current_cpu_data.dcache.sets *
-                                   current_cpu_data.dcache.linesz;
-#endif
-
        ctrl_outl(flags, CCR);
        back_to_P1();
 }
@@ -269,7 +259,6 @@ asmlinkage void __init sh_cpu_init(void)
        }
 #endif
 
-#ifdef CONFIG_UBC_WAKEUP
        /*
         * Some brain-damaged loaders decided it would be a good idea to put
         * the UBC to sleep. This causes some issues when it comes to things
@@ -277,7 +266,5 @@ asmlinkage void __init sh_cpu_init(void)
         * we wake it up and hope that all is well.
         */
        ubc_wakeup();
-#endif
-
        speculative_execution_init();
 }
index d8e22f4ff0f0a517497307fa45f4f1ff5322c4cf..cc5221390e09a13c20a9ee358dcc122ea05920b1 100644 (file)
 #include <linux/kernel.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
+#include <asm/smp.h>
 
-#if defined(CONFIG_CPU_SUBTYPE_SH7760)
-#define INTC2_BASE     0xfe080000
-#define INTC2_INTMSK   (INTC2_BASE + 0x40)
-#define INTC2_INTMSKCLR        (INTC2_BASE + 0x60)
-#elif defined(CONFIG_CPU_SUBTYPE_SH7780) || \
-      defined(CONFIG_CPU_SUBTYPE_SH7785)
-#define INTC2_BASE     0xffd40000
-#define INTC2_INTMSK   (INTC2_BASE + 0x38)
-#define INTC2_INTMSKCLR        (INTC2_BASE + 0x3c)
-#endif
+static inline struct intc2_desc *get_intc2_desc(unsigned int irq)
+{
+       struct irq_chip *chip = get_irq_chip(irq);
+       return (void *)((char *)chip - offsetof(struct intc2_desc, chip));
+}
 
 static void disable_intc2_irq(unsigned int irq)
 {
        struct intc2_data *p = get_irq_chip_data(irq);
-       ctrl_outl(1 << p->msk_shift, INTC2_INTMSK + p->msk_offset);
+       struct intc2_desc *d = get_intc2_desc(irq);
+
+       ctrl_outl(1 << p->msk_shift, d->msk_base + p->msk_offset +
+                                    (hard_smp_processor_id() * 4));
 }
 
 static void enable_intc2_irq(unsigned int irq)
 {
        struct intc2_data *p = get_irq_chip_data(irq);
-       ctrl_outl(1 << p->msk_shift, INTC2_INTMSKCLR + p->msk_offset);
-}
+       struct intc2_desc *d = get_intc2_desc(irq);
 
-static struct irq_chip intc2_irq_chip = {
-       .name           = "INTC2",
-       .mask           = disable_intc2_irq,
-       .unmask         = enable_intc2_irq,
-       .mask_ack       = disable_intc2_irq,
-};
+       ctrl_outl(1 << p->msk_shift, d->mskclr_base + p->msk_offset +
+                                    (hard_smp_processor_id() * 4));
+}
 
 /*
  * Setup an INTC2 style interrupt.
@@ -56,30 +51,36 @@ static struct irq_chip intc2_irq_chip = {
  *
  * in the intc2_data table.
  */
-void make_intc2_irq(struct intc2_data *table, unsigned int nr_irqs)
+void register_intc2_controller(struct intc2_desc *desc)
 {
        int i;
 
-       for (i = 0; i < nr_irqs; i++) {
+       desc->chip.mask = disable_intc2_irq;
+       desc->chip.unmask = enable_intc2_irq;
+       desc->chip.mask_ack = disable_intc2_irq;
+
+       for (i = 0; i < desc->nr_irqs; i++) {
                unsigned long ipr, flags;
-               struct intc2_data *p = table + i;
+               struct intc2_data *p = desc->intc2_data + i;
 
                disable_irq_nosync(p->irq);
 
-               /* Set the priority level */
-               local_irq_save(flags);
+               if (desc->prio_base) {
+                       /* Set the priority level */
+                       local_irq_save(flags);
 
-               ipr = ctrl_inl(INTC2_BASE + p->ipr_offset);
-               ipr &= ~(0xf << p->ipr_shift);
-               ipr |= p->priority << p->ipr_shift;
-               ctrl_outl(ipr, INTC2_BASE + p->ipr_offset);
+                       ipr = ctrl_inl(desc->prio_base + p->ipr_offset);
+                       ipr &= ~(0xf << p->ipr_shift);
+                       ipr |= p->priority << p->ipr_shift;
+                       ctrl_outl(ipr, desc->prio_base + p->ipr_offset);
 
-               local_irq_restore(flags);
+                       local_irq_restore(flags);
+               }
 
-               set_irq_chip_and_handler_name(p->irq, &intc2_irq_chip,
+               set_irq_chip_and_handler_name(p->irq, &desc->chip,
                                              handle_level_irq, "level");
                set_irq_chip_data(p->irq, p);
 
-               enable_intc2_irq(p->irq);
+               disable_intc2_irq(p->irq);
        }
 }
index 210280b6fddfdb5484ef472a2307cf54d7363a23..98e84f40c713bf39bdd9e8599aab7fa92fb0570d 100644 (file)
 #include <linux/io.h>
 #include <linux/interrupt.h>
 
+static inline struct ipr_desc *get_ipr_desc(unsigned int irq)
+{
+       struct irq_chip *chip = get_irq_chip(irq);
+       return (void *)((char *)chip - offsetof(struct ipr_desc, chip));
+}
+
 static void disable_ipr_irq(unsigned int irq)
 {
        struct ipr_data *p = get_irq_chip_data(irq);
+       unsigned long addr = get_ipr_desc(irq)->ipr_offsets[p->ipr_idx];
        /* Set the priority in IPR to 0 */
-       ctrl_outw(ctrl_inw(p->addr) & (0xffff ^ (0xf << p->shift)), p->addr);
+       ctrl_outw(ctrl_inw(addr) & (0xffff ^ (0xf << p->shift)), addr);
 }
 
 static void enable_ipr_irq(unsigned int irq)
 {
        struct ipr_data *p = get_irq_chip_data(irq);
+       unsigned long addr = get_ipr_desc(irq)->ipr_offsets[p->ipr_idx];
        /* Set priority in IPR back to original value */
-       ctrl_outw(ctrl_inw(p->addr) | (p->priority << p->shift), p->addr);
+       ctrl_outw(ctrl_inw(addr) | (p->priority << p->shift), addr);
 }
 
-static struct irq_chip ipr_irq_chip = {
-       .name           = "IPR",
-       .mask           = disable_ipr_irq,
-       .unmask         = enable_ipr_irq,
-       .mask_ack       = disable_ipr_irq,
-};
-
-unsigned int map_ipridx_to_addr(int idx) __attribute__ ((weak));
-unsigned int map_ipridx_to_addr(int idx)
-{
-       return 0;
-}
+/*
+ * The shift value is now the number of bits to shift, not the number of
+ * bits/4. This is to make it easier to read the value directly from the
+ * datasheets. The IPR address is calculated using the ipr_offset table.
+ */
 
-void make_ipr_irq(struct ipr_data *table, unsigned int nr_irqs)
+void register_ipr_controller(struct ipr_desc *desc)
 {
        int i;
 
-       for (i = 0; i < nr_irqs; i++) {
-               unsigned int irq = table[i].irq;
+       desc->chip.mask = disable_ipr_irq;
+       desc->chip.unmask = enable_ipr_irq;
+       desc->chip.mask_ack = disable_ipr_irq;
 
-               if (!irq)
-                       irq = table[i].irq = i;
+       for (i = 0; i < desc->nr_irqs; i++) {
+               struct ipr_data *p = desc->ipr_data + i;
 
-               /* could the IPR index be mapped, if not we ignore this */
-               if (!table[i].addr) {
-                       table[i].addr = map_ipridx_to_addr(table[i].ipr_idx);
-                       if (!table[i].addr)
-                               continue;
-               }
+               BUG_ON(p->ipr_idx >= desc->nr_offsets);
+               BUG_ON(!desc->ipr_offsets[p->ipr_idx]);
 
-               disable_irq_nosync(irq);
-               set_irq_chip_and_handler_name(irq, &ipr_irq_chip,
+               disable_irq_nosync(p->irq);
+               set_irq_chip_and_handler_name(p->irq, &desc->chip,
                                      handle_level_irq, "level");
-               set_irq_chip_data(irq, &table[i]);
-               enable_ipr_irq(irq);
+               set_irq_chip_data(p->irq, p);
+               disable_ipr_irq(p->irq);
        }
 }
-EXPORT_SYMBOL(make_ipr_irq);
+
+EXPORT_SYMBOL(register_ipr_controller);
 
 #if !defined(CONFIG_CPU_HAS_PINT_IRQ)
 int ipr_irq_demux(int irq)
index c16dc8fec489655ccf106612ab77a0adf6c3b7c0..ee8f1fe84b08f2833aee1517593b9ad7b5c6dec0 100644 (file)
@@ -311,6 +311,7 @@ restore_all:
        rte
         nop
 
+       .align 2
 #ifdef CONFIG_TRACE_IRQFLAGS
 1:     .long   trace_hardirqs_off
 #endif
index 108e81b682ed0cb18cfb72f72892f1d08316002c..abbf17427e52c87bb2e25e70828e722997ef64a2 100644 (file)
@@ -9,23 +9,14 @@
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  */
-
-
 #include <linux/init.h>
+#include <linux/smp.h>
 #include <asm/processor.h>
 #include <asm/cache.h>
 
 int __init detect_cpu_and_cache_system(void)
 {
-#if defined(CONFIG_CPU_SUBTYPE_SH7604)
-       current_cpu_data.type                   = CPU_SH7604;
-       current_cpu_data.dcache.ways            = 4;
-       current_cpu_data.dcache.way_incr        = (1<<10);
-       current_cpu_data.dcache.sets            = 64;
-       current_cpu_data.dcache.entry_shift     = 4;
-       current_cpu_data.dcache.linesz          = L1_CACHE_BYTES;
-       current_cpu_data.dcache.flags           = 0;
-#elif defined(CONFIG_CPU_SUBTYPE_SH7619)
+#if defined(CONFIG_CPU_SUBTYPE_SH7619)
        current_cpu_data.type                   = CPU_SH7619;
        current_cpu_data.dcache.ways            = 4;
        current_cpu_data.dcache.way_incr        = (1<<12);
index f83ff8a68f3567a5b70cc435ba0195feece808a9..1a107fe22dde3b1b33ed3eb5b5a0c1c8b8d8c23d 100644 (file)
@@ -52,7 +52,7 @@ static int __init sh7619_devices_setup(void)
 }
 __initcall(sh7619_devices_setup);
 
-static struct ipr_data sh7619_ipr_map[] = {
+static struct ipr_data ipr_irq_table[] = {
        { 86, 0,  4, 2 },       /* CMI0 */
        { 88, 1, 12, 3 },       /* SCIF0_ERI */
        { 89, 1, 12, 3 },       /* SCIF0_RXI */
@@ -68,7 +68,7 @@ static struct ipr_data sh7619_ipr_map[] = {
        { 99, 1,  4, 3 },       /* SCIF2_TXI */
 };
 
-static unsigned int ipr_offsets[] = {
+static unsigned long ipr_offsets[] = {
        0xf8080000,     /* IPRC */
        0xf8080002,     /* IPRD */
        0xf8080004,     /* IPRE */
@@ -76,15 +76,19 @@ static unsigned int ipr_offsets[] = {
        0xf8080008,     /* IPRG */
 };
 
-/* given the IPR index return the address of the IPR register */
-unsigned int map_ipridx_to_addr(int idx)
-{
-       if (unlikely(idx >= ARRAY_SIZE(ipr_offsets)))
-               return 0;
-       return ipr_offsets[idx];
-}
+static struct ipr_desc ipr_irq_desc = {
+       .ipr_offsets    = ipr_offsets,
+       .nr_offsets     = ARRAY_SIZE(ipr_offsets),
+
+       .ipr_data       = ipr_irq_table,
+       .nr_irqs        = ARRAY_SIZE(ipr_irq_table),
+
+       .chip = {
+               .name   = "IPR-sh7619",
+       },
+};
 
 void __init init_IRQ_ipr(void)
 {
-       make_ipr_irq(sh7619_ipr_map, ARRAY_SIZE(sh7619_ipr_map));
+       register_ipr_controller(&ipr_irq_desc);
 }
index 4ed9110632bc5d0d368c0437a0d372dbf4bc651f..b6e3a6351fa6fb72b32e739ffd0ecb03a266cfe7 100644 (file)
@@ -57,7 +57,7 @@ static int __init sh7206_devices_setup(void)
 }
 __initcall(sh7206_devices_setup);
 
-static struct ipr_data sh7206_ipr_map[] = {
+static struct ipr_data ipr_irq_table[] = {
        { 140,  7, 12, 2 },     /* CMI0 */
        { 164,  8,  4, 2 },     /* MTU2_TGI1A */
        { 240, 13, 12, 3 },     /* SCIF0_BRI */
@@ -78,7 +78,7 @@ static struct ipr_data sh7206_ipr_map[] = {
        { 255, 13,  0, 3 },     /* SCIF3_TXI */
 };
 
-static unsigned int ipr_offsets[] = {
+static unsigned long ipr_offsets[] = {
        0xfffe0818,     /* IPR01 */
        0xfffe081a,     /* IPR02 */
        0,              /* unused */
@@ -95,15 +95,19 @@ static unsigned int ipr_offsets[] = {
        0xfffe0c10,     /* IPR14 */
 };
 
-/* given the IPR index return the address of the IPR register */
-unsigned int map_ipridx_to_addr(int idx)
-{
-       if (unlikely(idx >= ARRAY_SIZE(ipr_offsets)))
-               return 0;
-       return ipr_offsets[idx];
-}
+static struct ipr_desc ipr_irq_desc = {
+       .ipr_offsets    = ipr_offsets,
+       .nr_offsets     = ARRAY_SIZE(ipr_offsets),
+
+       .ipr_data       = ipr_irq_table,
+       .nr_irqs        = ARRAY_SIZE(ipr_irq_table),
+
+       .chip = {
+               .name   = "IPR-sh7206",
+       },
+};
 
 void __init init_IRQ_ipr(void)
 {
-       make_ipr_irq(sh7206_ipr_map, ARRAY_SIZE(sh7206_ipr_map));
+       register_ipr_controller(&ipr_irq_desc);
 }
index b0b59d4a33ca8ada675d624481d76b1708c9a4fc..d8e122971c3e2caaa78028513b8f3a61d78de425 100644 (file)
@@ -340,8 +340,27 @@ ENTRY(vbr_base)
 general_exception:
        mov.l   1f, k2
        mov.l   2f, k3
+#ifdef CONFIG_CPU_SUBTYPE_SHX3
+       mov.l   @k2, k2
+
+       ! Is EXPEVT larger than 0x800?
+       mov     #0x8, k0
+       shll8   k0
+       cmp/hs  k0, k2
+       bf      0f
+
+       ! then add 0x580 (k2 is 0xd80 or 0xda0)
+       mov     #0x58, k0
+       shll2   k0
+       shll2   k0
+       add     k0, k2
+0:
+       bra     handle_exception
+        nop
+#else
        bra     handle_exception
         mov.l  @k2, k2
+#endif
        .align  2
 1:     .long   EXPEVT
 2:     .long   ret_from_exception
index 1983fb7ad6ea704cbf6c1620f890ecf9616c8398..a55b8ce2c54c46e156319f674928e36f07bd7f15 100644 (file)
@@ -48,7 +48,7 @@ static int __init sh7705_devices_setup(void)
 }
 __initcall(sh7705_devices_setup);
 
-static struct ipr_data sh7705_ipr_map[] = {
+static struct ipr_data ipr_irq_table[] = {
        /* IRQ, IPR-idx, shift, priority */
        { 16, 0, 12, 2 }, /* TMU0 TUNI*/
        { 17, 0,  8, 2 }, /* TMU1 TUNI */
@@ -70,25 +70,29 @@ static struct ipr_data sh7705_ipr_map[] = {
 };
 
 static unsigned long ipr_offsets[] = {
-       0xFFFFFEE2      /* 0: IPRA */
-,      0xFFFFFEE4      /* 1: IPRB */
-,      0xA4000016      /* 2: IPRC */
-,      0xA4000018      /* 3: IPRD */
-,      0xA400001A      /* 4: IPRE */
-,      0xA4080000      /* 5: IPRF */
-,      0xA4080002      /* 6: IPRG */
-,      0xA4080004      /* 7: IPRH */
+       0xFFFFFEE2,     /* 0: IPRA */
+       0xFFFFFEE4,     /* 1: IPRB */
+       0xA4000016,     /* 2: IPRC */
+       0xA4000018,     /* 3: IPRD */
+       0xA400001A,     /* 4: IPRE */
+       0xA4080000,     /* 5: IPRF */
+       0xA4080002,     /* 6: IPRG */
+       0xA4080004,     /* 7: IPRH */
 };
 
-/* given the IPR index return the address of the IPR register */
-unsigned int map_ipridx_to_addr(int idx)
-{
-       if (idx >= ARRAY_SIZE(ipr_offsets))
-               return 0;
-       return ipr_offsets[idx];
-}
+static struct ipr_desc ipr_irq_desc = {
+       .ipr_offsets    = ipr_offsets,
+       .nr_offsets     = ARRAY_SIZE(ipr_offsets),
+
+       .ipr_data       = ipr_irq_table,
+       .nr_irqs        = ARRAY_SIZE(ipr_irq_table),
+
+       .chip = {
+               .name   = "IPR-sh7705",
+       },
+};
 
-void __init init_IRQ_ipr()
+void __init init_IRQ_ipr(void)
 {
-       make_ipr_irq(sh7705_ipr_map, ARRAY_SIZE(sh7705_ipr_map));
+       register_ipr_controller(&ipr_irq_desc);
 }
index c7d7c35fc83443843a51a5e884f992c7593ca705..d79ec0c0522fb33121023cc70f1d9c285a83140b 100644 (file)
 #include <linux/serial.h>
 #include <asm/sci.h>
 
+static struct resource rtc_resources[] = {
+       [0] =   {
+               .start  = 0xfffffec0,
+               .end    = 0xfffffec0 + 0x1e,
+               .flags  = IORESOURCE_IO,
+       },
+       [1] =   {
+               .start  = 20,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] =   {
+               .start  = 21,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [3] =   {
+               .start  = 22,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
 static struct plat_sci_port sci_platform_data[] = {
        {
                .mapbase        = 0xfffffe80,
@@ -41,8 +61,16 @@ static struct platform_device sci_device = {
        },
 };
 
+static struct platform_device rtc_device = {
+       .name           = "sh-rtc",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(rtc_resources),
+       .resource       = rtc_resources,
+};
+
 static struct platform_device *sh7709_devices[] __initdata = {
        &sci_device,
+       &rtc_device,
 };
 
 static int __init sh7709_devices_setup(void)
@@ -52,32 +80,66 @@ static int __init sh7709_devices_setup(void)
 }
 __initcall(sh7709_devices_setup);
 
-#define IPRx(A,N)      .addr=A, .shift=N
-#define IPRA(N)        IPRx(0xfffffee2UL,N)
-#define IPRB(N)        IPRx(0xfffffee4UL,N)
-#define IPRC(N)        IPRx(0xa4000016UL,N)
-#define IPRD(N)        IPRx(0xa4000018UL,N)
-#define IPRE(N)        IPRx(0xa400001aUL,N)
-
-static struct ipr_data sh7709_ipr_map[] = {
-       [16]            = { IPRA(12), 2 }, /* TMU TUNI0 */
-       [17]            = { IPRA(8),  4 }, /* TMU TUNI1 */
-       [18 ... 19]     = { IPRA(4),  1 }, /* TMU TUNI1 */
-       [20 ... 22]     = { IPRA(0),  2 }, /* RTC CUI */
-       [23 ... 26]     = { IPRB(4),  3 }, /* SCI */
-       [27]            = { IPRB(12), 2 }, /* WDT ITI */
-       [32]            = { IPRC(0),  1 }, /* IRQ 0 */
-       [33]            = { IPRC(4),  1 }, /* IRQ 1 */
-       [34]            = { IPRC(8),  1 }, /* IRQ 2 APM */
-       [35]            = { IPRC(12), 1 }, /* IRQ 3 TOUCHSCREEN */
-       [36]            = { IPRD(0),  1 }, /* IRQ 4 */
-       [37]            = { IPRD(4),  1 }, /* IRQ 5 */
-       [48 ... 51]     = { IPRE(12), 7 }, /* DMA */
-       [52 ... 55]     = { IPRE(8),  3 }, /* IRDA */
-       [56 ... 59]     = { IPRE(4),  3 }, /* SCIF */
+static struct ipr_data ipr_irq_table[] = {
+       { 16, 0, 12, 2 }, /* TMU TUNI0 */
+       { 17, 0, 8,  4 }, /* TMU TUNI1 */
+       { 18, 0, 4,  1 }, /* TMU TUNI1 */
+       { 19, 0, 4,  1 }, /* TMU TUNI1 */
+       { 20, 0, 0,  2 }, /* RTC CUI */
+       { 21, 0, 0,  2 }, /* RTC CUI */
+       { 22, 0, 0,  2 }, /* RTC CUI */
+
+       { 23, 1, 4,  3 }, /* SCI */
+       { 24, 1, 4,  3 }, /* SCI */
+       { 25, 1, 4,  3 }, /* SCI */
+       { 26, 1, 4,  3 }, /* SCI */
+       { 27, 1, 12, 3 }, /* WDT ITI */
+
+       { 32, 2, 0,  1 }, /* IRQ 0 */
+       { 33, 2, 4,  1 }, /* IRQ 1 */
+       { 34, 2, 8,  1 }, /* IRQ 2 APM */
+       { 35, 2, 12, 1 }, /* IRQ 3 TOUCHSCREEN */
+
+       { 36, 3, 0,  1 }, /* IRQ 4 */
+       { 37, 3, 4,  1 }, /* IRQ 5 */
+
+       { 48, 4, 12, 7 }, /* DMA */
+       { 49, 4, 12, 7 }, /* DMA */
+       { 50, 4, 12, 7 }, /* DMA */
+       { 51, 4, 12, 7 }, /* DMA */
+
+       { 52, 4, 8,  3 }, /* IRDA */
+       { 53, 4, 8,  3 }, /* IRDA */
+       { 54, 4, 8,  3 }, /* IRDA */
+       { 55, 4, 8,  3 }, /* IRDA */
+
+       { 56, 4, 4,  3 }, /* SCIF */
+       { 57, 4, 4,  3 }, /* SCIF */
+       { 58, 4, 4,  3 }, /* SCIF */
+       { 59, 4, 4,  3 }, /* SCIF */
+};
+
+static unsigned long ipr_offsets[] = {
+       0xfffffee2,     /* 0: IPRA */
+       0xfffffee4,     /* 1: IPRB */
+       0xa4000016,     /* 2: IPRC */
+       0xa4000018,     /* 3: IPRD */
+       0xa400001a,     /* 4: IPRE */
+};
+
+static struct ipr_desc ipr_irq_desc = {
+       .ipr_offsets    = ipr_offsets,
+       .nr_offsets     = ARRAY_SIZE(ipr_offsets),
+
+       .ipr_data       = ipr_irq_table,
+       .nr_irqs        = ARRAY_SIZE(ipr_irq_table),
+
+       .chip = {
+               .name   = "IPR-sh7709",
+       },
 };
 
-void __init init_IRQ_ipr()
+void __init init_IRQ_ipr(void)
 {
-       make_ipr_irq(sh7709_ipr_map, ARRAY_SIZE(sh7709_ipr_map));
+       register_ipr_controller(&ipr_irq_desc);
 }
index 51760a7e7f1c1a3703ad20c8ec7801fd971d7ab6..f40e6dac337d91602b860890bd3d6f444106a6f6 100644 (file)
@@ -49,7 +49,7 @@ static int __init sh7710_devices_setup(void)
 }
 __initcall(sh7710_devices_setup);
 
-static struct ipr_data sh7710_ipr_map[] = {
+static struct ipr_data ipr_irq_table[] = {
        /* IRQ, IPR-idx, shift, priority */
        { 16, 0, 12, 2 }, /* TMU0 TUNI*/
        { 17, 0,  8, 2 }, /* TMU1 TUNI */
@@ -78,26 +78,30 @@ static struct ipr_data sh7710_ipr_map[] = {
 };
 
 static unsigned long ipr_offsets[] = {
-       0xA414FEE2      /* 0: IPRA */
-,      0xA414FEE4      /* 1: IPRB */
-,      0xA4140016      /* 2: IPRC */
-,      0xA4140018      /* 3: IPRD */
-,      0xA414001A      /* 4: IPRE */
-,      0xA4080000      /* 5: IPRF */
-,      0xA4080002      /* 6: IPRG */
-,      0xA4080004      /* 7: IPRH */
-,      0xA4080006      /* 8: IPRI */
+       0xA414FEE2,     /* 0: IPRA */
+       0xA414FEE4,     /* 1: IPRB */
+       0xA4140016,     /* 2: IPRC */
+       0xA4140018,     /* 3: IPRD */
+       0xA414001A,     /* 4: IPRE */
+       0xA4080000,     /* 5: IPRF */
+       0xA4080002,     /* 6: IPRG */
+       0xA4080004,     /* 7: IPRH */
+       0xA4080006,     /* 8: IPRI */
 };
 
-/* given the IPR index return the address of the IPR register */
-unsigned int map_ipridx_to_addr(int idx)
-{
-       if (idx >= ARRAY_SIZE(ipr_offsets))
-               return 0;
-       return ipr_offsets[idx];
-}
+static struct ipr_desc ipr_irq_desc = {
+       .ipr_offsets    = ipr_offsets,
+       .nr_offsets     = ARRAY_SIZE(ipr_offsets),
+
+       .ipr_data       = ipr_irq_table,
+       .nr_irqs        = ARRAY_SIZE(ipr_irq_table),
+
+       .chip = {
+               .name   = "IPR-sh7710",
+       },
+};
 
-void __init init_IRQ_ipr()
+void __init init_IRQ_ipr(void)
 {
-       make_ipr_irq(sh7710_ipr_map, ARRAY_SIZE(sh7710_ipr_map));
+       register_ipr_controller(&ipr_irq_desc);
 }
index 8add10bd82683d5efd5064faee11b0746e146c61..dadd6bffc128436fe50050c6296b35e15d7c81f2 100644 (file)
@@ -10,7 +10,11 @@ obj-$(CONFIG_SH_STORE_QUEUES)                += sq.o
 
 # CPU subtype setup
 obj-$(CONFIG_CPU_SUBTYPE_SH7750)       += setup-sh7750.o
+obj-$(CONFIG_CPU_SUBTYPE_SH7750R)      += setup-sh7750.o
+obj-$(CONFIG_CPU_SUBTYPE_SH7750S)      += setup-sh7750.o
+obj-$(CONFIG_CPU_SUBTYPE_SH7091)       += setup-sh7750.o
 obj-$(CONFIG_CPU_SUBTYPE_SH7751)       += setup-sh7750.o
+obj-$(CONFIG_CPU_SUBTYPE_SH7751R)      += setup-sh7750.o
 obj-$(CONFIG_CPU_SUBTYPE_SH7760)       += setup-sh7760.o
 obj-$(CONFIG_CPU_SUBTYPE_SH4_202)      += setup-sh4-202.o
 
index fab2eb07196b2538ac24bf5b05733df66fb1ee73..66c3f75647b2b35f504183db13eba216ad2258c3 100644 (file)
@@ -141,6 +141,14 @@ int __init detect_cpu_and_cache_system(void)
                        current_cpu_data.flags |= CPU_HAS_LLSC;
                }
                break;
+       case 0x4000:    /* 1st cut */
+       case 0x4001:    /* 2nd cut */
+               current_cpu_data.type = CPU_SHX3;
+               current_cpu_data.icache.ways = 4;
+               current_cpu_data.dcache.ways = 4;
+               current_cpu_data.flags |= CPU_HAS_FPU | CPU_HAS_PERF_COUNTER |
+                                         CPU_HAS_LLSC;
+               break;
        case 0x8000:
                current_cpu_data.type = CPU_ST40RA;
                current_cpu_data.flags |= CPU_HAS_FPU;
index 03b14cf78ddf248bc87ef69c325fb266e4085d5d..da153bcdfeb2b0a6c27af5e1c22e43f344341826 100644 (file)
@@ -82,7 +82,7 @@ static int __init sh7750_devices_setup(void)
 }
 __initcall(sh7750_devices_setup);
 
-static struct ipr_data sh7750_ipr_map[] = {
+static struct ipr_data ipr_irq_table[] = {
        /* IRQ, IPR-idx, shift, priority */
        { 16, 0, 12, 2 }, /* TMU0 TUNI*/
        { 17, 0, 12, 2 }, /* TMU1 TUNI */
@@ -106,8 +106,27 @@ static struct ipr_data sh7750_ipr_map[] = {
        { 38, 2,  8, 7 }, /* DMAC DMAE */
 };
 
+static unsigned long ipr_offsets[] = {
+       0xffd00004UL,   /* 0: IPRA */
+       0xffd00008UL,   /* 1: IPRB */
+       0xffd0000cUL,   /* 2: IPRC */
+       0xffd00010UL,   /* 3: IPRD */
+};
+
+static struct ipr_desc ipr_irq_desc = {
+       .ipr_offsets    = ipr_offsets,
+       .nr_offsets     = ARRAY_SIZE(ipr_offsets),
+
+       .ipr_data       = ipr_irq_table,
+       .nr_irqs        = ARRAY_SIZE(ipr_irq_table),
+
+       .chip = {
+               .name   = "IPR-sh7750",
+       },
+};
+
 #ifdef CONFIG_CPU_SUBTYPE_SH7751
-static struct ipr_data sh7751_ipr_map[] = {
+static struct ipr_data ipr_irq_table_sh7751[] = {
        { 44, 2,  8, 7 }, /* DMAC DMTE4 */
        { 45, 2,  8, 7 }, /* DMAC DMTE5 */
        { 46, 2,  8, 7 }, /* DMAC DMTE6 */
@@ -118,21 +137,26 @@ static struct ipr_data sh7751_ipr_map[] = {
        /*{ 72, INTPRI00,  8, ? },*/ /* TMU3 TUNI */
        /*{ 76, INTPRI00, 12, ? },*/ /* TMU4 TUNI */
 };
-#endif
 
-static unsigned long ipr_offsets[] = {
-       0xffd00004UL,   /* 0: IPRA */
-       0xffd00008UL,   /* 1: IPRB */
-       0xffd0000cUL,   /* 2: IPRC */
-       0xffd00010UL,   /* 3: IPRD */
+static struct ipr_desc ipr_irq_desc_sh7751 = {
+       .ipr_offsets    = ipr_offsets,
+       .nr_offsets     = ARRAY_SIZE(ipr_offsets),
+
+       .ipr_data       = ipr_irq_table_sh7751,
+       .nr_irqs        = ARRAY_SIZE(ipr_irq_table_sh7751),
+
+       .chip = {
+               .name   = "IPR-sh7751",
+       },
 };
+#endif
 
-/* given the IPR index return the address of the IPR register */
-unsigned int map_ipridx_to_addr(int idx)
+void __init init_IRQ_ipr(void)
 {
-       if (idx >= ARRAY_SIZE(ipr_offsets))
-               return 0;
-       return ipr_offsets[idx];
+       register_ipr_controller(&ipr_irq_desc);
+#ifdef CONFIG_CPU_SUBTYPE_SH7751
+       register_ipr_controller(&ipr_irq_desc_sh7751);
+#endif
 }
 
 #define INTC_ICR       0xffd00000UL
@@ -143,11 +167,3 @@ void ipr_irq_enable_irlm(void)
 {
        ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR);
 }
-
-void __init init_IRQ_ipr()
-{
-       make_ipr_irq(sh7750_ipr_map, ARRAY_SIZE(sh7750_ipr_map));
-#ifdef CONFIG_CPU_SUBTYPE_SH7751
-       make_ipr_irq(sh7751_ipr_map, ARRAY_SIZE(sh7751_ipr_map));
-#endif
-}
index b7c702821e6fed19ef060e0e2469ec7619246c71..3df169755673da10c15fcf1677e2f9dab74b0105 100644 (file)
@@ -96,7 +96,25 @@ static struct intc2_data intc2_irq_table[] = {
        {109,12,  0, 4,  0,  3},        /* CMTI */
 };
 
-static struct ipr_data sh7760_ipr_map[] = {
+static struct intc2_desc intc2_irq_desc __read_mostly = {
+       .prio_base      = 0xfe080000,
+       .msk_base       = 0xfe080040,
+       .mskclr_base    = 0xfe080060,
+
+       .intc2_data     = intc2_irq_table,
+       .nr_irqs        = ARRAY_SIZE(intc2_irq_table),
+
+       .chip = {
+               .name   = "INTC2-sh7760",
+       },
+};
+
+void __init init_IRQ_intc2(void)
+{
+       register_intc2_controller(&intc2_irq_desc);
+}
+
+static struct ipr_data ipr_irq_table[] = {
        /* IRQ, IPR-idx, shift, priority */
        { 16, 0, 12, 2 }, /* TMU0 TUNI*/
        { 17, 0,  8, 2 }, /* TMU1 TUNI */
@@ -133,20 +151,19 @@ static unsigned long ipr_offsets[] = {
        0xffd00010UL,   /* 3: IPRD */
 };
 
-/* given the IPR index return the address of the IPR register */
-unsigned int map_ipridx_to_addr(int idx)
-{
-       if (idx >= ARRAY_SIZE(ipr_offsets))
-               return 0;
-       return ipr_offsets[idx];
-}
+static struct ipr_desc ipr_irq_desc = {
+       .ipr_offsets    = ipr_offsets,
+       .nr_offsets     = ARRAY_SIZE(ipr_offsets),
 
-void __init init_IRQ_intc2(void)
-{
-       make_intc2_irq(intc2_irq_table, ARRAY_SIZE(intc2_irq_table));
-}
+       .ipr_data       = ipr_irq_table,
+       .nr_irqs        = ARRAY_SIZE(ipr_irq_table),
+
+       .chip = {
+               .name   = "IPR-sh7760",
+       },
+};
 
-void __init  init_IRQ_ipr(void)
+void __init init_IRQ_ipr(void)
 {
-       make_ipr_irq(sh7760_ipr_map, ARRAY_SIZE(sh7760_ipr_map));
+       register_ipr_controller(&ipr_irq_desc);
 }
index ab7422f8f82000da1ac87e98c257861536d36cf2..400623286487b3b58ae81b74404f2a4fb9b6957e 100644 (file)
@@ -9,6 +9,7 @@ obj-$(CONFIG_CPU_SUBTYPE_SH7785)        += setup-sh7785.o
 obj-$(CONFIG_CPU_SUBTYPE_SH73180)      += setup-sh73180.o
 obj-$(CONFIG_CPU_SUBTYPE_SH7343)       += setup-sh7343.o
 obj-$(CONFIG_CPU_SUBTYPE_SH7722)       += setup-sh7722.o
+obj-$(CONFIG_CPU_SUBTYPE_SHX3)         += setup-shx3.o
 
 # Primary on-chip clocks (common)
 clock-$(CONFIG_CPU_SUBTYPE_SH73180)    := clock-sh73180.o
@@ -17,5 +18,6 @@ clock-$(CONFIG_CPU_SUBTYPE_SH7780)    := clock-sh7780.o
 clock-$(CONFIG_CPU_SUBTYPE_SH7785)     := clock-sh7785.o
 clock-$(CONFIG_CPU_SUBTYPE_SH7343)     := clock-sh7343.o
 clock-$(CONFIG_CPU_SUBTYPE_SH7722)     := clock-sh7722.o
+clock-$(CONFIG_CPU_SUBTYPE_SHX3)       := clock-shx3.o
 
 obj-y  += $(clock-y)
diff --git a/arch/sh/kernel/cpu/sh4a/clock-shx3.c b/arch/sh/kernel/cpu/sh4a/clock-shx3.c
new file mode 100644 (file)
index 0000000..c630b29
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * arch/sh/kernel/cpu/sh4/clock-shx3.c
+ *
+ * SH-X3 support for the clock framework
+ *
+ *  Copyright (C) 2006-2007  Renesas Technology Corp.
+ *  Copyright (C) 2006-2007  Renesas Solutions Corp.
+ *  Copyright (C) 2006-2007  Paul Mundt
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <asm/clock.h>
+#include <asm/freq.h>
+#include <asm/io.h>
+
+static int ifc_divisors[] = { 1, 2, 4 ,6 };
+static int bfc_divisors[] = { 1, 1, 1, 1, 1, 12, 16, 18, 24, 32, 36, 48 };
+static int pfc_divisors[] = { 1, 1, 1, 1, 1, 1, 1, 18, 24, 32, 36, 48 };
+static int cfc_divisors[] = { 1, 1, 4, 6 };
+
+#define IFC_POS                28
+#define IFC_MSK                0x0003
+#define BFC_MSK                0x000f
+#define PFC_MSK                0x000f
+#define CFC_MSK                0x0003
+#define BFC_POS                16
+#define PFC_POS                0
+#define CFC_POS                20
+
+static void master_clk_init(struct clk *clk)
+{
+       clk->rate *= pfc_divisors[(ctrl_inl(FRQCR) >> PFC_POS) & PFC_MSK];
+}
+
+static struct clk_ops shx3_master_clk_ops = {
+       .init           = master_clk_init,
+};
+
+static void module_clk_recalc(struct clk *clk)
+{
+       int idx = ((ctrl_inl(FRQCR) >> PFC_POS) & PFC_MSK);
+       clk->rate = clk->parent->rate / pfc_divisors[idx];
+}
+
+static struct clk_ops shx3_module_clk_ops = {
+       .recalc         = module_clk_recalc,
+};
+
+static void bus_clk_recalc(struct clk *clk)
+{
+       int idx = ((ctrl_inl(FRQCR) >> BFC_POS) & BFC_MSK);
+       clk->rate = clk->parent->rate / bfc_divisors[idx];
+}
+
+static struct clk_ops shx3_bus_clk_ops = {
+       .recalc         = bus_clk_recalc,
+};
+
+static void cpu_clk_recalc(struct clk *clk)
+{
+       int idx = ((ctrl_inl(FRQCR) >> IFC_POS) & IFC_MSK);
+       clk->rate = clk->parent->rate / ifc_divisors[idx];
+}
+
+static struct clk_ops shx3_cpu_clk_ops = {
+       .recalc         = cpu_clk_recalc,
+};
+
+static struct clk_ops *shx3_clk_ops[] = {
+       &shx3_master_clk_ops,
+       &shx3_module_clk_ops,
+       &shx3_bus_clk_ops,
+       &shx3_cpu_clk_ops,
+};
+
+void __init arch_init_clk_ops(struct clk_ops **ops, int idx)
+{
+       if (idx < ARRAY_SIZE(shx3_clk_ops))
+               *ops = shx3_clk_ops[idx];
+}
+
+static void shyway_clk_recalc(struct clk *clk)
+{
+       int idx = ((ctrl_inl(FRQCR) >> CFC_POS) & CFC_MSK);
+       clk->rate = clk->parent->rate / cfc_divisors[idx];
+}
+
+static struct clk_ops shx3_shyway_clk_ops = {
+       .recalc         = shyway_clk_recalc,
+};
+
+static struct clk shx3_shyway_clk = {
+       .name           = "shyway_clk",
+       .flags          = CLK_ALWAYS_ENABLED,
+       .ops            = &shx3_shyway_clk_ops,
+};
+
+/*
+ * Additional SHx3-specific on-chip clocks that aren't already part of the
+ * clock framework
+ */
+static struct clk *shx3_onchip_clocks[] = {
+       &shx3_shyway_clk,
+};
+
+static int __init shx3_clk_init(void)
+{
+       struct clk *clk = clk_get(NULL, "master_clk");
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(shx3_onchip_clocks); i++) {
+               struct clk *clkp = shx3_onchip_clocks[i];
+
+               clkp->parent = clk;
+               clk_register(clkp);
+               clk_enable(clkp);
+       }
+
+       /*
+        * Now that we have the rest of the clocks registered, we need to
+        * force the parent clock to propagate so that these clocks will
+        * automatically figure out their rate. We cheat by handing the
+        * parent clock its current rate and forcing child propagation.
+        */
+       clk_set_rate(clk, clk_get_rate(clk));
+
+       clk_put(clk);
+
+       return 0;
+}
+arch_initcall(shx3_clk_init);
index 1143fbf65fafa1bb8e2d0d31aa402af8c18eb796..a3e159ef6dfed4379444a63601fec6bab88ff29d 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * SH7722 Setup
  *
- *  Copyright (C) 2006  Paul Mundt
+ *  Copyright (C) 2006 - 2007  Paul Mundt
  *
  * This file is subject to the terms and conditions of the GNU General Public
  * License.  See the file "COPYING" in the main directory of this archive
@@ -10,6 +10,8 @@
 #include <linux/platform_device.h>
 #include <linux/init.h>
 #include <linux/serial.h>
+#include <linux/mm.h>
+#include <asm/mmzone.h>
 #include <asm/sci.h>
 
 static struct plat_sci_port sci_platform_data[] = {
@@ -42,7 +44,7 @@ static int __init sh7722_devices_setup(void)
 }
 __initcall(sh7722_devices_setup);
 
-static struct ipr_data sh7722_ipr_map[] = {
+static struct ipr_data ipr_irq_table[] = {
        /* IRQ, IPR-idx, shift, prio */
        { 16, 0, 12, 2 }, /* TMU0 */
        { 17, 0,  8, 2 }, /* TMU1 */
@@ -67,14 +69,25 @@ static unsigned long ipr_offsets[] = {
        0xa408002c, /* 11: IPRL */
 };
 
-unsigned int map_ipridx_to_addr(int idx)
+static struct ipr_desc ipr_irq_desc = {
+       .ipr_offsets    = ipr_offsets,
+       .nr_offsets     = ARRAY_SIZE(ipr_offsets),
+
+       .ipr_data       = ipr_irq_table,
+       .nr_irqs        = ARRAY_SIZE(ipr_irq_table),
+
+       .chip = {
+               .name   = "IPR-sh7722",
+       },
+};
+
+void __init init_IRQ_ipr(void)
 {
-       if (unlikely(idx >= ARRAY_SIZE(ipr_offsets)))
-               return 0;
-       return ipr_offsets[idx];
+       register_ipr_controller(&ipr_irq_desc);
 }
 
-void __init init_IRQ_ipr(void)
+void __init plat_mem_setup(void)
 {
-       make_ipr_irq(sh7722_ipr_map, ARRAY_SIZE(sh7722_ipr_map));
+       /* Register the URAM space as Node 1 */
+       setup_bootmem_node(1, 0x055f0000, 0x05610000);
 }
index 9aeaa2ddaa28d38a0e4e39f8ca6030adf4259671..b57c760bffde4abdc6af3505a864eda18f4a4f2f 100644 (file)
@@ -102,7 +102,20 @@ static struct intc2_data intc2_irq_table[] = {
        { 68, 0x14,  8, 0, 18, 2 },     /* PCIC4 */
 };
 
+static struct intc2_desc intc2_irq_desc __read_mostly = {
+       .prio_base      = 0xffd40000,
+       .msk_base       = 0xffd40038,
+       .mskclr_base    = 0xffd4003c,
+
+       .intc2_data     = intc2_irq_table,
+       .nr_irqs        = ARRAY_SIZE(intc2_irq_table),
+
+       .chip = {
+               .name   = "INTC2-sh7780",
+       },
+};
+
 void __init init_IRQ_intc2(void)
 {
-       make_intc2_irq(intc2_irq_table, ARRAY_SIZE(intc2_irq_table));
+       register_intc2_controller(&intc2_irq_desc);
 }
index 07b0de82cfe6b280e1848265a0ace7f13aab0bba..ce10ec5d6914dcd55e2fecc608338d5968e57820 100644 (file)
@@ -97,7 +97,21 @@ static struct intc2_data intc2_irq_table[] = {
        { 60, 12, 16, 0, 7, 3 },        /* SCIF5 ERI, RXI, BRI, TXI */
 };
 
+static struct intc2_desc intc2_irq_desc __read_mostly = {
+       .prio_base      = 0xffd40000,
+       .msk_base       = 0xffd40038,
+       .mskclr_base    = 0xffd4003c,
+
+       .intc2_data     = intc2_irq_table,
+       .nr_irqs        = ARRAY_SIZE(intc2_irq_table),
+
+       .chip = {
+               .name   = "INTC2-sh7785",
+       },
+};
+
 void __init init_IRQ_intc2(void)
 {
-       make_intc2_irq(intc2_irq_table, ARRAY_SIZE(intc2_irq_table));
+       register_intc2_controller(&intc2_irq_desc);
 }
+
diff --git a/arch/sh/kernel/cpu/sh4a/setup-shx3.c b/arch/sh/kernel/cpu/sh4a/setup-shx3.c
new file mode 100644 (file)
index 0000000..70683ea
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * SH-X3 Setup
+ *
+ *  Copyright (C) 2007  Paul Mundt
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#include <linux/platform_device.h>
+#include <linux/init.h>
+#include <linux/serial.h>
+#include <linux/io.h>
+#include <asm/sci.h>
+
+static struct plat_sci_port sci_platform_data[] = {
+       {
+               .mapbase        = 0xffc30000,
+               .flags          = UPF_BOOT_AUTOCONF,
+               .type           = PORT_SCIF,
+               .irqs           = { 40, 41, 43, 42 },
+       }, {
+               .mapbase        = 0xffc40000,
+               .flags          = UPF_BOOT_AUTOCONF,
+               .type           = PORT_SCIF,
+               .irqs           = { 44, 45, 47, 46 },
+       }, {
+               .mapbase        = 0xffc50000,
+               .flags          = UPF_BOOT_AUTOCONF,
+               .type           = PORT_SCIF,
+               .irqs           = { 48, 49, 51, 50 },
+       }, {
+               .mapbase        = 0xffc60000,
+               .flags          = UPF_BOOT_AUTOCONF,
+               .type           = PORT_SCIF,
+               .irqs           = { 52, 53, 55, 54 },
+       }, {
+               .flags = 0,
+       }
+};
+
+static struct platform_device sci_device = {
+       .name           = "sh-sci",
+       .id             = -1,
+       .dev            = {
+               .platform_data  = sci_platform_data,
+       },
+};
+
+static struct platform_device *shx3_devices[] __initdata = {
+       &sci_device,
+};
+
+static int __init shx3_devices_setup(void)
+{
+       return platform_add_devices(shx3_devices,
+                                   ARRAY_SIZE(shx3_devices));
+}
+__initcall(shx3_devices_setup);
+
+static struct intc2_data intc2_irq_table[] = {
+       { 16, 0, 0, 0, 1, 2 },          /* TMU0 */
+       { 40, 4, 0, 0x20, 0, 3 },       /* SCIF0 ERI */
+       { 41, 4, 0, 0x20, 1, 3 },       /* SCIF0 RXI */
+       { 42, 4, 0, 0x20, 2, 3 },       /* SCIF0 BRI */
+       { 43, 4, 0, 0x20, 3, 3 },       /* SCIF0 TXI */
+};
+
+static struct intc2_desc intc2_irq_desc __read_mostly = {
+       .prio_base      = 0xfe410000,
+       .msk_base       = 0xfe410820,
+       .mskclr_base    = 0xfe410850,
+
+       .intc2_data     = intc2_irq_table,
+       .nr_irqs        = ARRAY_SIZE(intc2_irq_table),
+
+       .chip = {
+               .name   = "INTC2-SHX3",
+       },
+};
+
+void __init init_IRQ_intc2(void)
+{
+       register_intc2_controller(&intc2_irq_desc);
+}
index 27b923c45b3d3dbceb19a3310575dd5bf46d8b1f..27897798867a40d47e22ca5d2db72c0a2f48205d 100644 (file)
@@ -158,15 +158,11 @@ asmlinkage int do_IRQ(unsigned int irq, struct pt_regs *regs)
 }
 
 #ifdef CONFIG_4KSTACKS
-/*
- * These should really be __section__(".bss.page_aligned") as well, but
- * gcc's 3.0 and earlier don't handle that correctly.
- */
 static char softirq_stack[NR_CPUS * THREAD_SIZE]
-               __attribute__((__aligned__(THREAD_SIZE)));
+               __attribute__((__section__(".bss.page_aligned")));
 
 static char hardirq_stack[NR_CPUS * THREAD_SIZE]
-               __attribute__((__aligned__(THREAD_SIZE)));
+               __attribute__((__section__(".bss.page_aligned")));
 
 /*
  * allocate per-cpu stacks for hardirq and for softirq processing
diff --git a/arch/sh/kernel/machvec.c b/arch/sh/kernel/machvec.c
new file mode 100644 (file)
index 0000000..23c5948
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * arch/sh/kernel/machvec.c
+ *
+ * The SuperH machine vector setup handlers, yanked from setup.c
+ *
+ *  Copyright (C) 1999  Niibe Yutaka
+ *  Copyright (C) 2002 - 2007 Paul Mundt
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#include <linux/init.h>
+#include <linux/string.h>
+#include <asm/machvec.h>
+#include <asm/sections.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+
+#define MV_NAME_SIZE 32
+
+#define for_each_mv(mv) \
+       for ((mv) = (struct sh_machine_vector *)&__machvec_start; \
+            (mv) && (unsigned long)(mv) < (unsigned long)&__machvec_end; \
+            (mv)++)
+
+static struct sh_machine_vector * __init get_mv_byname(const char *name)
+{
+       struct sh_machine_vector *mv;
+
+       for_each_mv(mv)
+               if (strcasecmp(name, mv->mv_name) == 0)
+                       return mv;
+
+       return NULL;
+}
+
+static unsigned int __initdata machvec_selected;
+
+static int __init early_parse_mv(char *from)
+{
+       char mv_name[MV_NAME_SIZE] = "";
+       char *mv_end;
+       char *mv_comma;
+       int mv_len;
+       struct sh_machine_vector *mvp;
+
+       mv_end = strchr(from, ' ');
+       if (mv_end == NULL)
+               mv_end = from + strlen(from);
+
+       mv_comma = strchr(from, ',');
+       mv_len = mv_end - from;
+       if (mv_len > (MV_NAME_SIZE-1))
+               mv_len = MV_NAME_SIZE-1;
+       memcpy(mv_name, from, mv_len);
+       mv_name[mv_len] = '\0';
+       from = mv_end;
+
+       machvec_selected = 1;
+
+       /* Boot with the generic vector */
+       if (strcmp(mv_name, "generic") == 0)
+               return 0;
+
+       mvp = get_mv_byname(mv_name);
+       if (unlikely(!mvp)) {
+               printk("Available vectors:\n\n\t'%s', ", sh_mv.mv_name);
+               for_each_mv(mvp)
+                       printk("'%s', ", mvp->mv_name);
+               printk("\n\n");
+               panic("Failed to select machvec '%s' -- halting.\n",
+                     mv_name);
+       } else
+               sh_mv = *mvp;
+
+       return 0;
+}
+early_param("sh_mv", early_parse_mv);
+
+void __init sh_mv_setup(void)
+{
+       /*
+        * Only overload the machvec if one hasn't been selected on
+        * the command line with sh_mv=
+        */
+       if (!machvec_selected) {
+               unsigned long machvec_size;
+
+               machvec_size = ((unsigned long)&__machvec_end -
+                               (unsigned long)&__machvec_start);
+
+               /*
+                * If the machvec hasn't been preselected, use the first
+                * vector (usually the only one) from .machvec.init.
+                */
+               if (machvec_size >= sizeof(struct sh_machine_vector))
+                       sh_mv = *(struct sh_machine_vector *)&__machvec_start;
+       }
+
+       printk(KERN_NOTICE "Booting machvec: %s\n", get_system_type());
+
+       /*
+        * Manually walk the vec, fill in anything that the board hasn't yet
+        * by hand, wrapping to the generic implementation.
+        */
+#define mv_set(elem) do { \
+       if (!sh_mv.mv_##elem) \
+               sh_mv.mv_##elem = generic_##elem; \
+} while (0)
+
+       mv_set(inb);    mv_set(inw);    mv_set(inl);
+       mv_set(outb);   mv_set(outw);   mv_set(outl);
+
+       mv_set(inb_p);  mv_set(inw_p);  mv_set(inl_p);
+       mv_set(outb_p); mv_set(outw_p); mv_set(outl_p);
+
+       mv_set(insb);   mv_set(insw);   mv_set(insl);
+       mv_set(outsb);  mv_set(outsw);  mv_set(outsl);
+
+       mv_set(readb);  mv_set(readw);  mv_set(readl);
+       mv_set(writeb); mv_set(writew); mv_set(writel);
+
+       mv_set(ioport_map);
+       mv_set(ioport_unmap);
+       mv_set(irq_demux);
+
+       if (!sh_mv.mv_nr_irqs)
+               sh_mv.mv_nr_irqs = NR_IRQS;
+}
index a11e2aa73cbc0888aeafb1bb74193d98a4293ad3..6334a4c54c7cefeff3a5f2e7b03a37c81839b805 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/kexec.h>
 #include <linux/kdebug.h>
 #include <linux/tick.h>
+#include <linux/reboot.h>
 #include <asm/uaccess.h>
 #include <asm/mmu_context.h>
 #include <asm/pgalloc.h>
@@ -319,9 +320,7 @@ static void ubc_set_tracing(int asid, unsigned long pc)
        ctrl_outl(pc, UBC_BARA);
 
 #ifdef CONFIG_MMU
-       /* We don't have any ASID settings for the SH-2! */
-       if (current_cpu_data.type != CPU_SH7604)
-               ctrl_outb(asid, UBC_BASRA);
+       ctrl_outb(asid, UBC_BASRA);
 #endif
 
        ctrl_outl(0, UBC_BAMRA);
@@ -405,8 +404,8 @@ asmlinkage int sys_fork(unsigned long r4, unsigned long r5,
                        unsigned long r6, unsigned long r7,
                        struct pt_regs __regs)
 {
-       struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
 #ifdef CONFIG_MMU
+       struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
        return do_fork(SIGCHLD, regs->regs[15], regs, 0, NULL, NULL);
 #else
        /* fork almost works, enough to trick you into looking elsewhere :-( */
@@ -449,23 +448,20 @@ asmlinkage int sys_vfork(unsigned long r4, unsigned long r5,
 /*
  * sys_execve() executes a new program.
  */
-asmlinkage int sys_execve(char *ufilename, char **uargv,
-                         char **uenvp, unsigned long r7,
+asmlinkage int sys_execve(char __user *ufilename, char __user * __user *uargv,
+                         char __user * __user *uenvp, unsigned long r7,
                          struct pt_regs __regs)
 {
        struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
        int error;
        char *filename;
 
-       filename = getname((char __user *)ufilename);
+       filename = getname(ufilename);
        error = PTR_ERR(filename);
        if (IS_ERR(filename))
                goto out;
 
-       error = do_execve(filename,
-                         (char __user * __user *)uargv,
-                         (char __user * __user *)uenvp,
-                         regs);
+       error = do_execve(filename, uargv, uenvp, regs);
        if (error == 0) {
                task_lock(current);
                current->ptrace &= ~PT_DTRACE;
index 3fb5fc0b550da970cb5cb8e0a1f5e524a4b2b734..f2eaa485d04d3d5e4ae320aba5eb614a9b99c814 100644 (file)
@@ -99,7 +99,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                ret = -EIO;
                if (copied != sizeof(tmp))
                        break;
-               ret = put_user(tmp,(unsigned long *) data);
+               ret = put_user(tmp,(unsigned long __user *) data);
                break;
        }
 
@@ -128,7 +128,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                        tmp = !!tsk_used_math(child);
                else
                        tmp = 0;
-               ret = put_user(tmp, (unsigned long *)data);
+               ret = put_user(tmp, (unsigned long __user *)data);
                break;
        }
 
@@ -196,7 +196,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
 
        case PTRACE_SINGLESTEP: {  /* set the trap flag. */
                long pc;
-               struct pt_regs *dummy = NULL;
+               struct pt_regs *regs = NULL;
 
                ret = -EIO;
                if (!valid_signal(data))
@@ -207,7 +207,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                        child->ptrace |= PT_DTRACE;
                }
 
-               pc = get_stack_long(child, (long)&dummy->pc);
+               pc = get_stack_long(child, (long)&regs->pc);
 
                /* Next scheduling will set up UBC */
                if (child->thread.ubc_pc == 0)
index c27729135935d77a8a4387fdb562e3bb86158357..de8e6e2f2c87d3f21e09bcb443c304812b4a60f6 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/kexec.h>
 #include <asm/uaccess.h>
 #include <asm/io.h>
+#include <asm/page.h>
 #include <asm/sections.h>
 #include <asm/irq.h>
 #include <asm/setup.h>
@@ -41,20 +42,19 @@ extern void * __rd_start, * __rd_end;
  * The bigger value means no problem.
  */
 struct sh_cpuinfo boot_cpu_data = { CPU_SH_NONE, 10000000, };
+
+/*
+ * The machine vector. First entry in .machvec.init, or clobbered by
+ * sh_mv= on the command line, prior to .machvec.init teardown.
+ */
+struct sh_machine_vector sh_mv = { .mv_name = "generic", };
+
 #ifdef CONFIG_VT
 struct screen_info screen_info;
 #endif
 
-#if defined(CONFIG_SH_UNKNOWN)
-struct sh_machine_vector sh_mv;
-#endif
-
 extern int root_mountflags;
 
-#define MV_NAME_SIZE 32
-
-static struct sh_machine_vector* __init get_mv_byname(const char* name);
-
 /*
  * This is set up by the setup-routine at boot-time
  */
@@ -80,131 +80,17 @@ static struct resource data_resource = { .name = "Kernel data", };
 
 unsigned long memory_start, memory_end;
 
-static inline void parse_cmdline (char ** cmdline_p, char mv_name[MV_NAME_SIZE],
-                                 struct sh_machine_vector** mvp,
-                                 unsigned long *mv_io_base)
+static int __init early_parse_mem(char *p)
 {
-       char c = ' ', *to = command_line, *from = COMMAND_LINE;
-       int len = 0;
-
-       /* Save unparsed command line copy for /proc/cmdline */
-       memcpy(boot_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
-       boot_command_line[COMMAND_LINE_SIZE-1] = '\0';
+       unsigned long size;
 
        memory_start = (unsigned long)PAGE_OFFSET+__MEMORY_START;
-       memory_end = memory_start + __MEMORY_SIZE;
-
-       for (;;) {
-               /*
-                * "mem=XXX[kKmM]" defines a size of memory.
-                */
-               if (c == ' ' && !memcmp(from, "mem=", 4)) {
-                       if (to != command_line)
-                               to--;
-                       {
-                               unsigned long mem_size;
-
-                               mem_size = memparse(from+4, &from);
-                               memory_end = memory_start + mem_size;
-                       }
-               }
-
-               if (c == ' ' && !memcmp(from, "sh_mv=", 6)) {
-                       char* mv_end;
-                       char* mv_comma;
-                       int mv_len;
-                       if (to != command_line)
-                               to--;
-                       from += 6;
-                       mv_end = strchr(from, ' ');
-                       if (mv_end == NULL)
-                               mv_end = from + strlen(from);
-
-                       mv_comma = strchr(from, ',');
-                       if ((mv_comma != NULL) && (mv_comma < mv_end)) {
-                               int ints[3];
-                               get_options(mv_comma+1, ARRAY_SIZE(ints), ints);
-                               *mv_io_base = ints[1];
-                               mv_len = mv_comma - from;
-                       } else {
-                               mv_len = mv_end - from;
-                       }
-                       if (mv_len > (MV_NAME_SIZE-1))
-                               mv_len = MV_NAME_SIZE-1;
-                       memcpy(mv_name, from, mv_len);
-                       mv_name[mv_len] = '\0';
-                       from = mv_end;
-
-                       *mvp = get_mv_byname(mv_name);
-               }
-
-               c = *(from++);
-               if (!c)
-                       break;
-               if (COMMAND_LINE_SIZE <= ++len)
-                       break;
-               *(to++) = c;
-       }
-       *to = '\0';
-       *cmdline_p = command_line;
-}
-
-static int __init sh_mv_setup(char **cmdline_p)
-{
-#ifdef CONFIG_SH_UNKNOWN
-       extern struct sh_machine_vector mv_unknown;
-#endif
-       struct sh_machine_vector *mv = NULL;
-       char mv_name[MV_NAME_SIZE] = "";
-       unsigned long mv_io_base = 0;
-
-       parse_cmdline(cmdline_p, mv_name, &mv, &mv_io_base);
-
-#ifdef CONFIG_SH_UNKNOWN
-       if (mv == NULL) {
-               mv = &mv_unknown;
-               if (*mv_name != '\0') {
-                       printk("Warning: Unsupported machine %s, using unknown\n",
-                              mv_name);
-               }
-       }
-       sh_mv = *mv;
-#endif
-
-       /*
-        * Manually walk the vec, fill in anything that the board hasn't yet
-        * by hand, wrapping to the generic implementation.
-        */
-#define mv_set(elem) do { \
-       if (!sh_mv.mv_##elem) \
-               sh_mv.mv_##elem = generic_##elem; \
-} while (0)
-
-       mv_set(inb);    mv_set(inw);    mv_set(inl);
-       mv_set(outb);   mv_set(outw);   mv_set(outl);
-
-       mv_set(inb_p);  mv_set(inw_p);  mv_set(inl_p);
-       mv_set(outb_p); mv_set(outw_p); mv_set(outl_p);
-
-       mv_set(insb);   mv_set(insw);   mv_set(insl);
-       mv_set(outsb);  mv_set(outsw);  mv_set(outsl);
-
-       mv_set(readb);  mv_set(readw);  mv_set(readl);
-       mv_set(writeb); mv_set(writew); mv_set(writel);
-
-       mv_set(ioport_map);
-       mv_set(ioport_unmap);
-       mv_set(irq_demux);
-
-#ifdef CONFIG_SH_UNKNOWN
-       __set_io_port_base(mv_io_base);
-#endif
-
-       if (!sh_mv.mv_nr_irqs)
-               sh_mv.mv_nr_irqs = NR_IRQS;
+       size = memparse(p, &p);
+       memory_end = memory_start + size;
 
        return 0;
 }
+early_param("mem", early_parse_mem);
 
 /*
  * Register fully available low RAM pages with the bootmem allocator.
@@ -230,7 +116,7 @@ static void __init register_bootmem_low_pages(void)
        free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(pages));
 }
 
-void __init setup_bootmem_allocator(unsigned long start_pfn)
+void __init setup_bootmem_allocator(unsigned long free_pfn)
 {
        unsigned long bootmap_size;
 
@@ -239,9 +125,10 @@ void __init setup_bootmem_allocator(unsigned long start_pfn)
         * bootstrap step all allocations (until the page allocator
         * is intact) must be done via bootmem_alloc().
         */
-       bootmap_size = init_bootmem_node(NODE_DATA(0), start_pfn,
+       bootmap_size = init_bootmem_node(NODE_DATA(0), free_pfn,
                                         min_low_pfn, max_low_pfn);
 
+       add_active_range(0, min_low_pfn, max_low_pfn);
        register_bootmem_low_pages();
 
        node_set_online(0);
@@ -254,7 +141,7 @@ void __init setup_bootmem_allocator(unsigned long start_pfn)
         * an invalid RAM area.
         */
        reserve_bootmem(__MEMORY_START+PAGE_SIZE,
-               (PFN_PHYS(start_pfn)+bootmap_size+PAGE_SIZE-1)-__MEMORY_START);
+               (PFN_PHYS(free_pfn)+bootmap_size+PAGE_SIZE-1)-__MEMORY_START);
 
        /*
         * reserve physical page 0 - it's a special BIOS page on many boxes,
@@ -262,6 +149,8 @@ void __init setup_bootmem_allocator(unsigned long start_pfn)
         */
        reserve_bootmem(__MEMORY_START, PAGE_SIZE);
 
+       sparse_memory_present_with_active_regions(0);
+
 #ifdef CONFIG_BLK_DEV_INITRD
        ROOT_DEV = MKDEV(RAMDISK_MAJOR, 0);
        if (&__rd_start != &__rd_end) {
@@ -315,10 +204,6 @@ void __init setup_arch(char **cmdline_p)
 {
        enable_mmu();
 
-#ifdef CONFIG_CMDLINE_BOOL
-       strcpy(COMMAND_LINE, CONFIG_CMDLINE);
-#endif
-
        ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
 
 #ifdef CONFIG_BLK_DEV_RAM
@@ -339,9 +224,22 @@ void __init setup_arch(char **cmdline_p)
        data_resource.start = virt_to_phys(_etext);
        data_resource.end = virt_to_phys(_edata)-1;
 
+       memory_start = (unsigned long)PAGE_OFFSET+__MEMORY_START;
+       memory_end = memory_start + __MEMORY_SIZE;
+
+#ifdef CONFIG_CMDLINE_BOOL
+       strlcpy(command_line, CONFIG_CMDLINE, sizeof(command_line));
+#else
+       strlcpy(command_line, COMMAND_LINE, sizeof(command_line));
+#endif
+
+       /* Save unparsed command line copy for /proc/cmdline */
+       memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
+       *cmdline_p = command_line;
+
        parse_early_param();
 
-       sh_mv_setup(cmdline_p);
+       sh_mv_setup();
 
        /*
         * Find the highest page frame number we have available
@@ -355,8 +253,9 @@ void __init setup_arch(char **cmdline_p)
        min_low_pfn = __MEMORY_START >> PAGE_SHIFT;
 
        nodes_clear(node_online_map);
+
+       /* Setup bootmem with available RAM */
        setup_memory();
-       paging_init();
        sparse_init();
 
 #ifdef CONFIG_DUMMY_CONSOLE
@@ -366,46 +265,13 @@ void __init setup_arch(char **cmdline_p)
        /* Perform the machine specific initialisation */
        if (likely(sh_mv.mv_setup))
                sh_mv.mv_setup(cmdline_p);
-}
-
-struct sh_machine_vector* __init get_mv_byname(const char* name)
-{
-       extern long __machvec_start, __machvec_end;
-       struct sh_machine_vector *all_vecs =
-               (struct sh_machine_vector *)&__machvec_start;
-
-       int i, n = ((unsigned long)&__machvec_end
-                   - (unsigned long)&__machvec_start)/
-               sizeof(struct sh_machine_vector);
-
-       for (i = 0; i < n; ++i) {
-               struct sh_machine_vector *mv = &all_vecs[i];
-               if (mv == NULL)
-                       continue;
-               if (strcasecmp(name, get_system_type()) == 0) {
-                       return mv;
-               }
-       }
-       return NULL;
-}
-
-static struct cpu cpu[NR_CPUS];
-
-static int __init topology_init(void)
-{
-       int cpu_id;
 
-       for_each_possible_cpu(cpu_id)
-               register_cpu(&cpu[cpu_id], cpu_id);
-
-       return 0;
+       paging_init();
 }
 
-subsys_initcall(topology_init);
-
 static const char *cpu_name[] = {
        [CPU_SH7206]    = "SH7206",     [CPU_SH7619]    = "SH7619",
-       [CPU_SH7604]    = "SH7604",     [CPU_SH7300]    = "SH7300",
+       [CPU_SH7300]    = "SH7300",
        [CPU_SH7705]    = "SH7705",     [CPU_SH7706]    = "SH7706",
        [CPU_SH7707]    = "SH7707",     [CPU_SH7708]    = "SH7708",
        [CPU_SH7709]    = "SH7709",     [CPU_SH7710]    = "SH7710",
@@ -419,7 +285,7 @@ static const char *cpu_name[] = {
        [CPU_SH7770]    = "SH7770",     [CPU_SH7780]    = "SH7780",
        [CPU_SH7781]    = "SH7781",     [CPU_SH7343]    = "SH7343",
        [CPU_SH7785]    = "SH7785",     [CPU_SH7722]    = "SH7722",
-       [CPU_SH_NONE]   = "Unknown"
+       [CPU_SHX3]      = "SH-X3",      [CPU_SH_NONE]   = "Unknown"
 };
 
 const char *get_cpu_subtype(struct sh_cpuinfo *c)
index c1cfcb9f047c1803f3e5564079bdba127f6509e4..c968dcf09eee0610e7aa524f0393c60ab0feb96e 100644 (file)
@@ -78,6 +78,16 @@ DECLARE_EXPORT(__movstr);
 DECLARE_EXPORT(__movmem_i4_even);
 DECLARE_EXPORT(__movmem_i4_odd);
 DECLARE_EXPORT(__movmemSI12_i4);
+
+#if (__GNUC_MINOR__ == 2 || defined(__GNUC_STM_RELEASE__))
+/*
+ * GCC 4.2 emits these for division, as do GCC 4.1.x versions of the ST
+ * compiler which include backported patches.
+ */
+DECLARE_EXPORT(__sdivsi3_i4i);
+DECLARE_EXPORT(__udiv_qrnnd_16);
+DECLARE_EXPORT(__udivsi3_i4i);
+#endif
 #else /* GCC 3.x */
 DECLARE_EXPORT(__movstr_i4_even);
 DECLARE_EXPORT(__movstr_i4_odd);
index e323e299878b7a101087ae1d08d84bf6295776f1..706d81ccd10149e15e28ffbfeed70e69a656e009 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/personality.h>
 #include <linux/binfmts.h>
 #include <linux/freezer.h>
+#include <linux/io.h>
 #include <asm/system.h>
 #include <asm/ucontext.h>
 #include <asm/uaccess.h>
@@ -261,7 +262,7 @@ asmlinkage int sys_rt_sigreturn(unsigned long r4, unsigned long r5,
                goto badframe;
        /* It is more difficult to avoid calling this function than to
           call it and ignore errors.  */
-       do_sigaltstack(&st, NULL, regs->regs[15]);
+       do_sigaltstack((const stack_t __user *)&st, NULL, (unsigned long)frame);
 
        return r0;
 
index 7db1c2dc5992a14896345fcc0dddab3e72647431..ff5656e60c05c3744c110ca9b770d40bb8efe0e1 100644 (file)
@@ -308,9 +308,9 @@ ENTRY(sys_call_table)
        .long sys_utimes
        .long sys_fadvise64_64_wrapper
        .long sys_ni_syscall    /* Reserved for vserver */
-       .long sys_ni_syscall    /* Reserved for mbind */
-       .long sys_ni_syscall    /* 275 - get_mempolicy */
-       .long sys_ni_syscall    /* set_mempolicy */
+       .long sys_mbind
+       .long sys_get_mempolicy         /* 275 */
+       .long sys_set_mempolicy
        .long sys_mq_open
        .long sys_mq_unlink
        .long sys_mq_timedsend
index 2d997e2a5b6cc6a0961810c8b02beb49df44efac..097ebd49f1bf0ef0964d847c14df3de3e92ae6bf 100644 (file)
@@ -30,7 +30,7 @@
 
 static int tmu_timer_start(void)
 {
-       ctrl_outb(ctrl_inb(TMU_TSTR) | 0x3, TMU_TSTR);
+       ctrl_outb(ctrl_inb(TMU_012_TSTR) | 0x3, TMU_012_TSTR);
        return 0;
 }
 
@@ -52,7 +52,7 @@ static void tmu0_timer_set_interval(unsigned long interval, unsigned int reload)
 
 static int tmu_timer_stop(void)
 {
-       ctrl_outb(ctrl_inb(TMU_TSTR) & ~0x3, TMU_TSTR);
+       ctrl_outb(ctrl_inb(TMU_012_TSTR) & ~0x3, TMU_012_TSTR);
        return 0;
 }
 
@@ -174,7 +174,8 @@ static int tmu_timer_init(void)
 
 #if !defined(CONFIG_CPU_SUBTYPE_SH7300) && \
     !defined(CONFIG_CPU_SUBTYPE_SH7760) && \
-    !defined(CONFIG_CPU_SUBTYPE_SH7785)
+    !defined(CONFIG_CPU_SUBTYPE_SH7785) && \
+    !defined(CONFIG_CPU_SUBTYPE_SHX3)
        ctrl_outb(TMU_TOCR_INIT, TMU_TOCR);
 #endif
 
diff --git a/arch/sh/kernel/topology.c b/arch/sh/kernel/topology.c
new file mode 100644 (file)
index 0000000..9b5844a
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * arch/sh/kernel/topology.c
+ *
+ *  Copyright (C) 2007  Paul Mundt
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#include <linux/cpu.h>
+#include <linux/cpumask.h>
+#include <linux/init.h>
+#include <linux/percpu.h>
+#include <linux/node.h>
+#include <linux/nodemask.h>
+
+static DEFINE_PER_CPU(struct cpu, cpu_devices);
+
+static int __init topology_init(void)
+{
+       int i, ret;
+
+#ifdef CONFIG_NEED_MULTIPLE_NODES
+       for_each_online_node(i)
+               register_one_node(i);
+#endif
+
+       for_each_present_cpu(i) {
+               ret = register_cpu(&per_cpu(cpu_devices, i), i);
+               if (unlikely(ret))
+                       printk(KERN_WARNING "%s: register_cpu %d failed (%d)\n",
+                              __FUNCTION__, i, ret);
+       }
+
+#if defined(CONFIG_NUMA) && !defined(CONFIG_SMP)
+       /*
+        * In the UP case, make sure the CPU association is still
+        * registered under each node. Without this, sysfs fails
+        * to make the connection between nodes other than node0
+        * and cpu0.
+        */
+       for_each_online_node(i)
+               if (i != numa_node_id())
+                       register_cpu_under_node(raw_smp_processor_id(), i);
+#endif
+
+       return 0;
+}
+subsys_initcall(topology_init);
index 8f18930d5bf879f7c455905df94cdf0afb833b95..05a40f3c30bf0c7848d02d77d77b4b8af5600ad1 100644 (file)
@@ -584,7 +584,7 @@ uspace_segv:
                info.si_signo = SIGBUS;
                info.si_errno = 0;
                info.si_code = si_code;
-               info.si_addr = (void *) address;
+               info.si_addr = (void __user *)address;
                force_sig_info(SIGBUS, &info, current);
        } else {
                if (regs->pc & 1)
@@ -617,7 +617,7 @@ uspace_segv:
  */
 int is_dsp_inst(struct pt_regs *regs)
 {
-       unsigned short inst;
+       unsigned short inst = 0;
 
        /*
         * Safe guard if DSP mode is already enabled or we're lacking
@@ -645,7 +645,6 @@ asmlinkage void do_divide_error(unsigned long r4, unsigned long r5,
                                unsigned long r6, unsigned long r7,
                                struct pt_regs __regs)
 {
-       struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
        siginfo_t info;
 
        switch (r4) {
@@ -874,7 +873,7 @@ void __init trap_init(void)
 void handle_BUG(struct pt_regs *regs)
 {
        enum bug_trap_type tt;
-       tt = report_bug(regs->pc);
+       tt = report_bug(regs->pc, regs);
        if (tt == BUG_TRAP_TYPE_WARN) {
                regs->pc += 2;
                return;
index 4c5b57e9c3c1c463a12b5c4ee13b90e48c1cbdf7..0696402f446a28d5236eab374632fec28ccff4bb 100644 (file)
@@ -97,18 +97,20 @@ SECTIONS
   __initramfs_end = .;
 #endif
 
+ . = ALIGN(4);
   __machvec_start = .;
-  .init.machvec : { *(.init.machvec) }
+  .machvec.init : { *(.machvec.init) }
   __machvec_end = .;
-  . = ALIGN(PAGE_SIZE);
-  __init_end = .;
-
-  . = ALIGN(4);
-  __bss_start = .;             /* BSS */
-  .bss : { *(.bss) }
 
-  . = ALIGN(4);
-  _end = . ;
+  . = ALIGN(PAGE_SIZE);
+  .bss : {
+       __init_end = .;
+       __bss_start = .;                /* BSS */
+       *(.bss.page_aligned)
+       *(.bss)
+       . = ALIGN(4);
+       _end = . ;
+  }
 
   /* When something in the kernel is NOT compiled as a module, the
    * module cleanup code and data are put into these segments.  Both
index c02473afd5814c9ca0a6da331b3d1db4623f4c14..4bef3b5d964a1aecdec64923883f1424227a7d54 100644 (file)
@@ -4,16 +4,15 @@
 
 #include <linux/types.h>
 
-extern u64 __xdiv64_32(u64 n, u32 d);
+extern uint64_t __xdiv64_32(u64 n, u32 d);
 
-u64 __div64_32(u64 *xp, u32 y)
+uint32_t __div64_32(u64 *xp, u32 y)
 {
-       u64 rem;
-       u64 q = __xdiv64_32(*xp, y);
+       uint32_t rem;
+       uint64_t q = __xdiv64_32(*xp, y);
 
        rem = *xp - q * y;
        *xp = q;
 
        return rem;
 }
-
index eefc275d64a76135d4f8295f658a6673b9f2a318..5ee7334ea64ff7ff4e68a32f24a5161c8f195a71 100644 (file)
@@ -1,12 +1,12 @@
 /*     
- * unsigned long long __xdiv64_32(unsigned long long n, unsigned long d); 
+ * unsigned long __xdiv64_32(unsigned long long n, unsigned long d); 
  */
 
 #include <linux/linkage.h>
 
 .text
 ENTRY(__xdiv64_32)
-#ifdef  __LITTLE_ENDIAN__
+#ifdef CONFIG_CPU_LITTLE_ENDIAN
        mov     r4, r0
        mov     r5, r1
 #else
@@ -34,7 +34,7 @@ ENTRY(__xdiv64_32)
        rotcl   r0
        div1    r6, r1
        .endr
-#ifdef  __LITTLE_ENDIAN__
+#ifdef CONFIG_CPU_LITTLE_ENDIAN
        mov     r2, r1
        rts
         rotcl  r0
index a38e1eed9e77ea0f66a62ae7cfa8db241b97a6ab..ac2d7abd25675b1eccc118cfa0b0698c072cb41e 100644 (file)
@@ -507,6 +507,7 @@ static int ieee_fpe_handler(struct pt_regs *regs)
        unsigned short insn = *(unsigned short *)regs->pc;
        unsigned short finsn;
        unsigned long nextpc;
+       siginfo_t info;
        int nib[4] = {
                (insn >> 12) & 0xf,
                (insn >> 8) & 0xf,
@@ -559,9 +560,11 @@ static int ieee_fpe_handler(struct pt_regs *regs)
                                ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK);
                        set_tsk_thread_flag(tsk, TIF_USEDFPU);
                } else {
-                       tsk->thread.trap_no = 11;
-                       tsk->thread.error_code = 0;
-                       force_sig(SIGFPE, tsk);
+                       info.si_signo = SIGFPE;
+                       info.si_errno = 0;
+                       info.si_code = FPE_FLTINV;
+                       info.si_addr = (void __user *)regs->pc;
+                       force_sig_info(SIGFPE, &info, tsk);
                }
 
                regs->pc = nextpc;
@@ -576,14 +579,17 @@ asmlinkage void do_fpu_error(unsigned long r4, unsigned long r5,
                             struct pt_regs regs)
 {
        struct task_struct *tsk = current;
+       siginfo_t info;
 
        if (ieee_fpe_handler (&regs))
                return;
 
        regs.pc += 2;
-       tsk->thread.trap_no = 11;
-       tsk->thread.error_code = 0;
-       force_sig(SIGFPE, tsk);
+       info.si_signo = SIGFPE;
+       info.si_errno = 0;
+       info.si_code = FPE_FLTINV;
+       info.si_addr = (void __user *)regs.pc;
+       force_sig_info(SIGFPE, &info, tsk);
 }
 
 /**
index 253346d7b316fc1bd3a934f6e37c8b038c18a303..28d79a474cde53efbede8072938df4902361c333 100644 (file)
@@ -1,5 +1,3 @@
-menu "Processor selection"
-
 #
 # Processor families
 #
@@ -38,27 +36,31 @@ config CPU_SUBTYPE_ST40
 config CPU_SHX2
        bool
 
+config CPU_SHX3
+       bool
+
+choice
+       prompt "Processor sub-type selection"
+
 #
 # Processor subtypes
 #
 
-comment "SH-2 Processor Support"
-
-config CPU_SUBTYPE_SH7604
-       bool "Support SH7604 processor"
-       select CPU_SH2
+# SH-2 Processor Support
 
 config CPU_SUBTYPE_SH7619
        bool "Support SH7619 processor"
        select CPU_SH2
+       select CPU_HAS_IPR_IRQ
 
-comment "SH-2A Processor Support"
+# SH-2A Processor Support
 
 config CPU_SUBTYPE_SH7206
        bool "Support SH7206 processor"
        select CPU_SH2A
+       select CPU_HAS_IPR_IRQ
 
-comment "SH-3 Processor Support"
+# SH-3 Processor Support
 
 config CPU_SUBTYPE_SH7300
        bool "Support SH7300 processor"
@@ -113,7 +115,7 @@ config CPU_SUBTYPE_SH7712
        help
          Select SH7712 if you have a SH3-DSP SH7712 CPU.
 
-comment "SH-4 Processor Support"
+# SH-4 Processor Support
 
 config CPU_SUBTYPE_SH7750
        bool "Support SH7750 processor"
@@ -125,7 +127,7 @@ config CPU_SUBTYPE_SH7750
 config CPU_SUBTYPE_SH7091
        bool "Support SH7091 processor"
        select CPU_SH4
-       select CPU_SUBTYPE_SH7750
+       select CPU_HAS_IPR_IRQ
        help
          Select SH7091 if you have an SH-4 based Sega device (such as
          the Dreamcast, Naomi, and Naomi 2).
@@ -133,13 +135,11 @@ config CPU_SUBTYPE_SH7091
 config CPU_SUBTYPE_SH7750R
        bool "Support SH7750R processor"
        select CPU_SH4
-       select CPU_SUBTYPE_SH7750
        select CPU_HAS_IPR_IRQ
 
 config CPU_SUBTYPE_SH7750S
        bool "Support SH7750S processor"
        select CPU_SH4
-       select CPU_SUBTYPE_SH7750
        select CPU_HAS_IPR_IRQ
 
 config CPU_SUBTYPE_SH7751
@@ -153,7 +153,6 @@ config CPU_SUBTYPE_SH7751
 config CPU_SUBTYPE_SH7751R
        bool "Support SH7751R processor"
        select CPU_SH4
-       select CPU_SUBTYPE_SH7751
        select CPU_HAS_IPR_IRQ
 
 config CPU_SUBTYPE_SH7760
@@ -166,7 +165,7 @@ config CPU_SUBTYPE_SH4_202
        bool "Support SH4-202 processor"
        select CPU_SH4
 
-comment "ST40 Processor Support"
+# ST40 Processor Support
 
 config CPU_SUBTYPE_ST40STB1
        bool "Support ST40STB1/ST40RA processors"
@@ -181,7 +180,7 @@ config CPU_SUBTYPE_ST40GX1
        help
          Select ST40GX1 if you have a ST40GX1 CPU.
 
-comment "SH-4A Processor Support"
+# SH-4A Processor Support
 
 config CPU_SUBTYPE_SH7770
        bool "Support SH7770 processor"
@@ -198,7 +197,13 @@ config CPU_SUBTYPE_SH7785
        select CPU_SHX2
        select CPU_HAS_INTC2_IRQ
 
-comment "SH4AL-DSP Processor Support"
+config CPU_SUBTYPE_SHX3
+       bool "Support SH-X3 processor"
+       select CPU_SH4A
+       select CPU_SHX3
+       select CPU_HAS_INTC2_IRQ
+
+# SH4AL-DSP Processor Support
 
 config CPU_SUBTYPE_SH73180
        bool "Support SH73180 processor"
@@ -213,8 +218,10 @@ config CPU_SUBTYPE_SH7722
        select CPU_SH4AL_DSP
        select CPU_SHX2
        select CPU_HAS_IPR_IRQ
+       select ARCH_SPARSEMEM_ENABLE
+       select SYS_SUPPORTS_NUMA
 
-endmenu
+endchoice
 
 menu "Memory management options"
 
@@ -266,7 +273,7 @@ config MEMORY_SIZE
 
 config 32BIT
        bool "Support 32-bit physical addressing through PMB"
-       depends on CPU_SH4A && MMU && (!X2TLB || BROKEN)
+       depends on MMU && (CPU_SUBTYPE_SH7780 || CPU_SUBTYPE_SH7785)
        default y
        help
          If you say Y here, physical addressing will be extended to
@@ -295,6 +302,17 @@ config VSYSCALL
          For systems with an MMU that can afford to give up a page,
          (the default value) say Y.
 
+config NUMA
+       bool "Non Uniform Memory Access (NUMA) Support"
+       depends on MMU && SYS_SUPPORTS_NUMA && EXPERIMENTAL
+       default n
+       help
+         Some SH systems have many various memories scattered around
+         the address space, each with varying latencies. This enables
+         support for these blocks by binding them to nodes and allowing
+         memory policies to be used for prioritizing and controlling
+         allocation behaviour.
+
 config NODES_SHIFT
        int
        default "1"
@@ -302,14 +320,34 @@ config NODES_SHIFT
 
 config ARCH_FLATMEM_ENABLE
        def_bool y
+       depends on !NUMA
+
+config ARCH_SPARSEMEM_ENABLE
+       def_bool y
+       select SPARSEMEM_STATIC
+
+config ARCH_SPARSEMEM_DEFAULT
+       def_bool y
 
 config MAX_ACTIVE_REGIONS
        int
+       default "2" if (CPU_SUBTYPE_SH7722 && SPARSEMEM)
        default "1"
 
 config ARCH_POPULATES_NODE_MAP
        def_bool y
 
+config ARCH_SELECT_MEMORY_MODEL
+       def_bool y
+
+config ARCH_ENABLE_MEMORY_HOTPLUG
+       def_bool y
+       depends on SPARSEMEM
+
+config ARCH_MEMORY_PROBE
+       def_bool y
+       depends on MEMORY_HOTPLUG
+
 choice
        prompt "Kernel page size"
        default PAGE_SIZE_4KB
@@ -394,15 +432,4 @@ config SH_WRITETHROUGH
 
          If unsure, say N.
 
-config SH_OCRAM
-       bool "Operand Cache RAM (OCRAM) support"
-       help
-         Selecting this option will automatically tear down the number of
-         sets in the dcache by half, which in turn exposes a memory range.
-
-         The addresses for the OC RAM base will vary according to the
-         processor version. Consult vendor documentation for specifics.
-
-         If unsure, say N.
-
 endmenu
index 3ffd7f68c0a206befbcc7ca3f1a940a73027dfb2..d677d7f3afc1d03e892eb2959f9130a71706a07c 100644 (file)
@@ -8,9 +8,6 @@ obj-$(CONFIG_CPU_SH2)   += cache-sh2.o
 obj-$(CONFIG_CPU_SH3)  += cache-sh3.o
 obj-$(CONFIG_CPU_SH4)  += cache-sh4.o
 
-obj-$(CONFIG_DMA_PAGE_OPS)     += pg-dma.o
-obj-$(CONFIG_HUGETLB_PAGE)     += hugetlbpage.o
-
 mmu-y                  := fault-nommu.o tlb-nommu.o pg-nommu.o
 mmu-$(CONFIG_MMU)      := fault.o clear_page.o copy_page.o tlb-flush.o \
                           ioremap.o
@@ -27,5 +24,7 @@ obj-$(CONFIG_CPU_SH4)         += tlb-sh4.o pg-sh4.o
 obj-$(CONFIG_SH7705_CACHE_32KB) += pg-sh7705.o
 endif
 
+obj-$(CONFIG_HUGETLB_PAGE)     += hugetlbpage.o
 obj-$(CONFIG_SH7705_CACHE_32KB)        += cache-sh7705.o
 obj-$(CONFIG_32BIT)            += pmb.o
+obj-$(CONFIG_NUMA)             += numa.o
index c878faa4ae4689d701cd42ffbdf897a087aba259..0b3eaf6fbb28a1bfe20f376342b9c6e940286273 100644 (file)
@@ -32,7 +32,6 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,
        struct task_struct *tsk;
        struct mm_struct *mm;
        struct vm_area_struct * vma;
-       unsigned long page;
        int si_code;
        siginfo_t info;
 
@@ -170,24 +169,38 @@ no_context:
  * terminate things with extreme prejudice.
  *
  */
-       if (address < PAGE_SIZE)
-               printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference");
-       else
-               printk(KERN_ALERT "Unable to handle kernel paging request");
-       printk(" at virtual address %08lx\n", address);
-       printk(KERN_ALERT "pc = %08lx\n", regs->pc);
-       page = (unsigned long)get_TTB();
-       if (page) {
-               page = ((unsigned long *) page)[address >> PGDIR_SHIFT];
-               printk(KERN_ALERT "*pde = %08lx\n", page);
-               if (page & _PAGE_PRESENT) {
-                       page &= PAGE_MASK;
-                       address &= 0x003ff000;
-                       page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT];
-                       printk(KERN_ALERT "*pte = %08lx\n", page);
+
+       bust_spinlocks(1);
+
+       if (oops_may_print()) {
+               __typeof__(pte_val(__pte(0))) page;
+
+               if (address < PAGE_SIZE)
+                       printk(KERN_ALERT "Unable to handle kernel NULL "
+                                         "pointer dereference");
+               else
+                       printk(KERN_ALERT "Unable to handle kernel paging "
+                                         "request");
+               printk(" at virtual address %08lx\n", address);
+               printk(KERN_ALERT "pc = %08lx\n", regs->pc);
+               page = (unsigned long)get_TTB();
+               if (page) {
+                       page = ((__typeof__(page) *) __va(page))[address >>
+                                                                PGDIR_SHIFT];
+                       printk(KERN_ALERT "*pde = %08lx\n", page);
+                       if (page & _PAGE_PRESENT) {
+                               page &= PAGE_MASK;
+                               address &= 0x003ff000;
+                               page = ((__typeof__(page) *)
+                                               __va(page))[address >>
+                                                           PAGE_SHIFT];
+                               printk(KERN_ALERT "*pte = %08lx\n", page);
+                       }
                }
        }
+
        die("Oops", regs, writeaccess);
+       bust_spinlocks(0);
        do_exit(SIGKILL);
 
 /*
index e0e644ff3204c38a114a03e16842ba87a36cdff9..82b68c789a5f28c30e430fe9913654a341360b1c 100644 (file)
@@ -18,6 +18,7 @@
 #include <asm/mmu_context.h>
 #include <asm/tlb.h>
 #include <asm/cacheflush.h>
+#include <asm/sections.h>
 #include <asm/cache.h>
 
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
@@ -36,14 +37,11 @@ void show_mem(void)
        show_free_areas();
 
        for_each_online_pgdat(pgdat) {
-               struct page *page, *end;
-               unsigned long flags;
+               unsigned long flags, i;
 
                pgdat_resize_lock(pgdat, &flags);
-               page = pgdat->node_mem_map;
-               end = page + pgdat->node_spanned_pages;
-
-               do {
+               for (i = 0; i < pgdat->node_spanned_pages; i++) {
+                       struct page *page = pgdat_page_nr(pgdat, i);
                        total++;
                        if (PageReserved(page))
                                reserved++;
@@ -55,9 +53,7 @@ void show_mem(void)
                                free++;
                        else
                                shared += page_count(page) - 1;
-                       page++;
-               } while (page < end);
-
+               }
                pgdat_resize_unlock(pgdat, &flags);
        }
 
@@ -137,16 +133,12 @@ void __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot)
 }
 #endif /* CONFIG_MMU */
 
-/* References to section boundaries */
-
-extern char _text, _etext, _edata, __bss_start, _end;
-extern char __init_begin, __init_end;
-
 /*
  * paging_init() sets up the page tables
  */
 void __init paging_init(void)
 {
+       unsigned long max_zone_pfns[MAX_NR_ZONES];
        int nid;
 
        /* We don't need to map the kernel through the TLB, as
@@ -158,43 +150,39 @@ void __init paging_init(void)
         * check for a null value. */
        set_TTB(swapper_pg_dir);
 
+       memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
+
        for_each_online_node(nid) {
                pg_data_t *pgdat = NODE_DATA(nid);
-               unsigned long max_zone_pfns[MAX_NR_ZONES];
                unsigned long low, start_pfn;
 
-               memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
-
                start_pfn = pgdat->bdata->node_boot_start >> PAGE_SHIFT;
                low = pgdat->bdata->node_low_pfn;
 
-               max_zone_pfns[ZONE_NORMAL] = low;
-               add_active_range(nid, start_pfn, low);
+               if (max_zone_pfns[ZONE_NORMAL] < low)
+                       max_zone_pfns[ZONE_NORMAL] = low;
 
                printk("Node %u: start_pfn = 0x%lx, low = 0x%lx\n",
                       nid, start_pfn, low);
-
-               free_area_init_nodes(max_zone_pfns);
-
-               printk("Node %u: mem_map starts at %p\n",
-                      pgdat->node_id, pgdat->node_mem_map);
        }
+
+       free_area_init_nodes(max_zone_pfns);
 }
 
 static struct kcore_list kcore_mem, kcore_vmalloc;
 
 void __init mem_init(void)
 {
-       int codesize, reservedpages, datasize, initsize;
+       int codesize, datasize, initsize;
        int nid;
 
-       reservedpages = 0;
+       num_physpages = 0;
+       high_memory = NULL;
 
        for_each_online_node(nid) {
                pg_data_t *pgdat = NODE_DATA(nid);
                unsigned long node_pages = 0;
                void *node_high_memory;
-               int i;
 
                num_physpages += pgdat->node_present_pages;
 
@@ -203,13 +191,9 @@ void __init mem_init(void)
 
                totalram_pages += node_pages;
 
-               for (i = 0; i < node_pages; i++)
-                       if (PageReserved(pgdat->node_mem_map + i))
-                               reservedpages++;
-
-               node_high_memory = (void *)((pgdat->node_start_pfn +
-                                            pgdat->node_spanned_pages) <<
-                                               PAGE_SHIFT);
+               node_high_memory = (void *)__va((pgdat->node_start_pfn +
+                                                pgdat->node_spanned_pages) <<
+                                                PAGE_SHIFT);
                if (node_high_memory > high_memory)
                        high_memory = node_high_memory;
        }
@@ -239,11 +223,10 @@ void __init mem_init(void)
                   VMALLOC_END - VMALLOC_START);
 
        printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, "
-              "%dk reserved, %dk data, %dk init)\n",
+              "%dk data, %dk init)\n",
                (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
-               totalram_pages << (PAGE_SHIFT-10),
+               num_physpages << (PAGE_SHIFT-10),
                codesize >> 10,
-               reservedpages << (PAGE_SHIFT-10),
                datasize >> 10,
                initsize >> 10);
 
@@ -264,7 +247,9 @@ void free_initmem(void)
                free_page(addr);
                totalram_pages++;
        }
-       printk ("Freeing unused kernel memory: %dk freed\n", (&__init_end - &__init_begin) >> 10);
+       printk("Freeing unused kernel memory: %ldk freed\n",
+              ((unsigned long)&__init_end -
+               (unsigned long)&__init_begin) >> 10);
 }
 
 #ifdef CONFIG_BLK_DEV_INITRD
@@ -277,6 +262,50 @@ void free_initrd_mem(unsigned long start, unsigned long end)
                free_page(p);
                totalram_pages++;
        }
-       printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
+       printk("Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
+}
+#endif
+
+#ifdef CONFIG_MEMORY_HOTPLUG
+void online_page(struct page *page)
+{
+       ClearPageReserved(page);
+       init_page_count(page);
+       __free_page(page);
+       totalram_pages++;
+       num_physpages++;
 }
+
+int arch_add_memory(int nid, u64 start, u64 size)
+{
+       pg_data_t *pgdat;
+       unsigned long start_pfn = start >> PAGE_SHIFT;
+       unsigned long nr_pages = size >> PAGE_SHIFT;
+       int ret;
+
+       pgdat = NODE_DATA(nid);
+
+       /* We only have ZONE_NORMAL, so this is easy.. */
+       ret = __add_pages(pgdat->node_zones + ZONE_NORMAL, start_pfn, nr_pages);
+       if (unlikely(ret))
+               printk("%s: Failed, __add_pages() == %d\n", __FUNCTION__, ret);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(arch_add_memory);
+
+int remove_memory(u64 start, u64 size)
+{
+       return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(remove_memory);
+
+#ifdef CONFIG_NUMA
+int memory_add_physaddr_to_nid(u64 addr)
+{
+       /* Node 0 for now.. */
+       return 0;
+}
+EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid);
+#endif
 #endif
diff --git a/arch/sh/mm/numa.c b/arch/sh/mm/numa.c
new file mode 100644 (file)
index 0000000..8aff065
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * arch/sh/mm/numa.c - Multiple node support for SH machines
+ *
+ *  Copyright (C) 2007  Paul Mundt
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#include <linux/module.h>
+#include <linux/bootmem.h>
+#include <linux/mm.h>
+#include <linux/numa.h>
+#include <linux/pfn.h>
+#include <asm/sections.h>
+
+static bootmem_data_t plat_node_bdata[MAX_NUMNODES];
+struct pglist_data *node_data[MAX_NUMNODES] __read_mostly;
+EXPORT_SYMBOL_GPL(node_data);
+
+/*
+ * On SH machines the conventional approach is to stash system RAM
+ * in node 0, and other memory blocks in to node 1 and up, ordered by
+ * latency. Each node's pgdat is node-local at the beginning of the node,
+ * immediately followed by the node mem map.
+ */
+void __init setup_memory(void)
+{
+       unsigned long free_pfn = PFN_UP(__pa(_end));
+
+       /*
+        * Node 0 sets up its pgdat at the first available pfn,
+        * and bumps it up before setting up the bootmem allocator.
+        */
+       NODE_DATA(0) = pfn_to_kaddr(free_pfn);
+       memset(NODE_DATA(0), 0, sizeof(struct pglist_data));
+       free_pfn += PFN_UP(sizeof(struct pglist_data));
+       NODE_DATA(0)->bdata = &plat_node_bdata[0];
+
+       /* Set up node 0 */
+       setup_bootmem_allocator(free_pfn);
+
+       /* Give the platforms a chance to hook up their nodes */
+       plat_mem_setup();
+}
+
+void __init setup_bootmem_node(int nid, unsigned long start, unsigned long end)
+{
+       unsigned long bootmap_pages, bootmap_start, bootmap_size;
+       unsigned long start_pfn, free_pfn, end_pfn;
+
+       /* Don't allow bogus node assignment */
+       BUG_ON(nid > MAX_NUMNODES || nid == 0);
+
+       /*
+        * The free pfn starts at the beginning of the range, and is
+        * advanced as necessary for pgdat and node map allocations.
+        */
+       free_pfn = start_pfn = start >> PAGE_SHIFT;
+       end_pfn = end >> PAGE_SHIFT;
+
+       add_active_range(nid, start_pfn, end_pfn);
+
+       /* Node-local pgdat */
+       NODE_DATA(nid) = pfn_to_kaddr(free_pfn);
+       free_pfn += PFN_UP(sizeof(struct pglist_data));
+       memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
+
+       NODE_DATA(nid)->bdata = &plat_node_bdata[nid];
+       NODE_DATA(nid)->node_start_pfn = start_pfn;
+       NODE_DATA(nid)->node_spanned_pages = end_pfn - start_pfn;
+
+       /* Node-local bootmap */
+       bootmap_pages = bootmem_bootmap_pages(end_pfn - start_pfn);
+       bootmap_start = (unsigned long)pfn_to_kaddr(free_pfn);
+       bootmap_size = init_bootmem_node(NODE_DATA(nid), free_pfn, start_pfn,
+                                   end_pfn);
+
+       free_bootmem_with_active_regions(nid, end_pfn);
+
+       /* Reserve the pgdat and bootmap space with the bootmem allocator */
+       reserve_bootmem_node(NODE_DATA(nid), start_pfn << PAGE_SHIFT,
+                            sizeof(struct pglist_data));
+       reserve_bootmem_node(NODE_DATA(nid), free_pfn << PAGE_SHIFT,
+                            bootmap_pages << PAGE_SHIFT);
+
+       /* It's up */
+       node_set_online(nid);
+
+       /* Kick sparsemem */
+       sparse_memory_present_with_active_regions(nid);
+}
diff --git a/arch/sh/mm/pg-dma.c b/arch/sh/mm/pg-dma.c
deleted file mode 100644 (file)
index bb23679..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * arch/sh/mm/pg-dma.c
- *
- * Fast clear_page()/copy_page() implementation using the SH DMAC
- *
- * Copyright (C) 2003  Paul Mundt
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- */
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <asm/semaphore.h>
-#include <asm/mmu_context.h>
-#include <asm/addrspace.h>
-#include <asm/atomic.h>
-#include <asm/page.h>
-#include <asm/dma.h>
-#include <asm/io.h>
-
-/* Channel to use for page ops, must be dual-address mode capable. */
-static int dma_channel = CONFIG_DMA_PAGE_OPS_CHANNEL;
-
-static void copy_page_dma(void *to, void *from)
-{
-       /* 
-        * This doesn't seem to get triggered until further along in the
-        * boot process, at which point the DMAC is already initialized.
-        * Fix this in the same fashion as clear_page_dma() in the event
-        * that this crashes due to the DMAC not being initialized.
-        */
-
-       flush_icache_range((unsigned long)from, PAGE_SIZE);
-       dma_write_page(dma_channel, (unsigned long)from, (unsigned long)to);
-       dma_wait_for_completion(dma_channel);
-}
-
-static void clear_page_dma(void *to)
-{
-       /*
-        * We get invoked quite early on, if the DMAC hasn't been initialized
-        * yet, fall back on the slow manual implementation.
-        */
-       if (dma_info[dma_channel].chan != dma_channel) {
-               clear_page_slow(to);
-               return;
-       }
-
-       dma_write_page(dma_channel, (unsigned long)empty_zero_page,
-                                   (unsigned long)to);
-
-       /*
-        * FIXME: Something is a bit racy here, if we poll the counter right
-        * away, we seem to lock. flushing the page from the dcache doesn't
-        * seem to make a difference one way or the other, though either a full
-        * icache or dcache flush does.
-        *
-        * The location of this is important as well, and must happen prior to
-        * the completion loop but after the transfer was initiated.
-        *
-        * Oddly enough, this doesn't appear to be an issue for copy_page()..
-        */
-       flush_icache_range((unsigned long)to, PAGE_SIZE);
-
-       dma_wait_for_completion(dma_channel);
-}
-
-static int __init pg_dma_init(void)
-{
-       int ret;
-       
-       ret = request_dma(dma_channel, "page ops");
-       if (ret != 0)
-               return ret;
-
-       copy_page = copy_page_dma;
-       clear_page = clear_page_dma;
-
-       return ret;
-}
-
-static void __exit pg_dma_exit(void)
-{
-       free_dma(dma_channel);
-}
-
-module_init(pg_dma_init);
-module_exit(pg_dma_exit);
-
-MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>");
-MODULE_DESCRIPTION("Optimized page copy/clear routines using a dual-address mode capable DMAC channel");
-MODULE_LICENSE("GPL");
-
index 3c370a1132913b68371ce02142e8b2355b34bb4a..567516b58acca40ff99ada5fd9bd1bd100b91496 100644 (file)
@@ -12,4 +12,5 @@
 
 include/asm-sh/machtypes.h: $(src)/gen-mach-types $(src)/mach-types
        @echo '  Generating $@'
+       $(Q)if [ ! -d include/asm-sh ]; then mkdir -p include/asm-sh; fi
        $(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; }
index fb40f188aff93e6c81af6b8ea4c32882e8b13102..4b5e9305092eaf32494c5ecaf477c64ce35782dd 100644 (file)
@@ -18,7 +18,6 @@ SE                    SH_SOLUTION_ENGINE
 HP6XX                  SH_HP6XX
 HD64461                        HD64461
 HD64465                        HD64465
-SATURN                 SH_SATURN
 DREAMCAST              SH_DREAMCAST
 MPC1211                        SH_MPC1211
 SNAPGEAR               SH_SECUREEDGE5410
@@ -34,3 +33,4 @@ R7785RP                       SH_R7785RP
 TITAN                  SH_TITAN
 SHMIN                  SH_SHMIN
 7710VOIPGW             SH_7710VOIPGW
+LBOXRE2                        SH_LBOX_RE2
index e5eaa8072ae03277df2f0c1961fbb5700ff71135..ca26232da7abc96de39cf3b5c437ab7614d7e54d 100644 (file)
@@ -160,9 +160,6 @@ static inline int srmmu_pte_none(pte_t pte)
 static inline int srmmu_pte_present(pte_t pte)
 { return ((pte_val(pte) & SRMMU_ET_MASK) == SRMMU_ET_PTE); }
 
-static inline int srmmu_pte_read(pte_t pte)
-{ return !(pte_val(pte) & SRMMU_NOREAD); }
-
 static inline void srmmu_pte_clear(pte_t *ptep)
 { srmmu_set_pte(ptep, __pte(0)); }
 
@@ -2181,7 +2178,6 @@ void __init ld_mmu_srmmu(void)
 
        BTFIXUPSET_CALL(pte_present, srmmu_pte_present, BTFIXUPCALL_NORM);
        BTFIXUPSET_CALL(pte_clear, srmmu_pte_clear, BTFIXUPCALL_SWAPO0G0);
-       BTFIXUPSET_CALL(pte_read, srmmu_pte_read, BTFIXUPCALL_NORM);
 
        BTFIXUPSET_CALL(pmd_bad, srmmu_pmd_bad, BTFIXUPCALL_NORM);
        BTFIXUPSET_CALL(pmd_present, srmmu_pmd_present, BTFIXUPCALL_NORM);
index 436021ceb2e7bd369490eda32eec58b4460ae815..bdd835fba02e8c3f02b58acfbf6f98c7c98aa57a 100644 (file)
@@ -1748,11 +1748,6 @@ static int sun4c_pte_present(pte_t pte)
 }
 static void sun4c_pte_clear(pte_t *ptep)       { *ptep = __pte(0); }
 
-static int sun4c_pte_read(pte_t pte)
-{
-       return (pte_val(pte) & _SUN4C_PAGE_READ);
-}
-
 static int sun4c_pmd_bad(pmd_t pmd)
 {
        return (((pmd_val(pmd) & ~PAGE_MASK) != PGD_TABLE) ||
@@ -2212,7 +2207,6 @@ void __init ld_mmu_sun4c(void)
 
        BTFIXUPSET_CALL(pte_present, sun4c_pte_present, BTFIXUPCALL_NORM);
        BTFIXUPSET_CALL(pte_clear, sun4c_pte_clear, BTFIXUPCALL_STG0O0);
-       BTFIXUPSET_CALL(pte_read, sun4c_pte_read, BTFIXUPCALL_NORM);
 
        BTFIXUPSET_CALL(pmd_bad, sun4c_pmd_bad, BTFIXUPCALL_NORM);
        BTFIXUPSET_CALL(pmd_present, sun4c_pmd_present, BTFIXUPCALL_NORM);
index 6566d13db04fec3c5417cde60c0295319f405c9f..b84b6af1241ef55ae943db3fa7c0828164a12132 100644 (file)
@@ -108,6 +108,15 @@ config SECCOMP
 
 source kernel/Kconfig.hz
 
+config HOTPLUG_CPU
+       bool "Support for hot-pluggable CPUs"
+       depends on SMP
+       select HOTPLUG
+       ---help---
+         Say Y here to experiment with turning CPUs off and on.  CPUs
+         can be controlled through /sys/devices/system/cpu/cpu#.
+         Say N if you want to disable CPU hotplug.
+
 source "init/Kconfig"
 
 config SYSVIPC_COMPAT
@@ -305,6 +314,12 @@ config SUN_IO
        bool
        default y
 
+config SUN_LDOMS
+       bool "Sun Logical Domains support"
+       help
+         Say Y here is you want to support virtual devices via
+         Logical Domains.
+
 config PCI
        bool "PCI support"
        select ARCH_SUPPORTS_MSI
index f964bf28d21a2568fed3a436af906c3e78d238ea..b66876bf410c489391f20251daa4401843465f9e 100644 (file)
@@ -18,7 +18,7 @@ obj-$(CONFIG_STACKTRACE) += stacktrace.o
 obj-$(CONFIG_PCI)       += ebus.o isa.o pci_common.o pci_iommu.o \
                            pci_psycho.o pci_sabre.o pci_schizo.o \
                            pci_sun4v.o pci_sun4v_asm.o pci_fire.o
-obj-$(CONFIG_SMP)       += smp.o trampoline.o
+obj-$(CONFIG_SMP)       += smp.o trampoline.o hvtramp.o
 obj-$(CONFIG_SPARC32_COMPAT) += sys32.o sys_sparc32.o signal32.o
 obj-$(CONFIG_BINFMT_ELF32) += binfmt_elf32.o
 obj-$(CONFIG_BINFMT_AOUT32) += binfmt_aout32.o
@@ -26,6 +26,7 @@ obj-$(CONFIG_MODULES) += module.o
 obj-$(CONFIG_US3_FREQ) += us3_cpufreq.o
 obj-$(CONFIG_US2E_FREQ) += us2e_cpufreq.o
 obj-$(CONFIG_KPROBES) += kprobes.o
+obj-$(CONFIG_SUN_LDOMS) += ldc.o vio.o viohs.o ds.o
 obj-$(CONFIG_AUDIT) += audit.o
 obj-$(CONFIG_AUDIT)$(CONFIG_SPARC32_COMPAT) += compat_audit.o
 obj-y += $(obj-yy)
diff --git a/arch/sparc64/kernel/ds.c b/arch/sparc64/kernel/ds.c
new file mode 100644 (file)
index 0000000..1c58710
--- /dev/null
@@ -0,0 +1,1158 @@
+/* ds.c: Domain Services driver for Logical Domains
+ *
+ * Copyright (C) 2007 David S. Miller <davem@davemloft.net>
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/module.h>
+#include <linux/string.h>
+#include <linux/slab.h>
+#include <linux/sched.h>
+#include <linux/delay.h>
+#include <linux/mutex.h>
+#include <linux/kthread.h>
+#include <linux/cpu.h>
+
+#include <asm/ldc.h>
+#include <asm/vio.h>
+#include <asm/power.h>
+#include <asm/mdesc.h>
+#include <asm/head.h>
+#include <asm/irq.h>
+
+#define DRV_MODULE_NAME                "ds"
+#define PFX DRV_MODULE_NAME    ": "
+#define DRV_MODULE_VERSION     "1.0"
+#define DRV_MODULE_RELDATE     "Jul 11, 2007"
+
+static char version[] __devinitdata =
+       DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
+MODULE_AUTHOR("David S. Miller (davem@davemloft.net)");
+MODULE_DESCRIPTION("Sun LDOM domain services driver");
+MODULE_LICENSE("GPL");
+MODULE_VERSION(DRV_MODULE_VERSION);
+
+struct ds_msg_tag {
+       __u32                   type;
+#define DS_INIT_REQ            0x00
+#define DS_INIT_ACK            0x01
+#define DS_INIT_NACK           0x02
+#define DS_REG_REQ             0x03
+#define DS_REG_ACK             0x04
+#define DS_REG_NACK            0x05
+#define DS_UNREG_REQ           0x06
+#define DS_UNREG_ACK           0x07
+#define DS_UNREG_NACK          0x08
+#define DS_DATA                        0x09
+#define DS_NACK                        0x0a
+
+       __u32                   len;
+};
+
+/* Result codes */
+#define DS_OK                  0x00
+#define DS_REG_VER_NACK                0x01
+#define DS_REG_DUP             0x02
+#define DS_INV_HDL             0x03
+#define DS_TYPE_UNKNOWN                0x04
+
+struct ds_version {
+       __u16                   major;
+       __u16                   minor;
+};
+
+struct ds_ver_req {
+       struct ds_msg_tag       tag;
+       struct ds_version       ver;
+};
+
+struct ds_ver_ack {
+       struct ds_msg_tag       tag;
+       __u16                   minor;
+};
+
+struct ds_ver_nack {
+       struct ds_msg_tag       tag;
+       __u16                   major;
+};
+
+struct ds_reg_req {
+       struct ds_msg_tag       tag;
+       __u64                   handle;
+       __u16                   major;
+       __u16                   minor;
+       char                    svc_id[0];
+};
+
+struct ds_reg_ack {
+       struct ds_msg_tag       tag;
+       __u64                   handle;
+       __u16                   minor;
+};
+
+struct ds_reg_nack {
+       struct ds_msg_tag       tag;
+       __u64                   handle;
+       __u16                   major;
+};
+
+struct ds_unreg_req {
+       struct ds_msg_tag       tag;
+       __u64                   handle;
+};
+
+struct ds_unreg_ack {
+       struct ds_msg_tag       tag;
+       __u64                   handle;
+};
+
+struct ds_unreg_nack {
+       struct ds_msg_tag       tag;
+       __u64                   handle;
+};
+
+struct ds_data {
+       struct ds_msg_tag       tag;
+       __u64                   handle;
+};
+
+struct ds_data_nack {
+       struct ds_msg_tag       tag;
+       __u64                   handle;
+       __u64                   result;
+};
+
+struct ds_cap_state {
+       __u64                   handle;
+
+       void                    (*data)(struct ldc_channel *lp,
+                                       struct ds_cap_state *cp,
+                                       void *buf, int len);
+
+       const char              *service_id;
+
+       u8                      state;
+#define CAP_STATE_UNKNOWN      0x00
+#define CAP_STATE_REG_SENT     0x01
+#define CAP_STATE_REGISTERED   0x02
+};
+
+static void md_update_data(struct ldc_channel *lp, struct ds_cap_state *cp,
+                          void *buf, int len);
+static void domain_shutdown_data(struct ldc_channel *lp,
+                                struct ds_cap_state *cp,
+                                void *buf, int len);
+static void domain_panic_data(struct ldc_channel *lp,
+                             struct ds_cap_state *cp,
+                             void *buf, int len);
+#ifdef CONFIG_HOTPLUG_CPU
+static void dr_cpu_data(struct ldc_channel *lp,
+                       struct ds_cap_state *cp,
+                       void *buf, int len);
+#endif
+static void ds_pri_data(struct ldc_channel *lp,
+                       struct ds_cap_state *cp,
+                       void *buf, int len);
+static void ds_var_data(struct ldc_channel *lp,
+                       struct ds_cap_state *cp,
+                       void *buf, int len);
+
+struct ds_cap_state ds_states[] = {
+       {
+               .service_id     = "md-update",
+               .data           = md_update_data,
+       },
+       {
+               .service_id     = "domain-shutdown",
+               .data           = domain_shutdown_data,
+       },
+       {
+               .service_id     = "domain-panic",
+               .data           = domain_panic_data,
+       },
+#ifdef CONFIG_HOTPLUG_CPU
+       {
+               .service_id     = "dr-cpu",
+               .data           = dr_cpu_data,
+       },
+#endif
+       {
+               .service_id     = "pri",
+               .data           = ds_pri_data,
+       },
+       {
+               .service_id     = "var-config",
+               .data           = ds_var_data,
+       },
+       {
+               .service_id     = "var-config-backup",
+               .data           = ds_var_data,
+       },
+};
+
+static DEFINE_SPINLOCK(ds_lock);
+
+struct ds_info {
+       struct ldc_channel      *lp;
+       u8                      hs_state;
+#define DS_HS_START            0x01
+#define DS_HS_DONE             0x02
+
+       void                    *rcv_buf;
+       int                     rcv_buf_len;
+};
+
+static struct ds_info *ds_info;
+
+static struct ds_cap_state *find_cap(u64 handle)
+{
+       unsigned int index = handle >> 32;
+
+       if (index >= ARRAY_SIZE(ds_states))
+               return NULL;
+       return &ds_states[index];
+}
+
+static struct ds_cap_state *find_cap_by_string(const char *name)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(ds_states); i++) {
+               if (strcmp(ds_states[i].service_id, name))
+                       continue;
+
+               return &ds_states[i];
+       }
+       return NULL;
+}
+
+static int ds_send(struct ldc_channel *lp, void *data, int len)
+{
+       int err, limit = 1000;
+
+       err = -EINVAL;
+       while (limit-- > 0) {
+               err = ldc_write(lp, data, len);
+               if (!err || (err != -EAGAIN))
+                       break;
+               udelay(1);
+       }
+
+       return err;
+}
+
+struct ds_md_update_req {
+       __u64                           req_num;
+};
+
+struct ds_md_update_res {
+       __u64                           req_num;
+       __u32                           result;
+};
+
+static void md_update_data(struct ldc_channel *lp,
+                          struct ds_cap_state *dp,
+                          void *buf, int len)
+{
+       struct ds_data *dpkt = buf;
+       struct ds_md_update_req *rp;
+       struct {
+               struct ds_data          data;
+               struct ds_md_update_res res;
+       } pkt;
+
+       rp = (struct ds_md_update_req *) (dpkt + 1);
+
+       printk(KERN_INFO PFX "Machine description update.\n");
+
+       memset(&pkt, 0, sizeof(pkt));
+       pkt.data.tag.type = DS_DATA;
+       pkt.data.tag.len = sizeof(pkt) - sizeof(struct ds_msg_tag);
+       pkt.data.handle = dp->handle;
+       pkt.res.req_num = rp->req_num;
+       pkt.res.result = DS_OK;
+
+       ds_send(lp, &pkt, sizeof(pkt));
+
+       mdesc_update();
+}
+
+struct ds_shutdown_req {
+       __u64                           req_num;
+       __u32                           ms_delay;
+};
+
+struct ds_shutdown_res {
+       __u64                           req_num;
+       __u32                           result;
+       char                            reason[1];
+};
+
+static void domain_shutdown_data(struct ldc_channel *lp,
+                                struct ds_cap_state *dp,
+                                void *buf, int len)
+{
+       struct ds_data *dpkt = buf;
+       struct ds_shutdown_req *rp;
+       struct {
+               struct ds_data          data;
+               struct ds_shutdown_res  res;
+       } pkt;
+
+       rp = (struct ds_shutdown_req *) (dpkt + 1);
+
+       printk(KERN_ALERT PFX "Shutdown request from "
+              "LDOM manager received.\n");
+
+       memset(&pkt, 0, sizeof(pkt));
+       pkt.data.tag.type = DS_DATA;
+       pkt.data.tag.len = sizeof(pkt) - sizeof(struct ds_msg_tag);
+       pkt.data.handle = dp->handle;
+       pkt.res.req_num = rp->req_num;
+       pkt.res.result = DS_OK;
+       pkt.res.reason[0] = 0;
+
+       ds_send(lp, &pkt, sizeof(pkt));
+
+       wake_up_powerd();
+}
+
+struct ds_panic_req {
+       __u64                           req_num;
+};
+
+struct ds_panic_res {
+       __u64                           req_num;
+       __u32                           result;
+       char                            reason[1];
+};
+
+static void domain_panic_data(struct ldc_channel *lp,
+                             struct ds_cap_state *dp,
+                             void *buf, int len)
+{
+       struct ds_data *dpkt = buf;
+       struct ds_panic_req *rp;
+       struct {
+               struct ds_data          data;
+               struct ds_panic_res     res;
+       } pkt;
+
+       rp = (struct ds_panic_req *) (dpkt + 1);
+
+       printk(KERN_ALERT PFX "Panic request from "
+              "LDOM manager received.\n");
+
+       memset(&pkt, 0, sizeof(pkt));
+       pkt.data.tag.type = DS_DATA;
+       pkt.data.tag.len = sizeof(pkt) - sizeof(struct ds_msg_tag);
+       pkt.data.handle = dp->handle;
+       pkt.res.req_num = rp->req_num;
+       pkt.res.result = DS_OK;
+       pkt.res.reason[0] = 0;
+
+       ds_send(lp, &pkt, sizeof(pkt));
+
+       panic("PANIC requested by LDOM manager.");
+}
+
+#ifdef CONFIG_HOTPLUG_CPU
+struct dr_cpu_tag {
+       __u64                           req_num;
+       __u32                           type;
+#define DR_CPU_CONFIGURE               0x43
+#define DR_CPU_UNCONFIGURE             0x55
+#define DR_CPU_FORCE_UNCONFIGURE       0x46
+#define DR_CPU_STATUS                  0x53
+
+/* Responses */
+#define DR_CPU_OK                      0x6f
+#define DR_CPU_ERROR                   0x65
+
+       __u32                           num_records;
+};
+
+struct dr_cpu_resp_entry {
+       __u32                           cpu;
+       __u32                           result;
+#define DR_CPU_RES_OK                  0x00
+#define DR_CPU_RES_FAILURE             0x01
+#define DR_CPU_RES_BLOCKED             0x02
+#define DR_CPU_RES_CPU_NOT_RESPONDING  0x03
+#define DR_CPU_RES_NOT_IN_MD           0x04
+
+       __u32                           stat;
+#define DR_CPU_STAT_NOT_PRESENT                0x00
+#define DR_CPU_STAT_UNCONFIGURED       0x01
+#define DR_CPU_STAT_CONFIGURED         0x02
+
+       __u32                           str_off;
+};
+
+/* DR cpu requests get queued onto the work list by the
+ * dr_cpu_data() callback.  The list is protected by
+ * ds_lock, and processed by dr_cpu_process() in order.
+ */
+static LIST_HEAD(dr_cpu_work_list);
+static DECLARE_WAIT_QUEUE_HEAD(dr_cpu_wait);
+
+struct dr_cpu_queue_entry {
+       struct list_head                list;
+       char                            req[0];
+};
+
+static void __dr_cpu_send_error(struct ds_cap_state *cp, struct ds_data *data)
+{
+       struct dr_cpu_tag *tag = (struct dr_cpu_tag *) (data + 1);
+       struct ds_info *dp = ds_info;
+       struct {
+               struct ds_data          data;
+               struct dr_cpu_tag       tag;
+       } pkt;
+       int msg_len;
+
+       memset(&pkt, 0, sizeof(pkt));
+       pkt.data.tag.type = DS_DATA;
+       pkt.data.handle = cp->handle;
+       pkt.tag.req_num = tag->req_num;
+       pkt.tag.type = DR_CPU_ERROR;
+       pkt.tag.num_records = 0;
+
+       msg_len = (sizeof(struct ds_data) +
+                  sizeof(struct dr_cpu_tag));
+
+       pkt.data.tag.len = msg_len - sizeof(struct ds_msg_tag);
+
+       ds_send(dp->lp, &pkt, msg_len);
+}
+
+static void dr_cpu_send_error(struct ds_cap_state *cp, struct ds_data *data)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&ds_lock, flags);
+       __dr_cpu_send_error(cp, data);
+       spin_unlock_irqrestore(&ds_lock, flags);
+}
+
+#define CPU_SENTINEL   0xffffffff
+
+static void purge_dups(u32 *list, u32 num_ents)
+{
+       unsigned int i;
+
+       for (i = 0; i < num_ents; i++) {
+               u32 cpu = list[i];
+               unsigned int j;
+
+               if (cpu == CPU_SENTINEL)
+                       continue;
+
+               for (j = i + 1; j < num_ents; j++) {
+                       if (list[j] == cpu)
+                               list[j] = CPU_SENTINEL;
+               }
+       }
+}
+
+static int dr_cpu_size_response(int ncpus)
+{
+       return (sizeof(struct ds_data) +
+               sizeof(struct dr_cpu_tag) +
+               (sizeof(struct dr_cpu_resp_entry) * ncpus));
+}
+
+static void dr_cpu_init_response(struct ds_data *resp, u64 req_num,
+                                u64 handle, int resp_len, int ncpus,
+                                cpumask_t *mask, u32 default_stat)
+{
+       struct dr_cpu_resp_entry *ent;
+       struct dr_cpu_tag *tag;
+       int i, cpu;
+
+       tag = (struct dr_cpu_tag *) (resp + 1);
+       ent = (struct dr_cpu_resp_entry *) (tag + 1);
+
+       resp->tag.type = DS_DATA;
+       resp->tag.len = resp_len - sizeof(struct ds_msg_tag);
+       resp->handle = handle;
+       tag->req_num = req_num;
+       tag->type = DR_CPU_OK;
+       tag->num_records = ncpus;
+
+       i = 0;
+       for_each_cpu_mask(cpu, *mask) {
+               ent[i].cpu = cpu;
+               ent[i].result = DR_CPU_RES_OK;
+               ent[i].stat = default_stat;
+               i++;
+       }
+       BUG_ON(i != ncpus);
+}
+
+static void dr_cpu_mark(struct ds_data *resp, int cpu, int ncpus,
+                       u32 res, u32 stat)
+{
+       struct dr_cpu_resp_entry *ent;
+       struct dr_cpu_tag *tag;
+       int i;
+
+       tag = (struct dr_cpu_tag *) (resp + 1);
+       ent = (struct dr_cpu_resp_entry *) (tag + 1);
+
+       for (i = 0; i < ncpus; i++) {
+               if (ent[i].cpu != cpu)
+                       continue;
+               ent[i].result = res;
+               ent[i].stat = stat;
+               break;
+       }
+}
+
+static int dr_cpu_configure(struct ds_cap_state *cp, u64 req_num,
+                           cpumask_t *mask)
+{
+       struct ds_data *resp;
+       int resp_len, ncpus, cpu;
+       unsigned long flags;
+
+       ncpus = cpus_weight(*mask);
+       resp_len = dr_cpu_size_response(ncpus);
+       resp = kzalloc(resp_len, GFP_KERNEL);
+       if (!resp)
+               return -ENOMEM;
+
+       dr_cpu_init_response(resp, req_num, cp->handle,
+                            resp_len, ncpus, mask,
+                            DR_CPU_STAT_CONFIGURED);
+
+       mdesc_fill_in_cpu_data(*mask);
+
+       for_each_cpu_mask(cpu, *mask) {
+               int err;
+
+               printk(KERN_INFO PFX "Starting cpu %d...\n", cpu);
+               err = cpu_up(cpu);
+               if (err) {
+                       __u32 res = DR_CPU_RES_FAILURE;
+                       __u32 stat = DR_CPU_STAT_UNCONFIGURED;
+
+                       if (!cpu_present(cpu)) {
+                               /* CPU not present in MD */
+                               res = DR_CPU_RES_NOT_IN_MD;
+                               stat = DR_CPU_STAT_NOT_PRESENT;
+                       } else if (err == -ENODEV) {
+                               /* CPU did not call in successfully */
+                               res = DR_CPU_RES_CPU_NOT_RESPONDING;
+                       }
+
+                       printk(KERN_INFO PFX "CPU startup failed err=%d\n",
+                              err);
+                       dr_cpu_mark(resp, cpu, ncpus, res, stat);
+               }
+       }
+
+       spin_lock_irqsave(&ds_lock, flags);
+       ds_send(ds_info->lp, resp, resp_len);
+       spin_unlock_irqrestore(&ds_lock, flags);
+
+       kfree(resp);
+
+       /* Redistribute IRQs, taking into account the new cpus.  */
+       fixup_irqs();
+
+       return 0;
+}
+
+static int dr_cpu_unconfigure(struct ds_cap_state *cp, u64 req_num,
+                             cpumask_t *mask)
+{
+       struct ds_data *resp;
+       int resp_len, ncpus, cpu;
+       unsigned long flags;
+
+       ncpus = cpus_weight(*mask);
+       resp_len = dr_cpu_size_response(ncpus);
+       resp = kzalloc(resp_len, GFP_KERNEL);
+       if (!resp)
+               return -ENOMEM;
+
+       dr_cpu_init_response(resp, req_num, cp->handle,
+                            resp_len, ncpus, mask,
+                            DR_CPU_STAT_UNCONFIGURED);
+
+       for_each_cpu_mask(cpu, *mask) {
+               int err;
+
+               printk(KERN_INFO PFX "CPU[%d]: Shutting down cpu %d...\n",
+                      smp_processor_id(), cpu);
+               err = cpu_down(cpu);
+               if (err)
+                       dr_cpu_mark(resp, cpu, ncpus,
+                                   DR_CPU_RES_FAILURE,
+                                   DR_CPU_STAT_CONFIGURED);
+       }
+
+       spin_lock_irqsave(&ds_lock, flags);
+       ds_send(ds_info->lp, resp, resp_len);
+       spin_unlock_irqrestore(&ds_lock, flags);
+
+       kfree(resp);
+
+       return 0;
+}
+
+static void process_dr_cpu_list(struct ds_cap_state *cp)
+{
+       struct dr_cpu_queue_entry *qp, *tmp;
+       unsigned long flags;
+       LIST_HEAD(todo);
+       cpumask_t mask;
+
+       spin_lock_irqsave(&ds_lock, flags);
+       list_splice(&dr_cpu_work_list, &todo);
+       INIT_LIST_HEAD(&dr_cpu_work_list);
+       spin_unlock_irqrestore(&ds_lock, flags);
+
+       list_for_each_entry_safe(qp, tmp, &todo, list) {
+               struct ds_data *data = (struct ds_data *) qp->req;
+               struct dr_cpu_tag *tag = (struct dr_cpu_tag *) (data + 1);
+               u32 *cpu_list = (u32 *) (tag + 1);
+               u64 req_num = tag->req_num;
+               unsigned int i;
+               int err;
+
+               switch (tag->type) {
+               case DR_CPU_CONFIGURE:
+               case DR_CPU_UNCONFIGURE:
+               case DR_CPU_FORCE_UNCONFIGURE:
+                       break;
+
+               default:
+                       dr_cpu_send_error(cp, data);
+                       goto next;
+               }
+
+               purge_dups(cpu_list, tag->num_records);
+
+               cpus_clear(mask);
+               for (i = 0; i < tag->num_records; i++) {
+                       if (cpu_list[i] == CPU_SENTINEL)
+                               continue;
+
+                       if (cpu_list[i] < NR_CPUS)
+                               cpu_set(cpu_list[i], mask);
+               }
+
+               if (tag->type == DR_CPU_CONFIGURE)
+                       err = dr_cpu_configure(cp, req_num, &mask);
+               else
+                       err = dr_cpu_unconfigure(cp, req_num, &mask);
+
+               if (err)
+                       dr_cpu_send_error(cp, data);
+
+next:
+               list_del(&qp->list);
+               kfree(qp);
+       }
+}
+
+static int dr_cpu_thread(void *__unused)
+{
+       struct ds_cap_state *cp;
+       DEFINE_WAIT(wait);
+
+       cp = find_cap_by_string("dr-cpu");
+
+       while (1) {
+               prepare_to_wait(&dr_cpu_wait, &wait, TASK_INTERRUPTIBLE);
+               if (list_empty(&dr_cpu_work_list))
+                       schedule();
+               finish_wait(&dr_cpu_wait, &wait);
+
+               if (kthread_should_stop())
+                       break;
+
+               process_dr_cpu_list(cp);
+       }
+
+       return 0;
+}
+
+static void dr_cpu_data(struct ldc_channel *lp,
+                       struct ds_cap_state *dp,
+                       void *buf, int len)
+{
+       struct dr_cpu_queue_entry *qp;
+       struct ds_data *dpkt = buf;
+       struct dr_cpu_tag *rp;
+
+       rp = (struct dr_cpu_tag *) (dpkt + 1);
+
+       qp = kmalloc(sizeof(struct dr_cpu_queue_entry) + len, GFP_ATOMIC);
+       if (!qp) {
+               struct ds_cap_state *cp;
+
+               cp = find_cap_by_string("dr-cpu");
+               __dr_cpu_send_error(cp, dpkt);
+       } else {
+               memcpy(&qp->req, buf, len);
+               list_add_tail(&qp->list, &dr_cpu_work_list);
+               wake_up(&dr_cpu_wait);
+       }
+}
+#endif
+
+struct ds_pri_msg {
+       __u64                           req_num;
+       __u64                           type;
+#define DS_PRI_REQUEST                 0x00
+#define DS_PRI_DATA                    0x01
+#define DS_PRI_UPDATE                  0x02
+};
+
+static void ds_pri_data(struct ldc_channel *lp,
+                       struct ds_cap_state *dp,
+                       void *buf, int len)
+{
+       struct ds_data *dpkt = buf;
+       struct ds_pri_msg *rp;
+
+       rp = (struct ds_pri_msg *) (dpkt + 1);
+
+       printk(KERN_INFO PFX "PRI REQ [%lx:%lx], len=%d\n",
+              rp->req_num, rp->type, len);
+}
+
+struct ds_var_hdr {
+       __u32                           type;
+#define DS_VAR_SET_REQ                 0x00
+#define DS_VAR_DELETE_REQ              0x01
+#define DS_VAR_SET_RESP                        0x02
+#define DS_VAR_DELETE_RESP             0x03
+};
+
+struct ds_var_set_msg {
+       struct ds_var_hdr               hdr;
+       char                            name_and_value[0];
+};
+
+struct ds_var_delete_msg {
+       struct ds_var_hdr               hdr;
+       char                            name[0];
+};
+
+struct ds_var_resp {
+       struct ds_var_hdr               hdr;
+       __u32                           result;
+#define DS_VAR_SUCCESS                 0x00
+#define DS_VAR_NO_SPACE                        0x01
+#define DS_VAR_INVALID_VAR             0x02
+#define DS_VAR_INVALID_VAL             0x03
+#define DS_VAR_NOT_PRESENT             0x04
+};
+
+static DEFINE_MUTEX(ds_var_mutex);
+static int ds_var_doorbell;
+static int ds_var_response;
+
+static void ds_var_data(struct ldc_channel *lp,
+                       struct ds_cap_state *dp,
+                       void *buf, int len)
+{
+       struct ds_data *dpkt = buf;
+       struct ds_var_resp *rp;
+
+       rp = (struct ds_var_resp *) (dpkt + 1);
+
+       if (rp->hdr.type != DS_VAR_SET_RESP &&
+           rp->hdr.type != DS_VAR_DELETE_RESP)
+               return;
+
+       ds_var_response = rp->result;
+       wmb();
+       ds_var_doorbell = 1;
+}
+
+void ldom_set_var(const char *var, const char *value)
+{
+       struct ds_info *dp = ds_info;
+       struct ds_cap_state *cp;
+
+       cp = find_cap_by_string("var-config");
+       if (cp->state != CAP_STATE_REGISTERED)
+               cp = find_cap_by_string("var-config-backup");
+
+       if (cp->state == CAP_STATE_REGISTERED) {
+               union {
+                       struct {
+                               struct ds_data          data;
+                               struct ds_var_set_msg   msg;
+                       } header;
+                       char                    all[512];
+               } pkt;
+               unsigned long flags;
+               char  *base, *p;
+               int msg_len, loops;
+
+               memset(&pkt, 0, sizeof(pkt));
+               pkt.header.data.tag.type = DS_DATA;
+               pkt.header.data.handle = cp->handle;
+               pkt.header.msg.hdr.type = DS_VAR_SET_REQ;
+               base = p = &pkt.header.msg.name_and_value[0];
+               strcpy(p, var);
+               p += strlen(var) + 1;
+               strcpy(p, value);
+               p += strlen(value) + 1;
+
+               msg_len = (sizeof(struct ds_data) +
+                          sizeof(struct ds_var_set_msg) +
+                          (p - base));
+               msg_len = (msg_len + 3) & ~3;
+               pkt.header.data.tag.len = msg_len - sizeof(struct ds_msg_tag);
+
+               mutex_lock(&ds_var_mutex);
+
+               spin_lock_irqsave(&ds_lock, flags);
+               ds_var_doorbell = 0;
+               ds_var_response = -1;
+
+               ds_send(dp->lp, &pkt, msg_len);
+               spin_unlock_irqrestore(&ds_lock, flags);
+
+               loops = 1000;
+               while (ds_var_doorbell == 0) {
+                       if (loops-- < 0)
+                               break;
+                       barrier();
+                       udelay(100);
+               }
+
+               mutex_unlock(&ds_var_mutex);
+
+               if (ds_var_doorbell == 0 ||
+                   ds_var_response != DS_VAR_SUCCESS)
+                       printk(KERN_ERR PFX "var-config [%s:%s] "
+                              "failed, response(%d).\n",
+                              var, value,
+                              ds_var_response);
+       } else {
+               printk(KERN_ERR PFX "var-config not registered so "
+                      "could not set (%s) variable to (%s).\n",
+                      var, value);
+       }
+}
+
+void ldom_reboot(const char *boot_command)
+{
+       /* Don't bother with any of this if the boot_command
+        * is empty.
+        */
+       if (boot_command && strlen(boot_command)) {
+               char full_boot_str[256];
+
+               strcpy(full_boot_str, "boot ");
+               strcpy(full_boot_str + strlen("boot "), boot_command);
+
+               ldom_set_var("reboot-command", full_boot_str);
+       }
+       sun4v_mach_sir();
+}
+
+void ldom_power_off(void)
+{
+       sun4v_mach_exit(0);
+}
+
+static void ds_conn_reset(struct ds_info *dp)
+{
+       printk(KERN_ERR PFX "ds_conn_reset() from %p\n",
+              __builtin_return_address(0));
+}
+
+static int register_services(struct ds_info *dp)
+{
+       struct ldc_channel *lp = dp->lp;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(ds_states); i++) {
+               struct {
+                       struct ds_reg_req req;
+                       u8 id_buf[256];
+               } pbuf;
+               struct ds_cap_state *cp = &ds_states[i];
+               int err, msg_len;
+               u64 new_count;
+
+               if (cp->state == CAP_STATE_REGISTERED)
+                       continue;
+
+               new_count = sched_clock() & 0xffffffff;
+               cp->handle = ((u64) i << 32) | new_count;
+
+               msg_len = (sizeof(struct ds_reg_req) +
+                          strlen(cp->service_id));
+
+               memset(&pbuf, 0, sizeof(pbuf));
+               pbuf.req.tag.type = DS_REG_REQ;
+               pbuf.req.tag.len = (msg_len - sizeof(struct ds_msg_tag));
+               pbuf.req.handle = cp->handle;
+               pbuf.req.major = 1;
+               pbuf.req.minor = 0;
+               strcpy(pbuf.req.svc_id, cp->service_id);
+
+               err = ds_send(lp, &pbuf, msg_len);
+               if (err > 0)
+                       cp->state = CAP_STATE_REG_SENT;
+       }
+       return 0;
+}
+
+static int ds_handshake(struct ds_info *dp, struct ds_msg_tag *pkt)
+{
+
+       if (dp->hs_state == DS_HS_START) {
+               if (pkt->type != DS_INIT_ACK)
+                       goto conn_reset;
+
+               dp->hs_state = DS_HS_DONE;
+
+               return register_services(dp);
+       }
+
+       if (dp->hs_state != DS_HS_DONE)
+               goto conn_reset;
+
+       if (pkt->type == DS_REG_ACK) {
+               struct ds_reg_ack *ap = (struct ds_reg_ack *) pkt;
+               struct ds_cap_state *cp = find_cap(ap->handle);
+
+               if (!cp) {
+                       printk(KERN_ERR PFX "REG ACK for unknown handle %lx\n",
+                              ap->handle);
+                       return 0;
+               }
+               printk(KERN_INFO PFX "Registered %s service.\n",
+                      cp->service_id);
+               cp->state = CAP_STATE_REGISTERED;
+       } else if (pkt->type == DS_REG_NACK) {
+               struct ds_reg_nack *np = (struct ds_reg_nack *) pkt;
+               struct ds_cap_state *cp = find_cap(np->handle);
+
+               if (!cp) {
+                       printk(KERN_ERR PFX "REG NACK for "
+                              "unknown handle %lx\n",
+                              np->handle);
+                       return 0;
+               }
+               printk(KERN_INFO PFX "Could not register %s service\n",
+                      cp->service_id);
+               cp->state = CAP_STATE_UNKNOWN;
+       }
+
+       return 0;
+
+conn_reset:
+       ds_conn_reset(dp);
+       return -ECONNRESET;
+}
+
+static int ds_data(struct ds_info *dp, struct ds_msg_tag *pkt, int len)
+{
+       struct ds_data *dpkt = (struct ds_data *) pkt;
+       struct ds_cap_state *cp = find_cap(dpkt->handle);
+
+       if (!cp) {
+               struct ds_data_nack nack = {
+                       .tag = {
+                               .type = DS_NACK,
+                               .len = (sizeof(struct ds_data_nack) -
+                                       sizeof(struct ds_msg_tag)),
+                       },
+                       .handle = dpkt->handle,
+                       .result = DS_INV_HDL,
+               };
+
+               printk(KERN_ERR PFX "Data for unknown handle %lu\n",
+                      dpkt->handle);
+               ds_send(dp->lp, &nack, sizeof(nack));
+       } else {
+               cp->data(dp->lp, cp, dpkt, len);
+       }
+       return 0;
+}
+
+static void ds_up(struct ds_info *dp)
+{
+       struct ldc_channel *lp = dp->lp;
+       struct ds_ver_req req;
+       int err;
+
+       req.tag.type = DS_INIT_REQ;
+       req.tag.len = sizeof(req) - sizeof(struct ds_msg_tag);
+       req.ver.major = 1;
+       req.ver.minor = 0;
+
+       err = ds_send(lp, &req, sizeof(req));
+       if (err > 0)
+               dp->hs_state = DS_HS_START;
+}
+
+static void ds_event(void *arg, int event)
+{
+       struct ds_info *dp = arg;
+       struct ldc_channel *lp = dp->lp;
+       unsigned long flags;
+       int err;
+
+       spin_lock_irqsave(&ds_lock, flags);
+
+       if (event == LDC_EVENT_UP) {
+               ds_up(dp);
+               spin_unlock_irqrestore(&ds_lock, flags);
+               return;
+       }
+
+       if (event != LDC_EVENT_DATA_READY) {
+               printk(KERN_WARNING PFX "Unexpected LDC event %d\n", event);
+               spin_unlock_irqrestore(&ds_lock, flags);
+               return;
+       }
+
+       err = 0;
+       while (1) {
+               struct ds_msg_tag *tag;
+
+               err = ldc_read(lp, dp->rcv_buf, sizeof(*tag));
+
+               if (unlikely(err < 0)) {
+                       if (err == -ECONNRESET)
+                               ds_conn_reset(dp);
+                       break;
+               }
+               if (err == 0)
+                       break;
+
+               tag = dp->rcv_buf;
+               err = ldc_read(lp, tag + 1, tag->len);
+
+               if (unlikely(err < 0)) {
+                       if (err == -ECONNRESET)
+                               ds_conn_reset(dp);
+                       break;
+               }
+               if (err < tag->len)
+                       break;
+
+               if (tag->type < DS_DATA)
+                       err = ds_handshake(dp, dp->rcv_buf);
+               else
+                       err = ds_data(dp, dp->rcv_buf,
+                                     sizeof(*tag) + err);
+               if (err == -ECONNRESET)
+                       break;
+       }
+
+       spin_unlock_irqrestore(&ds_lock, flags);
+}
+
+static int __devinit ds_probe(struct vio_dev *vdev,
+                             const struct vio_device_id *id)
+{
+       static int ds_version_printed;
+       struct ldc_channel_config ds_cfg = {
+               .event          = ds_event,
+               .mtu            = 4096,
+               .mode           = LDC_MODE_STREAM,
+       };
+       struct ldc_channel *lp;
+       struct ds_info *dp;
+       int err;
+
+       if (ds_version_printed++ == 0)
+               printk(KERN_INFO "%s", version);
+
+       dp = kzalloc(sizeof(*dp), GFP_KERNEL);
+       err = -ENOMEM;
+       if (!dp)
+               goto out_err;
+
+       dp->rcv_buf = kzalloc(4096, GFP_KERNEL);
+       if (!dp->rcv_buf)
+               goto out_free_dp;
+
+       dp->rcv_buf_len = 4096;
+
+       ds_cfg.tx_irq = vdev->tx_irq;
+       ds_cfg.rx_irq = vdev->rx_irq;
+
+       lp = ldc_alloc(vdev->channel_id, &ds_cfg, dp);
+       if (IS_ERR(lp)) {
+               err = PTR_ERR(lp);
+               goto out_free_rcv_buf;
+       }
+       dp->lp = lp;
+
+       err = ldc_bind(lp, "DS");
+       if (err)
+               goto out_free_ldc;
+
+       ds_info = dp;
+
+       start_powerd();
+
+       return err;
+
+out_free_ldc:
+       ldc_free(dp->lp);
+
+out_free_rcv_buf:
+       kfree(dp->rcv_buf);
+
+out_free_dp:
+       kfree(dp);
+
+out_err:
+       return err;
+}
+
+static int ds_remove(struct vio_dev *vdev)
+{
+       return 0;
+}
+
+static struct vio_device_id ds_match[] = {
+       {
+               .type = "domain-services-port",
+       },
+       {},
+};
+
+static struct vio_driver ds_driver = {
+       .id_table       = ds_match,
+       .probe          = ds_probe,
+       .remove         = ds_remove,
+       .driver         = {
+               .name   = "ds",
+               .owner  = THIS_MODULE,
+       }
+};
+
+static int __init ds_init(void)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(ds_states); i++)
+               ds_states[i].handle = ((u64)i << 32);
+
+#ifdef CONFIG_HOTPLUG_CPU
+       kthread_run(dr_cpu_thread, NULL, "kdrcpud");
+#endif
+
+       return vio_register_driver(&ds_driver);
+}
+
+subsys_initcall(ds_init);
diff --git a/arch/sparc64/kernel/hvtramp.S b/arch/sparc64/kernel/hvtramp.S
new file mode 100644 (file)
index 0000000..76a090e
--- /dev/null
@@ -0,0 +1,139 @@
+/* hvtramp.S: Hypervisor start-cpu trampoline code.
+ *
+ * Copyright (C) 2007 David S. Miller <davem@davemloft.net>
+ */
+
+#include <asm/thread_info.h>
+#include <asm/hypervisor.h>
+#include <asm/scratchpad.h>
+#include <asm/spitfire.h>
+#include <asm/hvtramp.h>
+#include <asm/pstate.h>
+#include <asm/ptrace.h>
+#include <asm/asi.h>
+
+       .text
+       .align          8
+       .globl          hv_cpu_startup, hv_cpu_startup_end
+
+       /* This code executes directly out of the hypervisor
+        * with physical addressing (va==pa).  %o0 contains
+        * our client argument which for Linux points to
+        * a descriptor data structure which defines the
+        * MMU entries we need to load up.
+        *
+        * After we set things up we enable the MMU and call
+        * into the kernel.
+        *
+        * First setup basic privileged cpu state.
+        */
+hv_cpu_startup:
+       wrpr            %g0, 0, %gl
+       wrpr            %g0, 15, %pil
+       wrpr            %g0, 0, %canrestore
+       wrpr            %g0, 0, %otherwin
+       wrpr            %g0, 6, %cansave
+       wrpr            %g0, 6, %cleanwin
+       wrpr            %g0, 0, %cwp
+       wrpr            %g0, 0, %wstate
+       wrpr            %g0, 0, %tl
+
+       sethi           %hi(sparc64_ttable_tl0), %g1
+       wrpr            %g1, %tba
+
+       mov             %o0, %l0
+
+       lduw            [%l0 + HVTRAMP_DESCR_CPU], %g1
+       mov             SCRATCHPAD_CPUID, %g2
+       stxa            %g1, [%g2] ASI_SCRATCHPAD
+
+       ldx             [%l0 + HVTRAMP_DESCR_FAULT_INFO_VA], %g2
+       stxa            %g2, [%g0] ASI_SCRATCHPAD
+
+       mov             0, %l1
+       lduw            [%l0 + HVTRAMP_DESCR_NUM_MAPPINGS], %l2
+       add             %l0, HVTRAMP_DESCR_MAPS, %l3
+
+1:     ldx             [%l3 + HVTRAMP_MAPPING_VADDR], %o0
+       clr             %o1
+       ldx             [%l3 + HVTRAMP_MAPPING_TTE], %o2
+       mov             HV_MMU_IMMU | HV_MMU_DMMU, %o3
+       mov             HV_FAST_MMU_MAP_PERM_ADDR, %o5
+       ta              HV_FAST_TRAP
+
+       brnz,pn         %o0, 80f
+        nop
+
+       add             %l1, 1, %l1
+       cmp             %l1, %l2
+       blt,a,pt        %xcc, 1b
+        add            %l3, HVTRAMP_MAPPING_SIZE, %l3
+
+       ldx             [%l0 + HVTRAMP_DESCR_FAULT_INFO_PA], %o0
+       mov             HV_FAST_MMU_FAULT_AREA_CONF, %o5
+       ta              HV_FAST_TRAP
+
+       brnz,pn         %o0, 80f
+        nop
+
+       wrpr            %g0, (PSTATE_PRIV | PSTATE_PEF), %pstate
+
+       ldx             [%l0 + HVTRAMP_DESCR_THREAD_REG], %l6
+
+       mov             1, %o0
+       set             1f, %o1
+       mov             HV_FAST_MMU_ENABLE, %o5
+       ta              HV_FAST_TRAP
+
+       ba,pt           %xcc, 80f
+        nop
+
+1:
+       wr              %g0, 0, %fprs
+       wr              %g0, ASI_P, %asi
+
+       mov             PRIMARY_CONTEXT, %g7
+       stxa            %g0, [%g7] ASI_MMU
+       membar          #Sync
+
+       mov             SECONDARY_CONTEXT, %g7
+       stxa            %g0, [%g7] ASI_MMU
+       membar          #Sync
+
+       mov             %l6, %g6
+       ldx             [%g6 + TI_TASK], %g4
+
+       mov             1, %g5
+       sllx            %g5, THREAD_SHIFT, %g5
+       sub             %g5, (STACKFRAME_SZ + STACK_BIAS), %g5
+       add             %g6, %g5, %sp
+       mov             0, %fp
+
+       call            init_irqwork_curcpu
+        nop
+       call            hard_smp_processor_id
+        nop
+
+       mov             %o0, %o1
+       mov             0, %o0
+       mov             0, %o2
+       call            sun4v_init_mondo_queues
+        mov            1, %o3
+
+       call            init_cur_cpu_trap
+        mov            %g6, %o0
+
+       wrpr            %g0, (PSTATE_PRIV | PSTATE_PEF | PSTATE_IE), %pstate
+
+       call            smp_callin
+        nop
+       call            cpu_idle
+        mov            0, %o0
+       call            cpu_panic
+        nop
+
+80:    ba,pt           %xcc, 80b
+        nop
+
+       .align          8
+hv_cpu_startup_end:
index 6b6165d36fd8aae7789faef3e7cf9e64019cb464..8cb3358674f5257fcaff2ee83448592b1732e3dd 100644 (file)
@@ -293,6 +293,11 @@ static void sun4u_irq_enable(unsigned int virt_irq)
        }
 }
 
+static void sun4u_set_affinity(unsigned int virt_irq, cpumask_t mask)
+{
+       sun4u_irq_enable(virt_irq);
+}
+
 static void sun4u_irq_disable(unsigned int virt_irq)
 {
        struct irq_handler_data *data = get_irq_chip_data(virt_irq);
@@ -309,6 +314,10 @@ static void sun4u_irq_disable(unsigned int virt_irq)
 static void sun4u_irq_end(unsigned int virt_irq)
 {
        struct irq_handler_data *data = get_irq_chip_data(virt_irq);
+       struct irq_desc *desc = irq_desc + virt_irq;
+
+       if (unlikely(desc->status & (IRQ_DISABLED|IRQ_INPROGRESS)))
+               return;
 
        if (likely(data))
                upa_writeq(ICLR_IDLE, data->iclr);
@@ -340,6 +349,24 @@ static void sun4v_irq_enable(unsigned int virt_irq)
        }
 }
 
+static void sun4v_set_affinity(unsigned int virt_irq, cpumask_t mask)
+{
+       struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
+       unsigned int ino = bucket - &ivector_table[0];
+
+       if (likely(bucket)) {
+               unsigned long cpuid;
+               int err;
+
+               cpuid = irq_choose_cpu(virt_irq);
+
+               err = sun4v_intr_settarget(ino, cpuid);
+               if (err != HV_EOK)
+                       printk("sun4v_intr_settarget(%x,%lu): err(%d)\n",
+                              ino, cpuid, err);
+       }
+}
+
 static void sun4v_irq_disable(unsigned int virt_irq)
 {
        struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
@@ -373,6 +400,10 @@ static void sun4v_irq_end(unsigned int virt_irq)
 {
        struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
        unsigned int ino = bucket - &ivector_table[0];
+       struct irq_desc *desc = irq_desc + virt_irq;
+
+       if (unlikely(desc->status & (IRQ_DISABLED|IRQ_INPROGRESS)))
+               return;
 
        if (likely(bucket)) {
                int err;
@@ -418,6 +449,28 @@ static void sun4v_virq_enable(unsigned int virt_irq)
        }
 }
 
+static void sun4v_virt_set_affinity(unsigned int virt_irq, cpumask_t mask)
+{
+       struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
+       unsigned int ino = bucket - &ivector_table[0];
+
+       if (likely(bucket)) {
+               unsigned long cpuid, dev_handle, dev_ino;
+               int err;
+
+               cpuid = irq_choose_cpu(virt_irq);
+
+               dev_handle = ino & IMAP_IGN;
+               dev_ino = ino & IMAP_INO;
+
+               err = sun4v_vintr_set_target(dev_handle, dev_ino, cpuid);
+               if (err != HV_EOK)
+                       printk("sun4v_vintr_set_target(%lx,%lx,%lu): "
+                              "err(%d)\n",
+                              dev_handle, dev_ino, cpuid, err);
+       }
+}
+
 static void sun4v_virq_disable(unsigned int virt_irq)
 {
        struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
@@ -443,6 +496,10 @@ static void sun4v_virq_end(unsigned int virt_irq)
 {
        struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
        unsigned int ino = bucket - &ivector_table[0];
+       struct irq_desc *desc = irq_desc + virt_irq;
+
+       if (unlikely(desc->status & (IRQ_DISABLED|IRQ_INPROGRESS)))
+               return;
 
        if (likely(bucket)) {
                unsigned long dev_handle, dev_ino;
@@ -477,6 +534,7 @@ static struct irq_chip sun4u_irq = {
        .enable         = sun4u_irq_enable,
        .disable        = sun4u_irq_disable,
        .end            = sun4u_irq_end,
+       .set_affinity   = sun4u_set_affinity,
 };
 
 static struct irq_chip sun4u_irq_ack = {
@@ -485,6 +543,7 @@ static struct irq_chip sun4u_irq_ack = {
        .disable        = sun4u_irq_disable,
        .ack            = run_pre_handler,
        .end            = sun4u_irq_end,
+       .set_affinity   = sun4u_set_affinity,
 };
 
 static struct irq_chip sun4v_irq = {
@@ -492,6 +551,7 @@ static struct irq_chip sun4v_irq = {
        .enable         = sun4v_irq_enable,
        .disable        = sun4v_irq_disable,
        .end            = sun4v_irq_end,
+       .set_affinity   = sun4v_set_affinity,
 };
 
 static struct irq_chip sun4v_irq_ack = {
@@ -500,6 +560,7 @@ static struct irq_chip sun4v_irq_ack = {
        .disable        = sun4v_irq_disable,
        .ack            = run_pre_handler,
        .end            = sun4v_irq_end,
+       .set_affinity   = sun4v_set_affinity,
 };
 
 #ifdef CONFIG_PCI_MSI
@@ -511,6 +572,7 @@ static struct irq_chip sun4v_msi = {
        .disable        = sun4v_msi_disable,
        .ack            = run_pre_handler,
        .end            = sun4v_irq_end,
+       .set_affinity   = sun4v_set_affinity,
 };
 #endif
 
@@ -519,6 +581,7 @@ static struct irq_chip sun4v_virq = {
        .enable         = sun4v_virq_enable,
        .disable        = sun4v_virq_disable,
        .end            = sun4v_virq_end,
+       .set_affinity   = sun4v_virt_set_affinity,
 };
 
 static struct irq_chip sun4v_virq_ack = {
@@ -527,6 +590,7 @@ static struct irq_chip sun4v_virq_ack = {
        .disable        = sun4v_virq_disable,
        .ack            = run_pre_handler,
        .end            = sun4v_virq_end,
+       .set_affinity   = sun4v_virt_set_affinity,
 };
 
 void irq_install_pre_handler(int virt_irq,
@@ -739,6 +803,26 @@ void handler_irq(int irq, struct pt_regs *regs)
        set_irq_regs(old_regs);
 }
 
+#ifdef CONFIG_HOTPLUG_CPU
+void fixup_irqs(void)
+{
+       unsigned int irq;
+
+       for (irq = 0; irq < NR_IRQS; irq++) {
+               unsigned long flags;
+
+               spin_lock_irqsave(&irq_desc[irq].lock, flags);
+               if (irq_desc[irq].action &&
+                   !(irq_desc[irq].status & IRQ_PER_CPU)) {
+                       if (irq_desc[irq].chip->set_affinity)
+                               irq_desc[irq].chip->set_affinity(irq,
+                                       irq_desc[irq].affinity);
+               }
+               spin_unlock_irqrestore(&irq_desc[irq].lock, flags);
+       }
+}
+#endif
+
 struct sun5_timer {
        u64     count0;
        u64     limit0;
diff --git a/arch/sparc64/kernel/ldc.c b/arch/sparc64/kernel/ldc.c
new file mode 100644 (file)
index 0000000..85a2be0
--- /dev/null
@@ -0,0 +1,2373 @@
+/* ldc.c: Logical Domain Channel link-layer protocol driver.
+ *
+ * Copyright (C) 2007 David S. Miller <davem@davemloft.net>
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/delay.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/scatterlist.h>
+#include <linux/interrupt.h>
+#include <linux/list.h>
+#include <linux/init.h>
+
+#include <asm/hypervisor.h>
+#include <asm/iommu.h>
+#include <asm/page.h>
+#include <asm/ldc.h>
+#include <asm/mdesc.h>
+
+#define DRV_MODULE_NAME                "ldc"
+#define PFX DRV_MODULE_NAME    ": "
+#define DRV_MODULE_VERSION     "1.0"
+#define DRV_MODULE_RELDATE     "June 25, 2007"
+
+static char version[] __devinitdata =
+       DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
+#define LDC_PACKET_SIZE                64
+
+/* Packet header layout for unreliable and reliable mode frames.
+ * When in RAW mode, packets are simply straight 64-byte payloads
+ * with no headers.
+ */
+struct ldc_packet {
+       u8                      type;
+#define LDC_CTRL               0x01
+#define LDC_DATA               0x02
+#define LDC_ERR                        0x10
+
+       u8                      stype;
+#define LDC_INFO               0x01
+#define LDC_ACK                        0x02
+#define LDC_NACK               0x04
+
+       u8                      ctrl;
+#define LDC_VERS               0x01 /* Link Version            */
+#define LDC_RTS                        0x02 /* Request To Send         */
+#define LDC_RTR                        0x03 /* Ready To Receive        */
+#define LDC_RDX                        0x04 /* Ready for Data eXchange */
+#define LDC_CTRL_MSK           0x0f
+
+       u8                      env;
+#define LDC_LEN                        0x3f
+#define LDC_FRAG_MASK          0xc0
+#define LDC_START              0x40
+#define LDC_STOP               0x80
+
+       u32                     seqid;
+
+       union {
+               u8              u_data[LDC_PACKET_SIZE - 8];
+               struct {
+                       u32     pad;
+                       u32     ackid;
+                       u8      r_data[LDC_PACKET_SIZE - 8 - 8];
+               } r;
+       } u;
+};
+
+struct ldc_version {
+       u16 major;
+       u16 minor;
+};
+
+/* Ordered from largest major to lowest.  */
+static struct ldc_version ver_arr[] = {
+       { .major = 1, .minor = 0 },
+};
+
+#define LDC_DEFAULT_MTU                        (4 * LDC_PACKET_SIZE)
+#define LDC_DEFAULT_NUM_ENTRIES                (PAGE_SIZE / LDC_PACKET_SIZE)
+
+struct ldc_channel;
+
+struct ldc_mode_ops {
+       int (*write)(struct ldc_channel *, const void *, unsigned int);
+       int (*read)(struct ldc_channel *, void *, unsigned int);
+};
+
+static const struct ldc_mode_ops raw_ops;
+static const struct ldc_mode_ops nonraw_ops;
+static const struct ldc_mode_ops stream_ops;
+
+int ldom_domaining_enabled;
+
+struct ldc_iommu {
+       /* Protects arena alloc/free.  */
+       spinlock_t                      lock;
+       struct iommu_arena              arena;
+       struct ldc_mtable_entry         *page_table;
+};
+
+struct ldc_channel {
+       /* Protects all operations that depend upon channel state.  */
+       spinlock_t                      lock;
+
+       unsigned long                   id;
+
+       u8                              *mssbuf;
+       u32                             mssbuf_len;
+       u32                             mssbuf_off;
+
+       struct ldc_packet               *tx_base;
+       unsigned long                   tx_head;
+       unsigned long                   tx_tail;
+       unsigned long                   tx_num_entries;
+       unsigned long                   tx_ra;
+
+       unsigned long                   tx_acked;
+
+       struct ldc_packet               *rx_base;
+       unsigned long                   rx_head;
+       unsigned long                   rx_tail;
+       unsigned long                   rx_num_entries;
+       unsigned long                   rx_ra;
+
+       u32                             rcv_nxt;
+       u32                             snd_nxt;
+
+       unsigned long                   chan_state;
+
+       struct ldc_channel_config       cfg;
+       void                            *event_arg;
+
+       const struct ldc_mode_ops       *mops;
+
+       struct ldc_iommu                iommu;
+
+       struct ldc_version              ver;
+
+       u8                              hs_state;
+#define LDC_HS_CLOSED                  0x00
+#define LDC_HS_OPEN                    0x01
+#define LDC_HS_GOTVERS                 0x02
+#define LDC_HS_SENTRTR                 0x03
+#define LDC_HS_GOTRTR                  0x04
+#define LDC_HS_COMPLETE                        0x10
+
+       u8                              flags;
+#define LDC_FLAG_ALLOCED_QUEUES                0x01
+#define LDC_FLAG_REGISTERED_QUEUES     0x02
+#define LDC_FLAG_REGISTERED_IRQS       0x04
+#define LDC_FLAG_RESET                 0x10
+
+       u8                              mss;
+       u8                              state;
+
+#define LDC_IRQ_NAME_MAX               32
+       char                            rx_irq_name[LDC_IRQ_NAME_MAX];
+       char                            tx_irq_name[LDC_IRQ_NAME_MAX];
+
+       struct hlist_head               mh_list;
+
+       struct hlist_node               list;
+};
+
+#define ldcdbg(TYPE, f, a...) \
+do {   if (lp->cfg.debug & LDC_DEBUG_##TYPE) \
+               printk(KERN_INFO PFX "ID[%lu] " f, lp->id, ## a); \
+} while (0)
+
+static const char *state_to_str(u8 state)
+{
+       switch (state) {
+       case LDC_STATE_INVALID:
+               return "INVALID";
+       case LDC_STATE_INIT:
+               return "INIT";
+       case LDC_STATE_BOUND:
+               return "BOUND";
+       case LDC_STATE_READY:
+               return "READY";
+       case LDC_STATE_CONNECTED:
+               return "CONNECTED";
+       default:
+               return "<UNKNOWN>";
+       }
+}
+
+static void ldc_set_state(struct ldc_channel *lp, u8 state)
+{
+       ldcdbg(STATE, "STATE (%s) --> (%s)\n",
+              state_to_str(lp->state),
+              state_to_str(state));
+
+       lp->state = state;
+}
+
+static unsigned long __advance(unsigned long off, unsigned long num_entries)
+{
+       off += LDC_PACKET_SIZE;
+       if (off == (num_entries * LDC_PACKET_SIZE))
+               off = 0;
+
+       return off;
+}
+
+static unsigned long rx_advance(struct ldc_channel *lp, unsigned long off)
+{
+       return __advance(off, lp->rx_num_entries);
+}
+
+static unsigned long tx_advance(struct ldc_channel *lp, unsigned long off)
+{
+       return __advance(off, lp->tx_num_entries);
+}
+
+static struct ldc_packet *handshake_get_tx_packet(struct ldc_channel *lp,
+                                                 unsigned long *new_tail)
+{
+       struct ldc_packet *p;
+       unsigned long t;
+
+       t = tx_advance(lp, lp->tx_tail);
+       if (t == lp->tx_head)
+               return NULL;
+
+       *new_tail = t;
+
+       p = lp->tx_base;
+       return p + (lp->tx_tail / LDC_PACKET_SIZE);
+}
+
+/* When we are in reliable or stream mode, have to track the next packet
+ * we haven't gotten an ACK for in the TX queue using tx_acked.  We have
+ * to be careful not to stomp over the queue past that point.  During
+ * the handshake, we don't have TX data packets pending in the queue
+ * and that's why handshake_get_tx_packet() need not be mindful of
+ * lp->tx_acked.
+ */
+static unsigned long head_for_data(struct ldc_channel *lp)
+{
+       if (lp->cfg.mode == LDC_MODE_STREAM)
+               return lp->tx_acked;
+       return lp->tx_head;
+}
+
+static int tx_has_space_for(struct ldc_channel *lp, unsigned int size)
+{
+       unsigned long limit, tail, new_tail, diff;
+       unsigned int mss;
+
+       limit = head_for_data(lp);
+       tail = lp->tx_tail;
+       new_tail = tx_advance(lp, tail);
+       if (new_tail == limit)
+               return 0;
+
+       if (limit > new_tail)
+               diff = limit - new_tail;
+       else
+               diff = (limit +
+                       ((lp->tx_num_entries * LDC_PACKET_SIZE) - new_tail));
+       diff /= LDC_PACKET_SIZE;
+       mss = lp->mss;
+
+       if (diff * mss < size)
+               return 0;
+
+       return 1;
+}
+
+static struct ldc_packet *data_get_tx_packet(struct ldc_channel *lp,
+                                            unsigned long *new_tail)
+{
+       struct ldc_packet *p;
+       unsigned long h, t;
+
+       h = head_for_data(lp);
+       t = tx_advance(lp, lp->tx_tail);
+       if (t == h)
+               return NULL;
+
+       *new_tail = t;
+
+       p = lp->tx_base;
+       return p + (lp->tx_tail / LDC_PACKET_SIZE);
+}
+
+static int set_tx_tail(struct ldc_channel *lp, unsigned long tail)
+{
+       unsigned long orig_tail = lp->tx_tail;
+       int limit = 1000;
+
+       lp->tx_tail = tail;
+       while (limit-- > 0) {
+               unsigned long err;
+
+               err = sun4v_ldc_tx_set_qtail(lp->id, tail);
+               if (!err)
+                       return 0;
+
+               if (err != HV_EWOULDBLOCK) {
+                       lp->tx_tail = orig_tail;
+                       return -EINVAL;
+               }
+               udelay(1);
+       }
+
+       lp->tx_tail = orig_tail;
+       return -EBUSY;
+}
+
+/* This just updates the head value in the hypervisor using
+ * a polling loop with a timeout.  The caller takes care of
+ * upating software state representing the head change, if any.
+ */
+static int __set_rx_head(struct ldc_channel *lp, unsigned long head)
+{
+       int limit = 1000;
+
+       while (limit-- > 0) {
+               unsigned long err;
+
+               err = sun4v_ldc_rx_set_qhead(lp->id, head);
+               if (!err)
+                       return 0;
+
+               if (err != HV_EWOULDBLOCK)
+                       return -EINVAL;
+
+               udelay(1);
+       }
+
+       return -EBUSY;
+}
+
+static int send_tx_packet(struct ldc_channel *lp,
+                         struct ldc_packet *p,
+                         unsigned long new_tail)
+{
+       BUG_ON(p != (lp->tx_base + (lp->tx_tail / LDC_PACKET_SIZE)));
+
+       return set_tx_tail(lp, new_tail);
+}
+
+static struct ldc_packet *handshake_compose_ctrl(struct ldc_channel *lp,
+                                                u8 stype, u8 ctrl,
+                                                void *data, int dlen,
+                                                unsigned long *new_tail)
+{
+       struct ldc_packet *p = handshake_get_tx_packet(lp, new_tail);
+
+       if (p) {
+               memset(p, 0, sizeof(*p));
+               p->type = LDC_CTRL;
+               p->stype = stype;
+               p->ctrl = ctrl;
+               if (data)
+                       memcpy(p->u.u_data, data, dlen);
+       }
+       return p;
+}
+
+static int start_handshake(struct ldc_channel *lp)
+{
+       struct ldc_packet *p;
+       struct ldc_version *ver;
+       unsigned long new_tail;
+
+       ver = &ver_arr[0];
+
+       ldcdbg(HS, "SEND VER INFO maj[%u] min[%u]\n",
+              ver->major, ver->minor);
+
+       p = handshake_compose_ctrl(lp, LDC_INFO, LDC_VERS,
+                                  ver, sizeof(*ver), &new_tail);
+       if (p) {
+               int err = send_tx_packet(lp, p, new_tail);
+               if (!err)
+                       lp->flags &= ~LDC_FLAG_RESET;
+               return err;
+       }
+       return -EBUSY;
+}
+
+static int send_version_nack(struct ldc_channel *lp,
+                            u16 major, u16 minor)
+{
+       struct ldc_packet *p;
+       struct ldc_version ver;
+       unsigned long new_tail;
+
+       ver.major = major;
+       ver.minor = minor;
+
+       p = handshake_compose_ctrl(lp, LDC_NACK, LDC_VERS,
+                                  &ver, sizeof(ver), &new_tail);
+       if (p) {
+               ldcdbg(HS, "SEND VER NACK maj[%u] min[%u]\n",
+                      ver.major, ver.minor);
+
+               return send_tx_packet(lp, p, new_tail);
+       }
+       return -EBUSY;
+}
+
+static int send_version_ack(struct ldc_channel *lp,
+                           struct ldc_version *vp)
+{
+       struct ldc_packet *p;
+       unsigned long new_tail;
+
+       p = handshake_compose_ctrl(lp, LDC_ACK, LDC_VERS,
+                                  vp, sizeof(*vp), &new_tail);
+       if (p) {
+               ldcdbg(HS, "SEND VER ACK maj[%u] min[%u]\n",
+                      vp->major, vp->minor);
+
+               return send_tx_packet(lp, p, new_tail);
+       }
+       return -EBUSY;
+}
+
+static int send_rts(struct ldc_channel *lp)
+{
+       struct ldc_packet *p;
+       unsigned long new_tail;
+
+       p = handshake_compose_ctrl(lp, LDC_INFO, LDC_RTS, NULL, 0,
+                                  &new_tail);
+       if (p) {
+               p->env = lp->cfg.mode;
+               p->seqid = 0;
+               lp->rcv_nxt = 0;
+
+               ldcdbg(HS, "SEND RTS env[0x%x] seqid[0x%x]\n",
+                      p->env, p->seqid);
+
+               return send_tx_packet(lp, p, new_tail);
+       }
+       return -EBUSY;
+}
+
+static int send_rtr(struct ldc_channel *lp)
+{
+       struct ldc_packet *p;
+       unsigned long new_tail;
+
+       p = handshake_compose_ctrl(lp, LDC_INFO, LDC_RTR, NULL, 0,
+                                  &new_tail);
+       if (p) {
+               p->env = lp->cfg.mode;
+               p->seqid = 0;
+
+               ldcdbg(HS, "SEND RTR env[0x%x] seqid[0x%x]\n",
+                      p->env, p->seqid);
+
+               return send_tx_packet(lp, p, new_tail);
+       }
+       return -EBUSY;
+}
+
+static int send_rdx(struct ldc_channel *lp)
+{
+       struct ldc_packet *p;
+       unsigned long new_tail;
+
+       p = handshake_compose_ctrl(lp, LDC_INFO, LDC_RDX, NULL, 0,
+                                  &new_tail);
+       if (p) {
+               p->env = 0;
+               p->seqid = ++lp->snd_nxt;
+               p->u.r.ackid = lp->rcv_nxt;
+
+               ldcdbg(HS, "SEND RDX env[0x%x] seqid[0x%x] ackid[0x%x]\n",
+                      p->env, p->seqid, p->u.r.ackid);
+
+               return send_tx_packet(lp, p, new_tail);
+       }
+       return -EBUSY;
+}
+
+static int send_data_nack(struct ldc_channel *lp, struct ldc_packet *data_pkt)
+{
+       struct ldc_packet *p;
+       unsigned long new_tail;
+       int err;
+
+       p = data_get_tx_packet(lp, &new_tail);
+       if (!p)
+               return -EBUSY;
+       memset(p, 0, sizeof(*p));
+       p->type = data_pkt->type;
+       p->stype = LDC_NACK;
+       p->ctrl = data_pkt->ctrl & LDC_CTRL_MSK;
+       p->seqid = lp->snd_nxt + 1;
+       p->u.r.ackid = lp->rcv_nxt;
+
+       ldcdbg(HS, "SEND DATA NACK type[0x%x] ctl[0x%x] seq[0x%x] ack[0x%x]\n",
+              p->type, p->ctrl, p->seqid, p->u.r.ackid);
+
+       err = send_tx_packet(lp, p, new_tail);
+       if (!err)
+               lp->snd_nxt++;
+
+       return err;
+}
+
+static int ldc_abort(struct ldc_channel *lp)
+{
+       unsigned long hv_err;
+
+       ldcdbg(STATE, "ABORT\n");
+
+       /* We report but do not act upon the hypervisor errors because
+        * there really isn't much we can do if they fail at this point.
+        */
+       hv_err = sun4v_ldc_tx_qconf(lp->id, lp->tx_ra, lp->tx_num_entries);
+       if (hv_err)
+               printk(KERN_ERR PFX "ldc_abort: "
+                      "sun4v_ldc_tx_qconf(%lx,%lx,%lx) failed, err=%lu\n",
+                      lp->id, lp->tx_ra, lp->tx_num_entries, hv_err);
+
+       hv_err = sun4v_ldc_tx_get_state(lp->id,
+                                       &lp->tx_head,
+                                       &lp->tx_tail,
+                                       &lp->chan_state);
+       if (hv_err)
+               printk(KERN_ERR PFX "ldc_abort: "
+                      "sun4v_ldc_tx_get_state(%lx,...) failed, err=%lu\n",
+                      lp->id, hv_err);
+
+       hv_err = sun4v_ldc_rx_qconf(lp->id, lp->rx_ra, lp->rx_num_entries);
+       if (hv_err)
+               printk(KERN_ERR PFX "ldc_abort: "
+                      "sun4v_ldc_rx_qconf(%lx,%lx,%lx) failed, err=%lu\n",
+                      lp->id, lp->rx_ra, lp->rx_num_entries, hv_err);
+
+       /* Refetch the RX queue state as well, because we could be invoked
+        * here in the queue processing context.
+        */
+       hv_err = sun4v_ldc_rx_get_state(lp->id,
+                                       &lp->rx_head,
+                                       &lp->rx_tail,
+                                       &lp->chan_state);
+       if (hv_err)
+               printk(KERN_ERR PFX "ldc_abort: "
+                      "sun4v_ldc_rx_get_state(%lx,...) failed, err=%lu\n",
+                      lp->id, hv_err);
+
+       return -ECONNRESET;
+}
+
+static struct ldc_version *find_by_major(u16 major)
+{
+       struct ldc_version *ret = NULL;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(ver_arr); i++) {
+               struct ldc_version *v = &ver_arr[i];
+               if (v->major <= major) {
+                       ret = v;
+                       break;
+               }
+       }
+       return ret;
+}
+
+static int process_ver_info(struct ldc_channel *lp, struct ldc_version *vp)
+{
+       struct ldc_version *vap;
+       int err;
+
+       ldcdbg(HS, "GOT VERSION INFO major[%x] minor[%x]\n",
+              vp->major, vp->minor);
+
+       if (lp->hs_state == LDC_HS_GOTVERS) {
+               lp->hs_state = LDC_HS_OPEN;
+               memset(&lp->ver, 0, sizeof(lp->ver));
+       }
+
+       vap = find_by_major(vp->major);
+       if (!vap) {
+               err = send_version_nack(lp, 0, 0);
+       } else if (vap->major != vp->major) {
+               err = send_version_nack(lp, vap->major, vap->minor);
+       } else {
+               struct ldc_version ver = *vp;
+               if (ver.minor > vap->minor)
+                       ver.minor = vap->minor;
+               err = send_version_ack(lp, &ver);
+               if (!err) {
+                       lp->ver = ver;
+                       lp->hs_state = LDC_HS_GOTVERS;
+               }
+       }
+       if (err)
+               return ldc_abort(lp);
+
+       return 0;
+}
+
+static int process_ver_ack(struct ldc_channel *lp, struct ldc_version *vp)
+{
+       ldcdbg(HS, "GOT VERSION ACK major[%x] minor[%x]\n",
+              vp->major, vp->minor);
+
+       if (lp->hs_state == LDC_HS_GOTVERS) {
+               if (lp->ver.major != vp->major ||
+                   lp->ver.minor != vp->minor)
+                       return ldc_abort(lp);
+       } else {
+               lp->ver = *vp;
+               lp->hs_state = LDC_HS_GOTVERS;
+       }
+       if (send_rts(lp))
+               return ldc_abort(lp);
+       return 0;
+}
+
+static int process_ver_nack(struct ldc_channel *lp, struct ldc_version *vp)
+{
+       struct ldc_version *vap;
+
+       if ((vp->major == 0 && vp->minor == 0) ||
+           !(vap = find_by_major(vp->major))) {
+               return ldc_abort(lp);
+       } else {
+               struct ldc_packet *p;
+               unsigned long new_tail;
+
+               p = handshake_compose_ctrl(lp, LDC_INFO, LDC_VERS,
+                                          vap, sizeof(*vap),
+                                          &new_tail);
+               if (p)
+                       return send_tx_packet(lp, p, new_tail);
+               else
+                       return ldc_abort(lp);
+       }
+}
+
+static int process_version(struct ldc_channel *lp,
+                          struct ldc_packet *p)
+{
+       struct ldc_version *vp;
+
+       vp = (struct ldc_version *) p->u.u_data;
+
+       switch (p->stype) {
+       case LDC_INFO:
+               return process_ver_info(lp, vp);
+
+       case LDC_ACK:
+               return process_ver_ack(lp, vp);
+
+       case LDC_NACK:
+               return process_ver_nack(lp, vp);
+
+       default:
+               return ldc_abort(lp);
+       }
+}
+
+static int process_rts(struct ldc_channel *lp,
+                      struct ldc_packet *p)
+{
+       ldcdbg(HS, "GOT RTS stype[%x] seqid[%x] env[%x]\n",
+              p->stype, p->seqid, p->env);
+
+       if (p->stype     != LDC_INFO       ||
+           lp->hs_state != LDC_HS_GOTVERS ||
+           p->env       != lp->cfg.mode)
+               return ldc_abort(lp);
+
+       lp->snd_nxt = p->seqid;
+       lp->rcv_nxt = p->seqid;
+       lp->hs_state = LDC_HS_SENTRTR;
+       if (send_rtr(lp))
+               return ldc_abort(lp);
+
+       return 0;
+}
+
+static int process_rtr(struct ldc_channel *lp,
+                      struct ldc_packet *p)
+{
+       ldcdbg(HS, "GOT RTR stype[%x] seqid[%x] env[%x]\n",
+              p->stype, p->seqid, p->env);
+
+       if (p->stype     != LDC_INFO ||
+           p->env       != lp->cfg.mode)
+               return ldc_abort(lp);
+
+       lp->snd_nxt = p->seqid;
+       lp->hs_state = LDC_HS_COMPLETE;
+       ldc_set_state(lp, LDC_STATE_CONNECTED);
+       send_rdx(lp);
+
+       return LDC_EVENT_UP;
+}
+
+static int rx_seq_ok(struct ldc_channel *lp, u32 seqid)
+{
+       return lp->rcv_nxt + 1 == seqid;
+}
+
+static int process_rdx(struct ldc_channel *lp,
+                      struct ldc_packet *p)
+{
+       ldcdbg(HS, "GOT RDX stype[%x] seqid[%x] env[%x] ackid[%x]\n",
+              p->stype, p->seqid, p->env, p->u.r.ackid);
+
+       if (p->stype != LDC_INFO ||
+           !(rx_seq_ok(lp, p->seqid)))
+               return ldc_abort(lp);
+
+       lp->rcv_nxt = p->seqid;
+
+       lp->hs_state = LDC_HS_COMPLETE;
+       ldc_set_state(lp, LDC_STATE_CONNECTED);
+
+       return LDC_EVENT_UP;
+}
+
+static int process_control_frame(struct ldc_channel *lp,
+                                struct ldc_packet *p)
+{
+       switch (p->ctrl) {
+       case LDC_VERS:
+               return process_version(lp, p);
+
+       case LDC_RTS:
+               return process_rts(lp, p);
+
+       case LDC_RTR:
+               return process_rtr(lp, p);
+
+       case LDC_RDX:
+               return process_rdx(lp, p);
+
+       default:
+               return ldc_abort(lp);
+       }
+}
+
+static int process_error_frame(struct ldc_channel *lp,
+                              struct ldc_packet *p)
+{
+       return ldc_abort(lp);
+}
+
+static int process_data_ack(struct ldc_channel *lp,
+                           struct ldc_packet *ack)
+{
+       unsigned long head = lp->tx_acked;
+       u32 ackid = ack->u.r.ackid;
+
+       while (1) {
+               struct ldc_packet *p = lp->tx_base + (head / LDC_PACKET_SIZE);
+
+               head = tx_advance(lp, head);
+
+               if (p->seqid == ackid) {
+                       lp->tx_acked = head;
+                       return 0;
+               }
+               if (head == lp->tx_tail)
+                       return ldc_abort(lp);
+       }
+
+       return 0;
+}
+
+static void send_events(struct ldc_channel *lp, unsigned int event_mask)
+{
+       if (event_mask & LDC_EVENT_RESET)
+               lp->cfg.event(lp->event_arg, LDC_EVENT_RESET);
+       if (event_mask & LDC_EVENT_UP)
+               lp->cfg.event(lp->event_arg, LDC_EVENT_UP);
+       if (event_mask & LDC_EVENT_DATA_READY)
+               lp->cfg.event(lp->event_arg, LDC_EVENT_DATA_READY);
+}
+
+static irqreturn_t ldc_rx(int irq, void *dev_id)
+{
+       struct ldc_channel *lp = dev_id;
+       unsigned long orig_state, hv_err, flags;
+       unsigned int event_mask;
+
+       spin_lock_irqsave(&lp->lock, flags);
+
+       orig_state = lp->chan_state;
+       hv_err = sun4v_ldc_rx_get_state(lp->id,
+                                       &lp->rx_head,
+                                       &lp->rx_tail,
+                                       &lp->chan_state);
+
+       ldcdbg(RX, "RX state[0x%02lx:0x%02lx] head[0x%04lx] tail[0x%04lx]\n",
+              orig_state, lp->chan_state, lp->rx_head, lp->rx_tail);
+
+       event_mask = 0;
+
+       if (lp->cfg.mode == LDC_MODE_RAW &&
+           lp->chan_state == LDC_CHANNEL_UP) {
+               lp->hs_state = LDC_HS_COMPLETE;
+               ldc_set_state(lp, LDC_STATE_CONNECTED);
+
+               event_mask |= LDC_EVENT_UP;
+
+               orig_state = lp->chan_state;
+       }
+
+       /* If we are in reset state, flush the RX queue and ignore
+        * everything.
+        */
+       if (lp->flags & LDC_FLAG_RESET) {
+               (void) __set_rx_head(lp, lp->rx_tail);
+               goto out;
+       }
+
+       /* Once we finish the handshake, we let the ldc_read()
+        * paths do all of the control frame and state management.
+        * Just trigger the callback.
+        */
+       if (lp->hs_state == LDC_HS_COMPLETE) {
+handshake_complete:
+               if (lp->chan_state != orig_state) {
+                       unsigned int event = LDC_EVENT_RESET;
+
+                       if (lp->chan_state == LDC_CHANNEL_UP)
+                               event = LDC_EVENT_UP;
+
+                       event_mask |= event;
+               }
+               if (lp->rx_head != lp->rx_tail)
+                       event_mask |= LDC_EVENT_DATA_READY;
+
+               goto out;
+       }
+
+       if (lp->chan_state != orig_state)
+               goto out;
+
+       while (lp->rx_head != lp->rx_tail) {
+               struct ldc_packet *p;
+               unsigned long new;
+               int err;
+
+               p = lp->rx_base + (lp->rx_head / LDC_PACKET_SIZE);
+
+               switch (p->type) {
+               case LDC_CTRL:
+                       err = process_control_frame(lp, p);
+                       if (err > 0)
+                               event_mask |= err;
+                       break;
+
+               case LDC_DATA:
+                       event_mask |= LDC_EVENT_DATA_READY;
+                       err = 0;
+                       break;
+
+               case LDC_ERR:
+                       err = process_error_frame(lp, p);
+                       break;
+
+               default:
+                       err = ldc_abort(lp);
+                       break;
+               }
+
+               if (err < 0)
+                       break;
+
+               new = lp->rx_head;
+               new += LDC_PACKET_SIZE;
+               if (new == (lp->rx_num_entries * LDC_PACKET_SIZE))
+                       new = 0;
+               lp->rx_head = new;
+
+               err = __set_rx_head(lp, new);
+               if (err < 0) {
+                       (void) ldc_abort(lp);
+                       break;
+               }
+               if (lp->hs_state == LDC_HS_COMPLETE)
+                       goto handshake_complete;
+       }
+
+out:
+       spin_unlock_irqrestore(&lp->lock, flags);
+
+       send_events(lp, event_mask);
+
+       return IRQ_HANDLED;
+}
+
+static irqreturn_t ldc_tx(int irq, void *dev_id)
+{
+       struct ldc_channel *lp = dev_id;
+       unsigned long flags, hv_err, orig_state;
+       unsigned int event_mask = 0;
+
+       spin_lock_irqsave(&lp->lock, flags);
+
+       orig_state = lp->chan_state;
+       hv_err = sun4v_ldc_tx_get_state(lp->id,
+                                       &lp->tx_head,
+                                       &lp->tx_tail,
+                                       &lp->chan_state);
+
+       ldcdbg(TX, " TX state[0x%02lx:0x%02lx] head[0x%04lx] tail[0x%04lx]\n",
+              orig_state, lp->chan_state, lp->tx_head, lp->tx_tail);
+
+       if (lp->cfg.mode == LDC_MODE_RAW &&
+           lp->chan_state == LDC_CHANNEL_UP) {
+               lp->hs_state = LDC_HS_COMPLETE;
+               ldc_set_state(lp, LDC_STATE_CONNECTED);
+
+               event_mask |= LDC_EVENT_UP;
+       }
+
+       spin_unlock_irqrestore(&lp->lock, flags);
+
+       send_events(lp, event_mask);
+
+       return IRQ_HANDLED;
+}
+
+/* XXX ldc_alloc() and ldc_free() needs to run under a mutex so
+ * XXX that addition and removal from the ldc_channel_list has
+ * XXX atomicity, otherwise the __ldc_channel_exists() check is
+ * XXX totally pointless as another thread can slip into ldc_alloc()
+ * XXX and add a channel with the same ID.  There also needs to be
+ * XXX a spinlock for ldc_channel_list.
+ */
+static HLIST_HEAD(ldc_channel_list);
+
+static int __ldc_channel_exists(unsigned long id)
+{
+       struct ldc_channel *lp;
+       struct hlist_node *n;
+
+       hlist_for_each_entry(lp, n, &ldc_channel_list, list) {
+               if (lp->id == id)
+                       return 1;
+       }
+       return 0;
+}
+
+static int alloc_queue(const char *name, unsigned long num_entries,
+                      struct ldc_packet **base, unsigned long *ra)
+{
+       unsigned long size, order;
+       void *q;
+
+       size = num_entries * LDC_PACKET_SIZE;
+       order = get_order(size);
+
+       q = (void *) __get_free_pages(GFP_KERNEL, order);
+       if (!q) {
+               printk(KERN_ERR PFX "Alloc of %s queue failed with "
+                      "size=%lu order=%lu\n", name, size, order);
+               return -ENOMEM;
+       }
+
+       memset(q, 0, PAGE_SIZE << order);
+
+       *base = q;
+       *ra = __pa(q);
+
+       return 0;
+}
+
+static void free_queue(unsigned long num_entries, struct ldc_packet *q)
+{
+       unsigned long size, order;
+
+       if (!q)
+               return;
+
+       size = num_entries * LDC_PACKET_SIZE;
+       order = get_order(size);
+
+       free_pages((unsigned long)q, order);
+}
+
+/* XXX Make this configurable... XXX */
+#define LDC_IOTABLE_SIZE       (8 * 1024)
+
+static int ldc_iommu_init(struct ldc_channel *lp)
+{
+       unsigned long sz, num_tsb_entries, tsbsize, order;
+       struct ldc_iommu *iommu = &lp->iommu;
+       struct ldc_mtable_entry *table;
+       unsigned long hv_err;
+       int err;
+
+       num_tsb_entries = LDC_IOTABLE_SIZE;
+       tsbsize = num_tsb_entries * sizeof(struct ldc_mtable_entry);
+
+       spin_lock_init(&iommu->lock);
+
+       sz = num_tsb_entries / 8;
+       sz = (sz + 7UL) & ~7UL;
+       iommu->arena.map = kzalloc(sz, GFP_KERNEL);
+       if (!iommu->arena.map) {
+               printk(KERN_ERR PFX "Alloc of arena map failed, sz=%lu\n", sz);
+               return -ENOMEM;
+       }
+
+       iommu->arena.limit = num_tsb_entries;
+
+       order = get_order(tsbsize);
+
+       table = (struct ldc_mtable_entry *)
+               __get_free_pages(GFP_KERNEL, order);
+       err = -ENOMEM;
+       if (!table) {
+               printk(KERN_ERR PFX "Alloc of MTE table failed, "
+                      "size=%lu order=%lu\n", tsbsize, order);
+               goto out_free_map;
+       }
+
+       memset(table, 0, PAGE_SIZE << order);
+
+       iommu->page_table = table;
+
+       hv_err = sun4v_ldc_set_map_table(lp->id, __pa(table),
+                                        num_tsb_entries);
+       err = -EINVAL;
+       if (hv_err)
+               goto out_free_table;
+
+       return 0;
+
+out_free_table:
+       free_pages((unsigned long) table, order);
+       iommu->page_table = NULL;
+
+out_free_map:
+       kfree(iommu->arena.map);
+       iommu->arena.map = NULL;
+
+       return err;
+}
+
+static void ldc_iommu_release(struct ldc_channel *lp)
+{
+       struct ldc_iommu *iommu = &lp->iommu;
+       unsigned long num_tsb_entries, tsbsize, order;
+
+       (void) sun4v_ldc_set_map_table(lp->id, 0, 0);
+
+       num_tsb_entries = iommu->arena.limit;
+       tsbsize = num_tsb_entries * sizeof(struct ldc_mtable_entry);
+       order = get_order(tsbsize);
+
+       free_pages((unsigned long) iommu->page_table, order);
+       iommu->page_table = NULL;
+
+       kfree(iommu->arena.map);
+       iommu->arena.map = NULL;
+}
+
+struct ldc_channel *ldc_alloc(unsigned long id,
+                             const struct ldc_channel_config *cfgp,
+                             void *event_arg)
+{
+       struct ldc_channel *lp;
+       const struct ldc_mode_ops *mops;
+       unsigned long dummy1, dummy2, hv_err;
+       u8 mss, *mssbuf;
+       int err;
+
+       err = -ENODEV;
+       if (!ldom_domaining_enabled)
+               goto out_err;
+
+       err = -EINVAL;
+       if (!cfgp)
+               goto out_err;
+
+       switch (cfgp->mode) {
+       case LDC_MODE_RAW:
+               mops = &raw_ops;
+               mss = LDC_PACKET_SIZE;
+               break;
+
+       case LDC_MODE_UNRELIABLE:
+               mops = &nonraw_ops;
+               mss = LDC_PACKET_SIZE - 8;
+               break;
+
+       case LDC_MODE_STREAM:
+               mops = &stream_ops;
+               mss = LDC_PACKET_SIZE - 8 - 8;
+               break;
+
+       default:
+               goto out_err;
+       }
+
+       if (!cfgp->event || !event_arg || !cfgp->rx_irq || !cfgp->tx_irq)
+               goto out_err;
+
+       hv_err = sun4v_ldc_tx_qinfo(id, &dummy1, &dummy2);
+       err = -ENODEV;
+       if (hv_err == HV_ECHANNEL)
+               goto out_err;
+
+       err = -EEXIST;
+       if (__ldc_channel_exists(id))
+               goto out_err;
+
+       mssbuf = NULL;
+
+       lp = kzalloc(sizeof(*lp), GFP_KERNEL);
+       err = -ENOMEM;
+       if (!lp)
+               goto out_err;
+
+       spin_lock_init(&lp->lock);
+
+       lp->id = id;
+
+       err = ldc_iommu_init(lp);
+       if (err)
+               goto out_free_ldc;
+
+       lp->mops = mops;
+       lp->mss = mss;
+
+       lp->cfg = *cfgp;
+       if (!lp->cfg.mtu)
+               lp->cfg.mtu = LDC_DEFAULT_MTU;
+
+       if (lp->cfg.mode == LDC_MODE_STREAM) {
+               mssbuf = kzalloc(lp->cfg.mtu, GFP_KERNEL);
+               if (!mssbuf) {
+                       err = -ENOMEM;
+                       goto out_free_iommu;
+               }
+               lp->mssbuf = mssbuf;
+       }
+
+       lp->event_arg = event_arg;
+
+       /* XXX allow setting via ldc_channel_config to override defaults
+        * XXX or use some formula based upon mtu
+        */
+       lp->tx_num_entries = LDC_DEFAULT_NUM_ENTRIES;
+       lp->rx_num_entries = LDC_DEFAULT_NUM_ENTRIES;
+
+       err = alloc_queue("TX", lp->tx_num_entries,
+                         &lp->tx_base, &lp->tx_ra);
+       if (err)
+               goto out_free_mssbuf;
+
+       err = alloc_queue("RX", lp->rx_num_entries,
+                         &lp->rx_base, &lp->rx_ra);
+       if (err)
+               goto out_free_txq;
+
+       lp->flags |= LDC_FLAG_ALLOCED_QUEUES;
+
+       lp->hs_state = LDC_HS_CLOSED;
+       ldc_set_state(lp, LDC_STATE_INIT);
+
+       INIT_HLIST_NODE(&lp->list);
+       hlist_add_head(&lp->list, &ldc_channel_list);
+
+       INIT_HLIST_HEAD(&lp->mh_list);
+
+       return lp;
+
+out_free_txq:
+       free_queue(lp->tx_num_entries, lp->tx_base);
+
+out_free_mssbuf:
+       if (mssbuf)
+               kfree(mssbuf);
+
+out_free_iommu:
+       ldc_iommu_release(lp);
+
+out_free_ldc:
+       kfree(lp);
+
+out_err:
+       return ERR_PTR(err);
+}
+EXPORT_SYMBOL(ldc_alloc);
+
+void ldc_free(struct ldc_channel *lp)
+{
+       if (lp->flags & LDC_FLAG_REGISTERED_IRQS) {
+               free_irq(lp->cfg.rx_irq, lp);
+               free_irq(lp->cfg.tx_irq, lp);
+       }
+
+       if (lp->flags & LDC_FLAG_REGISTERED_QUEUES) {
+               sun4v_ldc_tx_qconf(lp->id, 0, 0);
+               sun4v_ldc_rx_qconf(lp->id, 0, 0);
+               lp->flags &= ~LDC_FLAG_REGISTERED_QUEUES;
+       }
+       if (lp->flags & LDC_FLAG_ALLOCED_QUEUES) {
+               free_queue(lp->tx_num_entries, lp->tx_base);
+               free_queue(lp->rx_num_entries, lp->rx_base);
+               lp->flags &= ~LDC_FLAG_ALLOCED_QUEUES;
+       }
+
+       hlist_del(&lp->list);
+
+       if (lp->mssbuf)
+               kfree(lp->mssbuf);
+
+       ldc_iommu_release(lp);
+
+       kfree(lp);
+}
+EXPORT_SYMBOL(ldc_free);
+
+/* Bind the channel.  This registers the LDC queues with
+ * the hypervisor and puts the channel into a pseudo-listening
+ * state.  This does not initiate a handshake, ldc_connect() does
+ * that.
+ */
+int ldc_bind(struct ldc_channel *lp, const char *name)
+{
+       unsigned long hv_err, flags;
+       int err = -EINVAL;
+
+       spin_lock_irqsave(&lp->lock, flags);
+
+       if (!name)
+               goto out_err;
+
+       if (lp->state != LDC_STATE_INIT)
+               goto out_err;
+
+       snprintf(lp->rx_irq_name, LDC_IRQ_NAME_MAX, "%s RX", name);
+       snprintf(lp->tx_irq_name, LDC_IRQ_NAME_MAX, "%s TX", name);
+
+       err = request_irq(lp->cfg.rx_irq, ldc_rx,
+                         IRQF_SAMPLE_RANDOM | IRQF_SHARED,
+                         lp->rx_irq_name, lp);
+       if (err)
+               goto out_err;
+
+       err = request_irq(lp->cfg.tx_irq, ldc_tx,
+                         IRQF_SAMPLE_RANDOM | IRQF_SHARED,
+                         lp->tx_irq_name, lp);
+       if (err)
+               goto out_free_rx_irq;
+
+
+       lp->flags |= LDC_FLAG_REGISTERED_IRQS;
+
+       err = -ENODEV;
+       hv_err = sun4v_ldc_tx_qconf(lp->id, 0, 0);
+       if (hv_err)
+               goto out_free_tx_irq;
+
+       hv_err = sun4v_ldc_tx_qconf(lp->id, lp->tx_ra, lp->tx_num_entries);
+       if (hv_err)
+               goto out_free_tx_irq;
+
+       hv_err = sun4v_ldc_rx_qconf(lp->id, 0, 0);
+       if (hv_err)
+               goto out_unmap_tx;
+
+       hv_err = sun4v_ldc_rx_qconf(lp->id, lp->rx_ra, lp->rx_num_entries);
+       if (hv_err)
+               goto out_unmap_tx;
+
+       lp->flags |= LDC_FLAG_REGISTERED_QUEUES;
+
+       hv_err = sun4v_ldc_tx_get_state(lp->id,
+                                       &lp->tx_head,
+                                       &lp->tx_tail,
+                                       &lp->chan_state);
+       err = -EBUSY;
+       if (hv_err)
+               goto out_unmap_rx;
+
+       lp->tx_acked = lp->tx_head;
+
+       lp->hs_state = LDC_HS_OPEN;
+       ldc_set_state(lp, LDC_STATE_BOUND);
+
+       spin_unlock_irqrestore(&lp->lock, flags);
+
+       return 0;
+
+out_unmap_rx:
+       lp->flags &= ~LDC_FLAG_REGISTERED_QUEUES;
+       sun4v_ldc_rx_qconf(lp->id, 0, 0);
+
+out_unmap_tx:
+       sun4v_ldc_tx_qconf(lp->id, 0, 0);
+
+out_free_tx_irq:
+       lp->flags &= ~LDC_FLAG_REGISTERED_IRQS;
+       free_irq(lp->cfg.tx_irq, lp);
+
+out_free_rx_irq:
+       free_irq(lp->cfg.rx_irq, lp);
+
+out_err:
+       spin_unlock_irqrestore(&lp->lock, flags);
+
+       return err;
+}
+EXPORT_SYMBOL(ldc_bind);
+
+int ldc_connect(struct ldc_channel *lp)
+{
+       unsigned long flags;
+       int err;
+
+       if (lp->cfg.mode == LDC_MODE_RAW)
+               return -EINVAL;
+
+       spin_lock_irqsave(&lp->lock, flags);
+
+       if (!(lp->flags & LDC_FLAG_ALLOCED_QUEUES) ||
+           !(lp->flags & LDC_FLAG_REGISTERED_QUEUES) ||
+           lp->hs_state != LDC_HS_OPEN)
+               err = -EINVAL;
+       else
+               err = start_handshake(lp);
+
+       spin_unlock_irqrestore(&lp->lock, flags);
+
+       return err;
+}
+EXPORT_SYMBOL(ldc_connect);
+
+int ldc_disconnect(struct ldc_channel *lp)
+{
+       unsigned long hv_err, flags;
+       int err;
+
+       if (lp->cfg.mode == LDC_MODE_RAW)
+               return -EINVAL;
+
+       if (!(lp->flags & LDC_FLAG_ALLOCED_QUEUES) ||
+           !(lp->flags & LDC_FLAG_REGISTERED_QUEUES))
+               return -EINVAL;
+
+       spin_lock_irqsave(&lp->lock, flags);
+
+       err = -ENODEV;
+       hv_err = sun4v_ldc_tx_qconf(lp->id, 0, 0);
+       if (hv_err)
+               goto out_err;
+
+       hv_err = sun4v_ldc_tx_qconf(lp->id, lp->tx_ra, lp->tx_num_entries);
+       if (hv_err)
+               goto out_err;
+
+       hv_err = sun4v_ldc_rx_qconf(lp->id, 0, 0);
+       if (hv_err)
+               goto out_err;
+
+       hv_err = sun4v_ldc_rx_qconf(lp->id, lp->rx_ra, lp->rx_num_entries);
+       if (hv_err)
+               goto out_err;
+
+       ldc_set_state(lp, LDC_STATE_BOUND);
+       lp->hs_state = LDC_HS_OPEN;
+       lp->flags |= LDC_FLAG_RESET;
+
+       spin_unlock_irqrestore(&lp->lock, flags);
+
+       return 0;
+
+out_err:
+       sun4v_ldc_tx_qconf(lp->id, 0, 0);
+       sun4v_ldc_rx_qconf(lp->id, 0, 0);
+       free_irq(lp->cfg.tx_irq, lp);
+       free_irq(lp->cfg.rx_irq, lp);
+       lp->flags &= ~(LDC_FLAG_REGISTERED_IRQS |
+                      LDC_FLAG_REGISTERED_QUEUES);
+       ldc_set_state(lp, LDC_STATE_INIT);
+
+       spin_unlock_irqrestore(&lp->lock, flags);
+
+       return err;
+}
+EXPORT_SYMBOL(ldc_disconnect);
+
+int ldc_state(struct ldc_channel *lp)
+{
+       return lp->state;
+}
+EXPORT_SYMBOL(ldc_state);
+
+static int write_raw(struct ldc_channel *lp, const void *buf, unsigned int size)
+{
+       struct ldc_packet *p;
+       unsigned long new_tail;
+       int err;
+
+       if (size > LDC_PACKET_SIZE)
+               return -EMSGSIZE;
+
+       p = data_get_tx_packet(lp, &new_tail);
+       if (!p)
+               return -EAGAIN;
+
+       memcpy(p, buf, size);
+
+       err = send_tx_packet(lp, p, new_tail);
+       if (!err)
+               err = size;
+
+       return err;
+}
+
+static int read_raw(struct ldc_channel *lp, void *buf, unsigned int size)
+{
+       struct ldc_packet *p;
+       unsigned long hv_err, new;
+       int err;
+
+       if (size < LDC_PACKET_SIZE)
+               return -EINVAL;
+
+       hv_err = sun4v_ldc_rx_get_state(lp->id,
+                                       &lp->rx_head,
+                                       &lp->rx_tail,
+                                       &lp->chan_state);
+       if (hv_err)
+               return ldc_abort(lp);
+
+       if (lp->chan_state == LDC_CHANNEL_DOWN ||
+           lp->chan_state == LDC_CHANNEL_RESETTING)
+               return -ECONNRESET;
+
+       if (lp->rx_head == lp->rx_tail)
+               return 0;
+
+       p = lp->rx_base + (lp->rx_head / LDC_PACKET_SIZE);
+       memcpy(buf, p, LDC_PACKET_SIZE);
+
+       new = rx_advance(lp, lp->rx_head);
+       lp->rx_head = new;
+
+       err = __set_rx_head(lp, new);
+       if (err < 0)
+               err = -ECONNRESET;
+       else
+               err = LDC_PACKET_SIZE;
+
+       return err;
+}
+
+static const struct ldc_mode_ops raw_ops = {
+       .write          =       write_raw,
+       .read           =       read_raw,
+};
+
+static int write_nonraw(struct ldc_channel *lp, const void *buf,
+                       unsigned int size)
+{
+       unsigned long hv_err, tail;
+       unsigned int copied;
+       u32 seq;
+       int err;
+
+       hv_err = sun4v_ldc_tx_get_state(lp->id, &lp->tx_head, &lp->tx_tail,
+                                       &lp->chan_state);
+       if (unlikely(hv_err))
+               return -EBUSY;
+
+       if (unlikely(lp->chan_state != LDC_CHANNEL_UP))
+               return ldc_abort(lp);
+
+       if (!tx_has_space_for(lp, size))
+               return -EAGAIN;
+
+       seq = lp->snd_nxt;
+       copied = 0;
+       tail = lp->tx_tail;
+       while (copied < size) {
+               struct ldc_packet *p = lp->tx_base + (tail / LDC_PACKET_SIZE);
+               u8 *data = ((lp->cfg.mode == LDC_MODE_UNRELIABLE) ?
+                           p->u.u_data :
+                           p->u.r.r_data);
+               int data_len;
+
+               p->type = LDC_DATA;
+               p->stype = LDC_INFO;
+               p->ctrl = 0;
+
+               data_len = size - copied;
+               if (data_len > lp->mss)
+                       data_len = lp->mss;
+
+               BUG_ON(data_len > LDC_LEN);
+
+               p->env = (data_len |
+                         (copied == 0 ? LDC_START : 0) |
+                         (data_len == size - copied ? LDC_STOP : 0));
+
+               p->seqid = ++seq;
+
+               ldcdbg(DATA, "SENT DATA [%02x:%02x:%02x:%02x:%08x]\n",
+                      p->type,
+                      p->stype,
+                      p->ctrl,
+                      p->env,
+                      p->seqid);
+
+               memcpy(data, buf, data_len);
+               buf += data_len;
+               copied += data_len;
+
+               tail = tx_advance(lp, tail);
+       }
+
+       err = set_tx_tail(lp, tail);
+       if (!err) {
+               lp->snd_nxt = seq;
+               err = size;
+       }
+
+       return err;
+}
+
+static int rx_bad_seq(struct ldc_channel *lp, struct ldc_packet *p,
+                     struct ldc_packet *first_frag)
+{
+       int err;
+
+       if (first_frag)
+               lp->rcv_nxt = first_frag->seqid - 1;
+
+       err = send_data_nack(lp, p);
+       if (err)
+               return err;
+
+       err = __set_rx_head(lp, lp->rx_tail);
+       if (err < 0)
+               return ldc_abort(lp);
+
+       return 0;
+}
+
+static int data_ack_nack(struct ldc_channel *lp, struct ldc_packet *p)
+{
+       if (p->stype & LDC_ACK) {
+               int err = process_data_ack(lp, p);
+               if (err)
+                       return err;
+       }
+       if (p->stype & LDC_NACK)
+               return ldc_abort(lp);
+
+       return 0;
+}
+
+static int rx_data_wait(struct ldc_channel *lp, unsigned long cur_head)
+{
+       unsigned long dummy;
+       int limit = 1000;
+
+       ldcdbg(DATA, "DATA WAIT cur_head[%lx] rx_head[%lx] rx_tail[%lx]\n",
+              cur_head, lp->rx_head, lp->rx_tail);
+       while (limit-- > 0) {
+               unsigned long hv_err;
+
+               hv_err = sun4v_ldc_rx_get_state(lp->id,
+                                               &dummy,
+                                               &lp->rx_tail,
+                                               &lp->chan_state);
+               if (hv_err)
+                       return ldc_abort(lp);
+
+               if (lp->chan_state == LDC_CHANNEL_DOWN ||
+                   lp->chan_state == LDC_CHANNEL_RESETTING)
+                       return -ECONNRESET;
+
+               if (cur_head != lp->rx_tail) {
+                       ldcdbg(DATA, "DATA WAIT DONE "
+                              "head[%lx] tail[%lx] chan_state[%lx]\n",
+                              dummy, lp->rx_tail, lp->chan_state);
+                       return 0;
+               }
+
+               udelay(1);
+       }
+       return -EAGAIN;
+}
+
+static int rx_set_head(struct ldc_channel *lp, unsigned long head)
+{
+       int err = __set_rx_head(lp, head);
+
+       if (err < 0)
+               return ldc_abort(lp);
+
+       lp->rx_head = head;
+       return 0;
+}
+
+static void send_data_ack(struct ldc_channel *lp)
+{
+       unsigned long new_tail;
+       struct ldc_packet *p;
+
+       p = data_get_tx_packet(lp, &new_tail);
+       if (likely(p)) {
+               int err;
+
+               memset(p, 0, sizeof(*p));
+               p->type = LDC_DATA;
+               p->stype = LDC_ACK;
+               p->ctrl = 0;
+               p->seqid = lp->snd_nxt + 1;
+               p->u.r.ackid = lp->rcv_nxt;
+
+               err = send_tx_packet(lp, p, new_tail);
+               if (!err)
+                       lp->snd_nxt++;
+       }
+}
+
+static int read_nonraw(struct ldc_channel *lp, void *buf, unsigned int size)
+{
+       struct ldc_packet *first_frag;
+       unsigned long hv_err, new;
+       int err, copied;
+
+       hv_err = sun4v_ldc_rx_get_state(lp->id,
+                                       &lp->rx_head,
+                                       &lp->rx_tail,
+                                       &lp->chan_state);
+       if (hv_err)
+               return ldc_abort(lp);
+
+       if (lp->chan_state == LDC_CHANNEL_DOWN ||
+           lp->chan_state == LDC_CHANNEL_RESETTING)
+               return -ECONNRESET;
+
+       if (lp->rx_head == lp->rx_tail)
+               return 0;
+
+       first_frag = NULL;
+       copied = err = 0;
+       new = lp->rx_head;
+       while (1) {
+               struct ldc_packet *p;
+               int pkt_len;
+
+               BUG_ON(new == lp->rx_tail);
+               p = lp->rx_base + (new / LDC_PACKET_SIZE);
+
+               ldcdbg(RX, "RX read pkt[%02x:%02x:%02x:%02x:%08x:%08x] "
+                      "rcv_nxt[%08x]\n",
+                      p->type,
+                      p->stype,
+                      p->ctrl,
+                      p->env,
+                      p->seqid,
+                      p->u.r.ackid,
+                      lp->rcv_nxt);
+
+               if (unlikely(!rx_seq_ok(lp, p->seqid))) {
+                       err = rx_bad_seq(lp, p, first_frag);
+                       copied = 0;
+                       break;
+               }
+
+               if (p->type & LDC_CTRL) {
+                       err = process_control_frame(lp, p);
+                       if (err < 0)
+                               break;
+                       err = 0;
+               }
+
+               lp->rcv_nxt = p->seqid;
+
+               if (!(p->type & LDC_DATA)) {
+                       new = rx_advance(lp, new);
+                       goto no_data;
+               }
+               if (p->stype & (LDC_ACK | LDC_NACK)) {
+                       err = data_ack_nack(lp, p);
+                       if (err)
+                               break;
+               }
+               if (!(p->stype & LDC_INFO)) {
+                       new = rx_advance(lp, new);
+                       err = rx_set_head(lp, new);
+                       if (err)
+                               break;
+                       goto no_data;
+               }
+
+               pkt_len = p->env & LDC_LEN;
+
+               /* Every initial packet starts with the START bit set.
+                *
+                * Singleton packets will have both START+STOP set.
+                *
+                * Fragments will have START set in the first frame, STOP
+                * set in the last frame, and neither bit set in middle
+                * frames of the packet.
+                *
+                * Therefore if we are at the beginning of a packet and
+                * we don't see START, or we are in the middle of a fragmented
+                * packet and do see START, we are unsynchronized and should
+                * flush the RX queue.
+                */
+               if ((first_frag == NULL && !(p->env & LDC_START)) ||
+                   (first_frag != NULL &&  (p->env & LDC_START))) {
+                       if (!first_frag)
+                               new = rx_advance(lp, new);
+
+                       err = rx_set_head(lp, new);
+                       if (err)
+                               break;
+
+                       if (!first_frag)
+                               goto no_data;
+               }
+               if (!first_frag)
+                       first_frag = p;
+
+               if (pkt_len > size - copied) {
+                       /* User didn't give us a big enough buffer,
+                        * what to do?  This is a pretty serious error.
+                        *
+                        * Since we haven't updated the RX ring head to
+                        * consume any of the packets, signal the error
+                        * to the user and just leave the RX ring alone.
+                        *
+                        * This seems the best behavior because this allows
+                        * a user of the LDC layer to start with a small
+                        * RX buffer for ldc_read() calls and use -EMSGSIZE
+                        * as a cue to enlarge it's read buffer.
+                        */
+                       err = -EMSGSIZE;
+                       break;
+               }
+
+               /* Ok, we are gonna eat this one.  */
+               new = rx_advance(lp, new);
+
+               memcpy(buf,
+                      (lp->cfg.mode == LDC_MODE_UNRELIABLE ?
+                       p->u.u_data : p->u.r.r_data), pkt_len);
+               buf += pkt_len;
+               copied += pkt_len;
+
+               if (p->env & LDC_STOP)
+                       break;
+
+no_data:
+               if (new == lp->rx_tail) {
+                       err = rx_data_wait(lp, new);
+                       if (err)
+                               break;
+               }
+       }
+
+       if (!err)
+               err = rx_set_head(lp, new);
+
+       if (err && first_frag)
+               lp->rcv_nxt = first_frag->seqid - 1;
+
+       if (!err) {
+               err = copied;
+               if (err > 0 && lp->cfg.mode != LDC_MODE_UNRELIABLE)
+                       send_data_ack(lp);
+       }
+
+       return err;
+}
+
+static const struct ldc_mode_ops nonraw_ops = {
+       .write          =       write_nonraw,
+       .read           =       read_nonraw,
+};
+
+static int write_stream(struct ldc_channel *lp, const void *buf,
+                       unsigned int size)
+{
+       if (size > lp->cfg.mtu)
+               size = lp->cfg.mtu;
+       return write_nonraw(lp, buf, size);
+}
+
+static int read_stream(struct ldc_channel *lp, void *buf, unsigned int size)
+{
+       if (!lp->mssbuf_len) {
+               int err = read_nonraw(lp, lp->mssbuf, lp->cfg.mtu);
+               if (err < 0)
+                       return err;
+
+               lp->mssbuf_len = err;
+               lp->mssbuf_off = 0;
+       }
+
+       if (size > lp->mssbuf_len)
+               size = lp->mssbuf_len;
+       memcpy(buf, lp->mssbuf + lp->mssbuf_off, size);
+
+       lp->mssbuf_off += size;
+       lp->mssbuf_len -= size;
+
+       return size;
+}
+
+static const struct ldc_mode_ops stream_ops = {
+       .write          =       write_stream,
+       .read           =       read_stream,
+};
+
+int ldc_write(struct ldc_channel *lp, const void *buf, unsigned int size)
+{
+       unsigned long flags;
+       int err;
+
+       if (!buf)
+               return -EINVAL;
+
+       if (!size)
+               return 0;
+
+       spin_lock_irqsave(&lp->lock, flags);
+
+       if (lp->hs_state != LDC_HS_COMPLETE)
+               err = -ENOTCONN;
+       else
+               err = lp->mops->write(lp, buf, size);
+
+       spin_unlock_irqrestore(&lp->lock, flags);
+
+       return err;
+}
+EXPORT_SYMBOL(ldc_write);
+
+int ldc_read(struct ldc_channel *lp, void *buf, unsigned int size)
+{
+       unsigned long flags;
+       int err;
+
+       if (!buf)
+               return -EINVAL;
+
+       if (!size)
+               return 0;
+
+       spin_lock_irqsave(&lp->lock, flags);
+
+       if (lp->hs_state != LDC_HS_COMPLETE)
+               err = -ENOTCONN;
+       else
+               err = lp->mops->read(lp, buf, size);
+
+       spin_unlock_irqrestore(&lp->lock, flags);
+
+       return err;
+}
+EXPORT_SYMBOL(ldc_read);
+
+static long arena_alloc(struct ldc_iommu *iommu, unsigned long npages)
+{
+       struct iommu_arena *arena = &iommu->arena;
+       unsigned long n, i, start, end, limit;
+       int pass;
+
+       limit = arena->limit;
+       start = arena->hint;
+       pass = 0;
+
+again:
+       n = find_next_zero_bit(arena->map, limit, start);
+       end = n + npages;
+       if (unlikely(end >= limit)) {
+               if (likely(pass < 1)) {
+                       limit = start;
+                       start = 0;
+                       pass++;
+                       goto again;
+               } else {
+                       /* Scanned the whole thing, give up. */
+                       return -1;
+               }
+       }
+
+       for (i = n; i < end; i++) {
+               if (test_bit(i, arena->map)) {
+                       start = i + 1;
+                       goto again;
+               }
+       }
+
+       for (i = n; i < end; i++)
+               __set_bit(i, arena->map);
+
+       arena->hint = end;
+
+       return n;
+}
+
+#define COOKIE_PGSZ_CODE       0xf000000000000000ULL
+#define COOKIE_PGSZ_CODE_SHIFT 60ULL
+
+static u64 pagesize_code(void)
+{
+       switch (PAGE_SIZE) {
+       default:
+       case (8ULL * 1024ULL):
+               return 0;
+       case (64ULL * 1024ULL):
+               return 1;
+       case (512ULL * 1024ULL):
+               return 2;
+       case (4ULL * 1024ULL * 1024ULL):
+               return 3;
+       case (32ULL * 1024ULL * 1024ULL):
+               return 4;
+       case (256ULL * 1024ULL * 1024ULL):
+               return 5;
+       }
+}
+
+static u64 make_cookie(u64 index, u64 pgsz_code, u64 page_offset)
+{
+       return ((pgsz_code << COOKIE_PGSZ_CODE_SHIFT) |
+               (index << PAGE_SHIFT) |
+               page_offset);
+}
+
+static u64 cookie_to_index(u64 cookie, unsigned long *shift)
+{
+       u64 szcode = cookie >> COOKIE_PGSZ_CODE_SHIFT;
+
+       cookie &= ~COOKIE_PGSZ_CODE;
+
+       *shift = szcode * 3;
+
+       return (cookie >> (13ULL + (szcode * 3ULL)));
+}
+
+static struct ldc_mtable_entry *alloc_npages(struct ldc_iommu *iommu,
+                                            unsigned long npages)
+{
+       long entry;
+
+       entry = arena_alloc(iommu, npages);
+       if (unlikely(entry < 0))
+               return NULL;
+
+       return iommu->page_table + entry;
+}
+
+static u64 perm_to_mte(unsigned int map_perm)
+{
+       u64 mte_base;
+
+       mte_base = pagesize_code();
+
+       if (map_perm & LDC_MAP_SHADOW) {
+               if (map_perm & LDC_MAP_R)
+                       mte_base |= LDC_MTE_COPY_R;
+               if (map_perm & LDC_MAP_W)
+                       mte_base |= LDC_MTE_COPY_W;
+       }
+       if (map_perm & LDC_MAP_DIRECT) {
+               if (map_perm & LDC_MAP_R)
+                       mte_base |= LDC_MTE_READ;
+               if (map_perm & LDC_MAP_W)
+                       mte_base |= LDC_MTE_WRITE;
+               if (map_perm & LDC_MAP_X)
+                       mte_base |= LDC_MTE_EXEC;
+       }
+       if (map_perm & LDC_MAP_IO) {
+               if (map_perm & LDC_MAP_R)
+                       mte_base |= LDC_MTE_IOMMU_R;
+               if (map_perm & LDC_MAP_W)
+                       mte_base |= LDC_MTE_IOMMU_W;
+       }
+
+       return mte_base;
+}
+
+static int pages_in_region(unsigned long base, long len)
+{
+       int count = 0;
+
+       do {
+               unsigned long new = (base + PAGE_SIZE) & PAGE_MASK;
+
+               len -= (new - base);
+               base = new;
+               count++;
+       } while (len > 0);
+
+       return count;
+}
+
+struct cookie_state {
+       struct ldc_mtable_entry         *page_table;
+       struct ldc_trans_cookie         *cookies;
+       u64                             mte_base;
+       u64                             prev_cookie;
+       u32                             pte_idx;
+       u32                             nc;
+};
+
+static void fill_cookies(struct cookie_state *sp, unsigned long pa,
+                        unsigned long off, unsigned long len)
+{
+       do {
+               unsigned long tlen, new = pa + PAGE_SIZE;
+               u64 this_cookie;
+
+               sp->page_table[sp->pte_idx].mte = sp->mte_base | pa;
+
+               tlen = PAGE_SIZE;
+               if (off)
+                       tlen = PAGE_SIZE - off;
+               if (tlen > len)
+                       tlen = len;
+
+               this_cookie = make_cookie(sp->pte_idx,
+                                         pagesize_code(), off);
+
+               off = 0;
+
+               if (this_cookie == sp->prev_cookie) {
+                       sp->cookies[sp->nc - 1].cookie_size += tlen;
+               } else {
+                       sp->cookies[sp->nc].cookie_addr = this_cookie;
+                       sp->cookies[sp->nc].cookie_size = tlen;
+                       sp->nc++;
+               }
+               sp->prev_cookie = this_cookie + tlen;
+
+               sp->pte_idx++;
+
+               len -= tlen;
+               pa = new;
+       } while (len > 0);
+}
+
+static int sg_count_one(struct scatterlist *sg)
+{
+       unsigned long base = page_to_pfn(sg->page) << PAGE_SHIFT;
+       long len = sg->length;
+
+       if ((sg->offset | len) & (8UL - 1))
+               return -EFAULT;
+
+       return pages_in_region(base + sg->offset, len);
+}
+
+static int sg_count_pages(struct scatterlist *sg, int num_sg)
+{
+       int count;
+       int i;
+
+       count = 0;
+       for (i = 0; i < num_sg; i++) {
+               int err = sg_count_one(sg + i);
+               if (err < 0)
+                       return err;
+               count += err;
+       }
+
+       return count;
+}
+
+int ldc_map_sg(struct ldc_channel *lp,
+              struct scatterlist *sg, int num_sg,
+              struct ldc_trans_cookie *cookies, int ncookies,
+              unsigned int map_perm)
+{
+       unsigned long i, npages, flags;
+       struct ldc_mtable_entry *base;
+       struct cookie_state state;
+       struct ldc_iommu *iommu;
+       int err;
+
+       if (map_perm & ~LDC_MAP_ALL)
+               return -EINVAL;
+
+       err = sg_count_pages(sg, num_sg);
+       if (err < 0)
+               return err;
+
+       npages = err;
+       if (err > ncookies)
+               return -EMSGSIZE;
+
+       iommu = &lp->iommu;
+
+       spin_lock_irqsave(&iommu->lock, flags);
+       base = alloc_npages(iommu, npages);
+       spin_unlock_irqrestore(&iommu->lock, flags);
+
+       if (!base)
+               return -ENOMEM;
+
+       state.page_table = iommu->page_table;
+       state.cookies = cookies;
+       state.mte_base = perm_to_mte(map_perm);
+       state.prev_cookie = ~(u64)0;
+       state.pte_idx = (base - iommu->page_table);
+       state.nc = 0;
+
+       for (i = 0; i < num_sg; i++)
+               fill_cookies(&state, page_to_pfn(sg[i].page) << PAGE_SHIFT,
+                            sg[i].offset, sg[i].length);
+
+       return state.nc;
+}
+EXPORT_SYMBOL(ldc_map_sg);
+
+int ldc_map_single(struct ldc_channel *lp,
+                  void *buf, unsigned int len,
+                  struct ldc_trans_cookie *cookies, int ncookies,
+                  unsigned int map_perm)
+{
+       unsigned long npages, pa, flags;
+       struct ldc_mtable_entry *base;
+       struct cookie_state state;
+       struct ldc_iommu *iommu;
+
+       if ((map_perm & ~LDC_MAP_ALL) || (ncookies < 1))
+               return -EINVAL;
+
+       pa = __pa(buf);
+       if ((pa | len) & (8UL - 1))
+               return -EFAULT;
+
+       npages = pages_in_region(pa, len);
+
+       iommu = &lp->iommu;
+
+       spin_lock_irqsave(&iommu->lock, flags);
+       base = alloc_npages(iommu, npages);
+       spin_unlock_irqrestore(&iommu->lock, flags);
+
+       if (!base)
+               return -ENOMEM;
+
+       state.page_table = iommu->page_table;
+       state.cookies = cookies;
+       state.mte_base = perm_to_mte(map_perm);
+       state.prev_cookie = ~(u64)0;
+       state.pte_idx = (base - iommu->page_table);
+       state.nc = 0;
+       fill_cookies(&state, (pa & PAGE_MASK), (pa & ~PAGE_MASK), len);
+       BUG_ON(state.nc != 1);
+
+       return state.nc;
+}
+EXPORT_SYMBOL(ldc_map_single);
+
+static void free_npages(unsigned long id, struct ldc_iommu *iommu,
+                       u64 cookie, u64 size)
+{
+       struct iommu_arena *arena = &iommu->arena;
+       unsigned long i, shift, index, npages;
+       struct ldc_mtable_entry *base;
+
+       npages = PAGE_ALIGN(((cookie & ~PAGE_MASK) + size)) >> PAGE_SHIFT;
+       index = cookie_to_index(cookie, &shift);
+       base = iommu->page_table + index;
+
+       BUG_ON(index > arena->limit ||
+              (index + npages) > arena->limit);
+
+       for (i = 0; i < npages; i++) {
+               if (base->cookie)
+                       sun4v_ldc_revoke(id, cookie + (i << shift),
+                                        base->cookie);
+               base->mte = 0;
+               __clear_bit(index + i, arena->map);
+       }
+}
+
+void ldc_unmap(struct ldc_channel *lp, struct ldc_trans_cookie *cookies,
+              int ncookies)
+{
+       struct ldc_iommu *iommu = &lp->iommu;
+       unsigned long flags;
+       int i;
+
+       spin_lock_irqsave(&iommu->lock, flags);
+       for (i = 0; i < ncookies; i++) {
+               u64 addr = cookies[i].cookie_addr;
+               u64 size = cookies[i].cookie_size;
+
+               free_npages(lp->id, iommu, addr, size);
+       }
+       spin_unlock_irqrestore(&iommu->lock, flags);
+}
+EXPORT_SYMBOL(ldc_unmap);
+
+int ldc_copy(struct ldc_channel *lp, int copy_dir,
+            void *buf, unsigned int len, unsigned long offset,
+            struct ldc_trans_cookie *cookies, int ncookies)
+{
+       unsigned int orig_len;
+       unsigned long ra;
+       int i;
+
+       if (copy_dir != LDC_COPY_IN && copy_dir != LDC_COPY_OUT) {
+               printk(KERN_ERR PFX "ldc_copy: ID[%lu] Bad copy_dir[%d]\n",
+                      lp->id, copy_dir);
+               return -EINVAL;
+       }
+
+       ra = __pa(buf);
+       if ((ra | len | offset) & (8UL - 1)) {
+               printk(KERN_ERR PFX "ldc_copy: ID[%lu] Unaligned buffer "
+                      "ra[%lx] len[%x] offset[%lx]\n",
+                      lp->id, ra, len, offset);
+               return -EFAULT;
+       }
+
+       if (lp->hs_state != LDC_HS_COMPLETE ||
+           (lp->flags & LDC_FLAG_RESET)) {
+               printk(KERN_ERR PFX "ldc_copy: ID[%lu] Link down hs_state[%x] "
+                      "flags[%x]\n", lp->id, lp->hs_state, lp->flags);
+               return -ECONNRESET;
+       }
+
+       orig_len = len;
+       for (i = 0; i < ncookies; i++) {
+               unsigned long cookie_raddr = cookies[i].cookie_addr;
+               unsigned long this_len = cookies[i].cookie_size;
+               unsigned long actual_len;
+
+               if (unlikely(offset)) {
+                       unsigned long this_off = offset;
+
+                       if (this_off > this_len)
+                               this_off = this_len;
+
+                       offset -= this_off;
+                       this_len -= this_off;
+                       if (!this_len)
+                               continue;
+                       cookie_raddr += this_off;
+               }
+
+               if (this_len > len)
+                       this_len = len;
+
+               while (1) {
+                       unsigned long hv_err;
+
+                       hv_err = sun4v_ldc_copy(lp->id, copy_dir,
+                                               cookie_raddr, ra,
+                                               this_len, &actual_len);
+                       if (unlikely(hv_err)) {
+                               printk(KERN_ERR PFX "ldc_copy: ID[%lu] "
+                                      "HV error %lu\n",
+                                      lp->id, hv_err);
+                               if (lp->hs_state != LDC_HS_COMPLETE ||
+                                   (lp->flags & LDC_FLAG_RESET))
+                                       return -ECONNRESET;
+                               else
+                                       return -EFAULT;
+                       }
+
+                       cookie_raddr += actual_len;
+                       ra += actual_len;
+                       len -= actual_len;
+                       if (actual_len == this_len)
+                               break;
+
+                       this_len -= actual_len;
+               }
+
+               if (!len)
+                       break;
+       }
+
+       /* It is caller policy what to do about short copies.
+        * For example, a networking driver can declare the
+        * packet a runt and drop it.
+        */
+
+       return orig_len - len;
+}
+EXPORT_SYMBOL(ldc_copy);
+
+void *ldc_alloc_exp_dring(struct ldc_channel *lp, unsigned int len,
+                         struct ldc_trans_cookie *cookies, int *ncookies,
+                         unsigned int map_perm)
+{
+       void *buf;
+       int err;
+
+       if (len & (8UL - 1))
+               return ERR_PTR(-EINVAL);
+
+       buf = kzalloc(len, GFP_KERNEL);
+       if (!buf)
+               return ERR_PTR(-ENOMEM);
+
+       err = ldc_map_single(lp, buf, len, cookies, *ncookies, map_perm);
+       if (err < 0) {
+               kfree(buf);
+               return ERR_PTR(err);
+       }
+       *ncookies = err;
+
+       return buf;
+}
+EXPORT_SYMBOL(ldc_alloc_exp_dring);
+
+void ldc_free_exp_dring(struct ldc_channel *lp, void *buf, unsigned int len,
+                       struct ldc_trans_cookie *cookies, int ncookies)
+{
+       ldc_unmap(lp, cookies, ncookies);
+       kfree(buf);
+}
+EXPORT_SYMBOL(ldc_free_exp_dring);
+
+static int __init ldc_init(void)
+{
+       unsigned long major, minor;
+       struct mdesc_handle *hp;
+       const u64 *v;
+       u64 mp;
+
+       hp = mdesc_grab();
+       if (!hp)
+               return -ENODEV;
+
+       mp = mdesc_node_by_name(hp, MDESC_NODE_NULL, "platform");
+       if (mp == MDESC_NODE_NULL)
+               return -ENODEV;
+
+       v = mdesc_get_property(hp, mp, "domaining-enabled", NULL);
+       if (!v)
+               return -ENODEV;
+
+       major = 1;
+       minor = 0;
+       if (sun4v_hvapi_register(HV_GRP_LDOM, major, &minor)) {
+               printk(KERN_INFO PFX "Could not register LDOM hvapi.\n");
+               return -ENODEV;
+       }
+
+       printk(KERN_INFO "%s", version);
+
+       if (!*v) {
+               printk(KERN_INFO PFX "Domaining disabled.\n");
+               return -ENODEV;
+       }
+       ldom_domaining_enabled = 1;
+
+       return 0;
+}
+
+core_initcall(ldc_init);
index f0e16045fb1693f0f8ba9e8e507413833aa05b9f..62a389793949bdda7ff77aa1e4db1b86b0df4800 100644 (file)
@@ -6,6 +6,9 @@
 #include <linux/types.h>
 #include <linux/bootmem.h>
 #include <linux/log2.h>
+#include <linux/list.h>
+#include <linux/slab.h>
+#include <linux/mm.h>
 
 #include <asm/hypervisor.h>
 #include <asm/mdesc.h>
@@ -29,7 +32,7 @@ struct mdesc_hdr {
        u32     node_sz; /* node block size */
        u32     name_sz; /* name block size */
        u32     data_sz; /* data block size */
-};
+} __attribute__((aligned(16)));
 
 struct mdesc_elem {
        u8      tag;
@@ -53,306 +56,402 @@ struct mdesc_elem {
        } d;
 };
 
-static struct mdesc_hdr *main_mdesc;
-static struct mdesc_node *allnodes;
-
-static struct mdesc_node *allnodes_tail;
-static unsigned int unique_id;
+struct mdesc_mem_ops {
+       struct mdesc_handle *(*alloc)(unsigned int mdesc_size);
+       void (*free)(struct mdesc_handle *handle);
+};
 
-static struct mdesc_node **mdesc_hash;
-static unsigned int mdesc_hash_size;
+struct mdesc_handle {
+       struct list_head        list;
+       struct mdesc_mem_ops    *mops;
+       void                    *self_base;
+       atomic_t                refcnt;
+       unsigned int            handle_size;
+       struct mdesc_hdr        mdesc;
+};
 
-static inline unsigned int node_hashfn(u64 node)
+static void mdesc_handle_init(struct mdesc_handle *hp,
+                             unsigned int handle_size,
+                             void *base)
 {
-       return ((unsigned int) (node ^ (node >> 8) ^ (node >> 16)))
-               & (mdesc_hash_size - 1);
+       BUG_ON(((unsigned long)&hp->mdesc) & (16UL - 1));
+
+       memset(hp, 0, handle_size);
+       INIT_LIST_HEAD(&hp->list);
+       hp->self_base = base;
+       atomic_set(&hp->refcnt, 1);
+       hp->handle_size = handle_size;
 }
 
-static inline void hash_node(struct mdesc_node *mp)
+static struct mdesc_handle *mdesc_bootmem_alloc(unsigned int mdesc_size)
 {
-       struct mdesc_node **head = &mdesc_hash[node_hashfn(mp->node)];
+       struct mdesc_handle *hp;
+       unsigned int handle_size, alloc_size;
 
-       mp->hash_next = *head;
-       *head = mp;
+       handle_size = (sizeof(struct mdesc_handle) -
+                      sizeof(struct mdesc_hdr) +
+                      mdesc_size);
+       alloc_size = PAGE_ALIGN(handle_size);
 
-       if (allnodes_tail) {
-               allnodes_tail->allnodes_next = mp;
-               allnodes_tail = mp;
-       } else {
-               allnodes = allnodes_tail = mp;
-       }
+       hp = __alloc_bootmem(alloc_size, PAGE_SIZE, 0UL);
+       if (hp)
+               mdesc_handle_init(hp, handle_size, hp);
+
+       return hp;
 }
 
-static struct mdesc_node *find_node(u64 node)
+static void mdesc_bootmem_free(struct mdesc_handle *hp)
 {
-       struct mdesc_node *mp = mdesc_hash[node_hashfn(node)];
+       unsigned int alloc_size, handle_size = hp->handle_size;
+       unsigned long start, end;
+
+       BUG_ON(atomic_read(&hp->refcnt) != 0);
+       BUG_ON(!list_empty(&hp->list));
 
-       while (mp) {
-               if (mp->node == node)
-                       return mp;
+       alloc_size = PAGE_ALIGN(handle_size);
 
-               mp = mp->hash_next;
+       start = (unsigned long) hp;
+       end = start + alloc_size;
+
+       while (start < end) {
+               struct page *p;
+
+               p = virt_to_page(start);
+               ClearPageReserved(p);
+               __free_page(p);
+               start += PAGE_SIZE;
        }
-       return NULL;
 }
 
-struct property *md_find_property(const struct mdesc_node *mp,
-                                 const char *name,
-                                 int *lenp)
+static struct mdesc_mem_ops bootmem_mdesc_memops = {
+       .alloc = mdesc_bootmem_alloc,
+       .free  = mdesc_bootmem_free,
+};
+
+static struct mdesc_handle *mdesc_kmalloc(unsigned int mdesc_size)
 {
-       struct property *pp;
+       unsigned int handle_size;
+       void *base;
 
-       for (pp = mp->properties; pp != 0; pp = pp->next) {
-               if (strcasecmp(pp->name, name) == 0) {
-                       if (lenp)
-                               *lenp = pp->length;
-                       break;
-               }
+       handle_size = (sizeof(struct mdesc_handle) -
+                      sizeof(struct mdesc_hdr) +
+                      mdesc_size);
+
+       base = kmalloc(handle_size + 15, GFP_KERNEL);
+       if (base) {
+               struct mdesc_handle *hp;
+               unsigned long addr;
+
+               addr = (unsigned long)base;
+               addr = (addr + 15UL) & ~15UL;
+               hp = (struct mdesc_handle *) addr;
+
+               mdesc_handle_init(hp, handle_size, base);
+               return hp;
        }
-       return pp;
+
+       return NULL;
 }
-EXPORT_SYMBOL(md_find_property);
 
-/*
- * Find a property with a given name for a given node
- * and return the value.
- */
-const void *md_get_property(const struct mdesc_node *mp, const char *name,
-                           int *lenp)
+static void mdesc_kfree(struct mdesc_handle *hp)
 {
-       struct property *pp = md_find_property(mp, name, lenp);
-       return pp ? pp->value : NULL;
+       BUG_ON(atomic_read(&hp->refcnt) != 0);
+       BUG_ON(!list_empty(&hp->list));
+
+       kfree(hp->self_base);
 }
-EXPORT_SYMBOL(md_get_property);
 
-struct mdesc_node *md_find_node_by_name(struct mdesc_node *from,
-                                       const char *name)
+static struct mdesc_mem_ops kmalloc_mdesc_memops = {
+       .alloc = mdesc_kmalloc,
+       .free  = mdesc_kfree,
+};
+
+static struct mdesc_handle *mdesc_alloc(unsigned int mdesc_size,
+                                       struct mdesc_mem_ops *mops)
 {
-       struct mdesc_node *mp;
+       struct mdesc_handle *hp = mops->alloc(mdesc_size);
 
-       mp = from ? from->allnodes_next : allnodes;
-       for (; mp != NULL; mp = mp->allnodes_next) {
-               if (strcmp(mp->name, name) == 0)
-                       break;
-       }
-       return mp;
-}
-EXPORT_SYMBOL(md_find_node_by_name);
+       if (hp)
+               hp->mops = mops;
 
-static unsigned int mdesc_early_allocated;
+       return hp;
+}
 
-static void * __init mdesc_early_alloc(unsigned long size)
+static void mdesc_free(struct mdesc_handle *hp)
 {
-       void *ret;
+       hp->mops->free(hp);
+}
 
-       ret = __alloc_bootmem(size, SMP_CACHE_BYTES, 0UL);
-       if (ret == NULL) {
-               prom_printf("MDESC: alloc of %lu bytes failed.\n", size);
-               prom_halt();
-       }
+static struct mdesc_handle *cur_mdesc;
+static LIST_HEAD(mdesc_zombie_list);
+static DEFINE_SPINLOCK(mdesc_lock);
 
-       memset(ret, 0, size);
+struct mdesc_handle *mdesc_grab(void)
+{
+       struct mdesc_handle *hp;
+       unsigned long flags;
 
-       mdesc_early_allocated += size;
+       spin_lock_irqsave(&mdesc_lock, flags);
+       hp = cur_mdesc;
+       if (hp)
+               atomic_inc(&hp->refcnt);
+       spin_unlock_irqrestore(&mdesc_lock, flags);
 
-       return ret;
+       return hp;
 }
+EXPORT_SYMBOL(mdesc_grab);
 
-static unsigned int __init count_arcs(struct mdesc_elem *ep)
+void mdesc_release(struct mdesc_handle *hp)
 {
-       unsigned int ret = 0;
+       unsigned long flags;
 
-       ep++;
-       while (ep->tag != MD_NODE_END) {
-               if (ep->tag == MD_PROP_ARC)
-                       ret++;
-               ep++;
+       spin_lock_irqsave(&mdesc_lock, flags);
+       if (atomic_dec_and_test(&hp->refcnt)) {
+               list_del_init(&hp->list);
+               hp->mops->free(hp);
        }
-       return ret;
+       spin_unlock_irqrestore(&mdesc_lock, flags);
 }
+EXPORT_SYMBOL(mdesc_release);
 
-static void __init mdesc_node_alloc(u64 node, struct mdesc_elem *ep, const char *names)
+static void do_mdesc_update(struct work_struct *work)
 {
-       unsigned int num_arcs = count_arcs(ep);
-       struct mdesc_node *mp;
+       unsigned long len, real_len, status;
+       struct mdesc_handle *hp, *orig_hp;
+       unsigned long flags;
+
+       (void) sun4v_mach_desc(0UL, 0UL, &len);
+
+       hp = mdesc_alloc(len, &kmalloc_mdesc_memops);
+       if (!hp) {
+               printk(KERN_ERR "MD: mdesc alloc fails\n");
+               return;
+       }
+
+       status = sun4v_mach_desc(__pa(&hp->mdesc), len, &real_len);
+       if (status != HV_EOK || real_len > len) {
+               printk(KERN_ERR "MD: mdesc reread fails with %lu\n",
+                      status);
+               atomic_dec(&hp->refcnt);
+               mdesc_free(hp);
+               return;
+       }
 
-       mp = mdesc_early_alloc(sizeof(*mp) +
-                              (num_arcs * sizeof(struct mdesc_arc)));
-       mp->name = names + ep->name_offset;
-       mp->node = node;
-       mp->unique_id = unique_id++;
-       mp->num_arcs = num_arcs;
+       spin_lock_irqsave(&mdesc_lock, flags);
+       orig_hp = cur_mdesc;
+       cur_mdesc = hp;
 
-       hash_node(mp);
+       if (atomic_dec_and_test(&orig_hp->refcnt))
+               mdesc_free(orig_hp);
+       else
+               list_add(&orig_hp->list, &mdesc_zombie_list);
+       spin_unlock_irqrestore(&mdesc_lock, flags);
 }
 
-static inline struct mdesc_elem *node_block(struct mdesc_hdr *mdesc)
+static DECLARE_WORK(mdesc_update_work, do_mdesc_update);
+
+void mdesc_update(void)
+{
+       schedule_work(&mdesc_update_work);
+}
+
+static struct mdesc_elem *node_block(struct mdesc_hdr *mdesc)
 {
        return (struct mdesc_elem *) (mdesc + 1);
 }
 
-static inline void *name_block(struct mdesc_hdr *mdesc)
+static void *name_block(struct mdesc_hdr *mdesc)
 {
        return ((void *) node_block(mdesc)) + mdesc->node_sz;
 }
 
-static inline void *data_block(struct mdesc_hdr *mdesc)
+static void *data_block(struct mdesc_hdr *mdesc)
 {
        return ((void *) name_block(mdesc)) + mdesc->name_sz;
 }
 
-/* In order to avoid recursion (the graph can be very deep) we use a
- * two pass algorithm.  First we allocate all the nodes and hash them.
- * Then we iterate over each node, filling in the arcs and properties.
- */
-static void __init build_all_nodes(struct mdesc_hdr *mdesc)
+u64 mdesc_node_by_name(struct mdesc_handle *hp,
+                      u64 from_node, const char *name)
 {
-       struct mdesc_elem *start, *ep;
-       struct mdesc_node *mp;
-       const char *names;
-       void *data;
-       u64 last_node;
-
-       start = ep = node_block(mdesc);
-       last_node = mdesc->node_sz / 16;
+       struct mdesc_elem *ep = node_block(&hp->mdesc);
+       const char *names = name_block(&hp->mdesc);
+       u64 last_node = hp->mdesc.node_sz / 16;
+       u64 ret;
+
+       if (from_node == MDESC_NODE_NULL)
+               from_node = 0;
+
+       if (from_node >= last_node)
+               return MDESC_NODE_NULL;
+
+       ret = ep[from_node].d.val;
+       while (ret < last_node) {
+               if (ep[ret].tag != MD_NODE)
+                       return MDESC_NODE_NULL;
+               if (!strcmp(names + ep[ret].name_offset, name))
+                       break;
+               ret = ep[ret].d.val;
+       }
+       if (ret >= last_node)
+               ret = MDESC_NODE_NULL;
+       return ret;
+}
+EXPORT_SYMBOL(mdesc_node_by_name);
 
-       names = name_block(mdesc);
+const void *mdesc_get_property(struct mdesc_handle *hp, u64 node,
+                              const char *name, int *lenp)
+{
+       const char *names = name_block(&hp->mdesc);
+       u64 last_node = hp->mdesc.node_sz / 16;
+       void *data = data_block(&hp->mdesc);
+       struct mdesc_elem *ep;
 
-       while (1) {
-               u64 node = ep - start;
+       if (node == MDESC_NODE_NULL || node >= last_node)
+               return NULL;
 
-               if (ep->tag == MD_LIST_END)
+       ep = node_block(&hp->mdesc) + node;
+       ep++;
+       for (; ep->tag != MD_NODE_END; ep++) {
+               void *val = NULL;
+               int len = 0;
+
+               switch (ep->tag) {
+               case MD_PROP_VAL:
+                       val = &ep->d.val;
+                       len = 8;
                        break;
 
-               if (ep->tag != MD_NODE) {
-                       prom_printf("MDESC: Inconsistent element list.\n");
-                       prom_halt();
-               }
-
-               mdesc_node_alloc(node, ep, names);
+               case MD_PROP_STR:
+               case MD_PROP_DATA:
+                       val = data + ep->d.data.data_offset;
+                       len = ep->d.data.data_len;
+                       break;
 
-               if (ep->d.val >= last_node) {
-                       printk("MDESC: Warning, early break out of node scan.\n");
-                       printk("MDESC: Next node [%lu] last_node [%lu].\n",
-                              node, last_node);
+               default:
                        break;
                }
+               if (!val)
+                       continue;
 
-               ep = start + ep->d.val;
+               if (!strcmp(names + ep->name_offset, name)) {
+                       if (lenp)
+                               *lenp = len;
+                       return val;
+               }
        }
 
-       data = data_block(mdesc);
-       for (mp = allnodes; mp; mp = mp->allnodes_next) {
-               struct mdesc_elem *ep = start + mp->node;
-               struct property **link = &mp->properties;
-               unsigned int this_arc = 0;
-
-               ep++;
-               while (ep->tag != MD_NODE_END) {
-                       switch (ep->tag) {
-                       case MD_PROP_ARC: {
-                               struct mdesc_node *target;
-
-                               if (this_arc >= mp->num_arcs) {
-                                       prom_printf("MDESC: ARC overrun [%u:%u]\n",
-                                                   this_arc, mp->num_arcs);
-                                       prom_halt();
-                               }
-                               target = find_node(ep->d.val);
-                               if (!target) {
-                                       printk("MDESC: Warning, arc points to "
-                                              "missing node, ignoring.\n");
-                                       break;
-                               }
-                               mp->arcs[this_arc].name =
-                                       (names + ep->name_offset);
-                               mp->arcs[this_arc].arc = target;
-                               this_arc++;
-                               break;
-                       }
+       return NULL;
+}
+EXPORT_SYMBOL(mdesc_get_property);
 
-                       case MD_PROP_VAL:
-                       case MD_PROP_STR:
-                       case MD_PROP_DATA: {
-                               struct property *p = mdesc_early_alloc(sizeof(*p));
-
-                               p->unique_id = unique_id++;
-                               p->name = (char *) names + ep->name_offset;
-                               if (ep->tag == MD_PROP_VAL) {
-                                       p->value = &ep->d.val;
-                                       p->length = 8;
-                               } else {
-                                       p->value = data + ep->d.data.data_offset;
-                                       p->length = ep->d.data.data_len;
-                               }
-                               *link = p;
-                               link = &p->next;
-                               break;
-                       }
+u64 mdesc_next_arc(struct mdesc_handle *hp, u64 from, const char *arc_type)
+{
+       struct mdesc_elem *ep, *base = node_block(&hp->mdesc);
+       const char *names = name_block(&hp->mdesc);
+       u64 last_node = hp->mdesc.node_sz / 16;
 
-                       case MD_NOOP:
-                               break;
+       if (from == MDESC_NODE_NULL || from >= last_node)
+               return MDESC_NODE_NULL;
 
-                       default:
-                               printk("MDESC: Warning, ignoring unknown tag type %02x\n",
-                                      ep->tag);
-                       }
-                       ep++;
-               }
+       ep = base + from;
+
+       ep++;
+       for (; ep->tag != MD_NODE_END; ep++) {
+               if (ep->tag != MD_PROP_ARC)
+                       continue;
+
+               if (strcmp(names + ep->name_offset, arc_type))
+                       continue;
+
+               return ep - base;
        }
+
+       return MDESC_NODE_NULL;
 }
+EXPORT_SYMBOL(mdesc_next_arc);
 
-static unsigned int __init count_nodes(struct mdesc_hdr *mdesc)
+u64 mdesc_arc_target(struct mdesc_handle *hp, u64 arc)
 {
-       struct mdesc_elem *ep = node_block(mdesc);
-       struct mdesc_elem *end;
-       unsigned int cnt = 0;
-
-       end = ((void *)ep) + mdesc->node_sz;
-       while (ep < end) {
-               if (ep->tag == MD_NODE)
-                       cnt++;
-               ep++;
-       }
-       return cnt;
+       struct mdesc_elem *ep, *base = node_block(&hp->mdesc);
+
+       ep = base + arc;
+
+       return ep->d.val;
+}
+EXPORT_SYMBOL(mdesc_arc_target);
+
+const char *mdesc_node_name(struct mdesc_handle *hp, u64 node)
+{
+       struct mdesc_elem *ep, *base = node_block(&hp->mdesc);
+       const char *names = name_block(&hp->mdesc);
+       u64 last_node = hp->mdesc.node_sz / 16;
+
+       if (node == MDESC_NODE_NULL || node >= last_node)
+               return NULL;
+
+       ep = base + node;
+       if (ep->tag != MD_NODE)
+               return NULL;
+
+       return names + ep->name_offset;
 }
+EXPORT_SYMBOL(mdesc_node_name);
 
 static void __init report_platform_properties(void)
 {
-       struct mdesc_node *pn = md_find_node_by_name(NULL, "platform");
+       struct mdesc_handle *hp = mdesc_grab();
+       u64 pn = mdesc_node_by_name(hp, MDESC_NODE_NULL, "platform");
        const char *s;
        const u64 *v;
 
-       if (!pn) {
+       if (pn == MDESC_NODE_NULL) {
                prom_printf("No platform node in machine-description.\n");
                prom_halt();
        }
 
-       s = md_get_property(pn, "banner-name", NULL);
+       s = mdesc_get_property(hp, pn, "banner-name", NULL);
        printk("PLATFORM: banner-name [%s]\n", s);
-       s = md_get_property(pn, "name", NULL);
+       s = mdesc_get_property(hp, pn, "name", NULL);
        printk("PLATFORM: name [%s]\n", s);
 
-       v = md_get_property(pn, "hostid", NULL);
+       v = mdesc_get_property(hp, pn, "hostid", NULL);
        if (v)
                printk("PLATFORM: hostid [%08lx]\n", *v);
-       v = md_get_property(pn, "serial#", NULL);
+       v = mdesc_get_property(hp, pn, "serial#", NULL);
        if (v)
                printk("PLATFORM: serial# [%08lx]\n", *v);
-       v = md_get_property(pn, "stick-frequency", NULL);
+       v = mdesc_get_property(hp, pn, "stick-frequency", NULL);
        printk("PLATFORM: stick-frequency [%08lx]\n", *v);
-       v = md_get_property(pn, "mac-address", NULL);
+       v = mdesc_get_property(hp, pn, "mac-address", NULL);
        if (v)
                printk("PLATFORM: mac-address [%lx]\n", *v);
-       v = md_get_property(pn, "watchdog-resolution", NULL);
+       v = mdesc_get_property(hp, pn, "watchdog-resolution", NULL);
        if (v)
                printk("PLATFORM: watchdog-resolution [%lu ms]\n", *v);
-       v = md_get_property(pn, "watchdog-max-timeout", NULL);
+       v = mdesc_get_property(hp, pn, "watchdog-max-timeout", NULL);
        if (v)
                printk("PLATFORM: watchdog-max-timeout [%lu ms]\n", *v);
-       v = md_get_property(pn, "max-cpus", NULL);
+       v = mdesc_get_property(hp, pn, "max-cpus", NULL);
        if (v)
                printk("PLATFORM: max-cpus [%lu]\n", *v);
+
+#ifdef CONFIG_SMP
+       {
+               int max_cpu, i;
+
+               if (v) {
+                       max_cpu = *v;
+                       if (max_cpu > NR_CPUS)
+                               max_cpu = NR_CPUS;
+               } else {
+                       max_cpu = NR_CPUS;
+               }
+               for (i = 0; i < max_cpu; i++)
+                       cpu_set(i, cpu_possible_map);
+       }
+#endif
+
+       mdesc_release(hp);
 }
 
 static int inline find_in_proplist(const char *list, const char *match, int len)
@@ -369,15 +468,17 @@ static int inline find_in_proplist(const char *list, const char *match, int len)
        return 0;
 }
 
-static void __init fill_in_one_cache(cpuinfo_sparc *c, struct mdesc_node *mp)
+static void __devinit fill_in_one_cache(cpuinfo_sparc *c,
+                                       struct mdesc_handle *hp,
+                                       u64 mp)
 {
-       const u64 *level = md_get_property(mp, "level", NULL);
-       const u64 *size = md_get_property(mp, "size", NULL);
-       const u64 *line_size = md_get_property(mp, "line-size", NULL);
+       const u64 *level = mdesc_get_property(hp, mp, "level", NULL);
+       const u64 *size = mdesc_get_property(hp, mp, "size", NULL);
+       const u64 *line_size = mdesc_get_property(hp, mp, "line-size", NULL);
        const char *type;
        int type_len;
 
-       type = md_get_property(mp, "type", &type_len);
+       type = mdesc_get_property(hp, mp, "type", &type_len);
 
        switch (*level) {
        case 1:
@@ -400,48 +501,45 @@ static void __init fill_in_one_cache(cpuinfo_sparc *c, struct mdesc_node *mp)
        }
 
        if (*level == 1) {
-               unsigned int i;
-
-               for (i = 0; i < mp->num_arcs; i++) {
-                       struct mdesc_node *t = mp->arcs[i].arc;
+               u64 a;
 
-                       if (strcmp(mp->arcs[i].name, "fwd"))
-                               continue;
+               mdesc_for_each_arc(a, hp, mp, MDESC_ARC_TYPE_FWD) {
+                       u64 target = mdesc_arc_target(hp, a);
+                       const char *name = mdesc_node_name(hp, target);
 
-                       if (!strcmp(t->name, "cache"))
-                               fill_in_one_cache(c, t);
+                       if (!strcmp(name, "cache"))
+                               fill_in_one_cache(c, hp, target);
                }
        }
 }
 
-static void __init mark_core_ids(struct mdesc_node *mp, int core_id)
+static void __devinit mark_core_ids(struct mdesc_handle *hp, u64 mp,
+                                   int core_id)
 {
-       unsigned int i;
+       u64 a;
 
-       for (i = 0; i < mp->num_arcs; i++) {
-               struct mdesc_node *t = mp->arcs[i].arc;
+       mdesc_for_each_arc(a, hp, mp, MDESC_ARC_TYPE_BACK) {
+               u64 t = mdesc_arc_target(hp, a);
+               const char *name;
                const u64 *id;
 
-               if (strcmp(mp->arcs[i].name, "back"))
-                       continue;
-
-               if (!strcmp(t->name, "cpu")) {
-                       id = md_get_property(t, "id", NULL);
+               name = mdesc_node_name(hp, t);
+               if (!strcmp(name, "cpu")) {
+                       id = mdesc_get_property(hp, t, "id", NULL);
                        if (*id < NR_CPUS)
                                cpu_data(*id).core_id = core_id;
                } else {
-                       unsigned int j;
+                       u64 j;
 
-                       for (j = 0; j < t->num_arcs; j++) {
-                               struct mdesc_node *n = t->arcs[j].arc;
+                       mdesc_for_each_arc(j, hp, t, MDESC_ARC_TYPE_BACK) {
+                               u64 n = mdesc_arc_target(hp, j);
+                               const char *n_name;
 
-                               if (strcmp(t->arcs[j].name, "back"))
+                               n_name = mdesc_node_name(hp, n);
+                               if (strcmp(n_name, "cpu"))
                                        continue;
 
-                               if (strcmp(n->name, "cpu"))
-                                       continue;
-
-                               id = md_get_property(n, "id", NULL);
+                               id = mdesc_get_property(hp, n, "id", NULL);
                                if (*id < NR_CPUS)
                                        cpu_data(*id).core_id = core_id;
                        }
@@ -449,78 +547,81 @@ static void __init mark_core_ids(struct mdesc_node *mp, int core_id)
        }
 }
 
-static void __init set_core_ids(void)
+static void __devinit set_core_ids(struct mdesc_handle *hp)
 {
-       struct mdesc_node *mp;
        int idx;
+       u64 mp;
 
        idx = 1;
-       md_for_each_node_by_name(mp, "cache") {
-               const u64 *level = md_get_property(mp, "level", NULL);
+       mdesc_for_each_node_by_name(hp, mp, "cache") {
+               const u64 *level;
                const char *type;
                int len;
 
+               level = mdesc_get_property(hp, mp, "level", NULL);
                if (*level != 1)
                        continue;
 
-               type = md_get_property(mp, "type", &len);
+               type = mdesc_get_property(hp, mp, "type", &len);
                if (!find_in_proplist(type, "instn", len))
                        continue;
 
-               mark_core_ids(mp, idx);
+               mark_core_ids(hp, mp, idx);
 
                idx++;
        }
 }
 
-static void __init mark_proc_ids(struct mdesc_node *mp, int proc_id)
+static void __devinit mark_proc_ids(struct mdesc_handle *hp, u64 mp,
+                                   int proc_id)
 {
-       int i;
+       u64 a;
 
-       for (i = 0; i < mp->num_arcs; i++) {
-               struct mdesc_node *t = mp->arcs[i].arc;
+       mdesc_for_each_arc(a, hp, mp, MDESC_ARC_TYPE_BACK) {
+               u64 t = mdesc_arc_target(hp, a);
+               const char *name;
                const u64 *id;
 
-               if (strcmp(mp->arcs[i].name, "back"))
-                       continue;
-
-               if (strcmp(t->name, "cpu"))
+               name = mdesc_node_name(hp, t);
+               if (strcmp(name, "cpu"))
                        continue;
 
-               id = md_get_property(t, "id", NULL);
+               id = mdesc_get_property(hp, t, "id", NULL);
                if (*id < NR_CPUS)
                        cpu_data(*id).proc_id = proc_id;
        }
 }
 
-static void __init __set_proc_ids(const char *exec_unit_name)
+static void __devinit __set_proc_ids(struct mdesc_handle *hp,
+                                    const char *exec_unit_name)
 {
-       struct mdesc_node *mp;
        int idx;
+       u64 mp;
 
        idx = 0;
-       md_for_each_node_by_name(mp, exec_unit_name) {
+       mdesc_for_each_node_by_name(hp, mp, exec_unit_name) {
                const char *type;
                int len;
 
-               type = md_get_property(mp, "type", &len);
+               type = mdesc_get_property(hp, mp, "type", &len);
                if (!find_in_proplist(type, "int", len) &&
                    !find_in_proplist(type, "integer", len))
                        continue;
 
-               mark_proc_ids(mp, idx);
+               mark_proc_ids(hp, mp, idx);
 
                idx++;
        }
 }
 
-static void __init set_proc_ids(void)
+static void __devinit set_proc_ids(struct mdesc_handle *hp)
 {
-       __set_proc_ids("exec_unit");
-       __set_proc_ids("exec-unit");
+       __set_proc_ids(hp, "exec_unit");
+       __set_proc_ids(hp, "exec-unit");
 }
 
-static void __init get_one_mondo_bits(const u64 *p, unsigned int *mask, unsigned char def)
+static void __devinit get_one_mondo_bits(const u64 *p, unsigned int *mask,
+                                        unsigned char def)
 {
        u64 val;
 
@@ -538,35 +639,37 @@ use_default:
        *mask = ((1U << def) * 64U) - 1U;
 }
 
-static void __init get_mondo_data(struct mdesc_node *mp, struct trap_per_cpu *tb)
+static void __devinit get_mondo_data(struct mdesc_handle *hp, u64 mp,
+                                    struct trap_per_cpu *tb)
 {
        const u64 *val;
 
-       val = md_get_property(mp, "q-cpu-mondo-#bits", NULL);
+       val = mdesc_get_property(hp, mp, "q-cpu-mondo-#bits", NULL);
        get_one_mondo_bits(val, &tb->cpu_mondo_qmask, 7);
 
-       val = md_get_property(mp, "q-dev-mondo-#bits", NULL);
+       val = mdesc_get_property(hp, mp, "q-dev-mondo-#bits", NULL);
        get_one_mondo_bits(val, &tb->dev_mondo_qmask, 7);
 
-       val = md_get_property(mp, "q-resumable-#bits", NULL);
+       val = mdesc_get_property(hp, mp, "q-resumable-#bits", NULL);
        get_one_mondo_bits(val, &tb->resum_qmask, 6);
 
-       val = md_get_property(mp, "q-nonresumable-#bits", NULL);
+       val = mdesc_get_property(hp, mp, "q-nonresumable-#bits", NULL);
        get_one_mondo_bits(val, &tb->nonresum_qmask, 2);
 }
 
-static void __init mdesc_fill_in_cpu_data(void)
+void __devinit mdesc_fill_in_cpu_data(cpumask_t mask)
 {
-       struct mdesc_node *mp;
+       struct mdesc_handle *hp = mdesc_grab();
+       u64 mp;
 
        ncpus_probed = 0;
-       md_for_each_node_by_name(mp, "cpu") {
-               const u64 *id = md_get_property(mp, "id", NULL);
-               const u64 *cfreq = md_get_property(mp, "clock-frequency", NULL);
+       mdesc_for_each_node_by_name(hp, mp, "cpu") {
+               const u64 *id = mdesc_get_property(hp, mp, "id", NULL);
+               const u64 *cfreq = mdesc_get_property(hp, mp, "clock-frequency", NULL);
                struct trap_per_cpu *tb;
                cpuinfo_sparc *c;
-               unsigned int i;
                int cpuid;
+               u64 a;
 
                ncpus_probed++;
 
@@ -575,6 +678,8 @@ static void __init mdesc_fill_in_cpu_data(void)
 #ifdef CONFIG_SMP
                if (cpuid >= NR_CPUS)
                        continue;
+               if (!cpu_isset(cpuid, mask))
+                       continue;
 #else
                /* On uniprocessor we only want the values for the
                 * real physical cpu the kernel booted onto, however
@@ -589,35 +694,30 @@ static void __init mdesc_fill_in_cpu_data(void)
                c->clock_tick = *cfreq;
 
                tb = &trap_block[cpuid];
-               get_mondo_data(mp, tb);
-
-               for (i = 0; i < mp->num_arcs; i++) {
-                       struct mdesc_node *t = mp->arcs[i].arc;
-                       unsigned int j;
+               get_mondo_data(hp, mp, tb);
 
-                       if (strcmp(mp->arcs[i].name, "fwd"))
-                               continue;
+               mdesc_for_each_arc(a, hp, mp, MDESC_ARC_TYPE_FWD) {
+                       u64 j, t = mdesc_arc_target(hp, a);
+                       const char *t_name;
 
-                       if (!strcmp(t->name, "cache")) {
-                               fill_in_one_cache(c, t);
+                       t_name = mdesc_node_name(hp, t);
+                       if (!strcmp(t_name, "cache")) {
+                               fill_in_one_cache(c, hp, t);
                                continue;
                        }
 
-                       for (j = 0; j < t->num_arcs; j++) {
-                               struct mdesc_node *n;
+                       mdesc_for_each_arc(j, hp, t, MDESC_ARC_TYPE_FWD) {
+                               u64 n = mdesc_arc_target(hp, j);
+                               const char *n_name;
 
-                               n = t->arcs[j].arc;
-                               if (strcmp(t->arcs[j].name, "fwd"))
-                                       continue;
-
-                               if (!strcmp(n->name, "cache"))
-                                       fill_in_one_cache(c, n);
+                               n_name = mdesc_node_name(hp, n);
+                               if (!strcmp(n_name, "cache"))
+                                       fill_in_one_cache(c, hp, n);
                        }
                }
 
 #ifdef CONFIG_SMP
                cpu_set(cpuid, cpu_present_map);
-               cpu_set(cpuid, phys_cpu_present_map);
 #endif
 
                c->core_id = 0;
@@ -628,45 +728,43 @@ static void __init mdesc_fill_in_cpu_data(void)
        sparc64_multi_core = 1;
 #endif
 
-       set_core_ids();
-       set_proc_ids();
+       set_core_ids(hp);
+       set_proc_ids(hp);
 
        smp_fill_in_sib_core_maps();
+
+       mdesc_release(hp);
 }
 
 void __init sun4v_mdesc_init(void)
 {
+       struct mdesc_handle *hp;
        unsigned long len, real_len, status;
+       cpumask_t mask;
 
        (void) sun4v_mach_desc(0UL, 0UL, &len);
 
        printk("MDESC: Size is %lu bytes.\n", len);
 
-       main_mdesc = mdesc_early_alloc(len);
+       hp = mdesc_alloc(len, &bootmem_mdesc_memops);
+       if (hp == NULL) {
+               prom_printf("MDESC: alloc of %lu bytes failed.\n", len);
+               prom_halt();
+       }
 
-       status = sun4v_mach_desc(__pa(main_mdesc), len, &real_len);
+       status = sun4v_mach_desc(__pa(&hp->mdesc), len, &real_len);
        if (status != HV_EOK || real_len > len) {
                prom_printf("sun4v_mach_desc fails, err(%lu), "
                            "len(%lu), real_len(%lu)\n",
                            status, len, real_len);
+               mdesc_free(hp);
                prom_halt();
        }
 
-       len = count_nodes(main_mdesc);
-       printk("MDESC: %lu nodes.\n", len);
-
-       len = roundup_pow_of_two(len);
-
-       mdesc_hash = mdesc_early_alloc(len * sizeof(struct mdesc_node *));
-       mdesc_hash_size = len;
-
-       printk("MDESC: Hash size %lu entries.\n", len);
-
-       build_all_nodes(main_mdesc);
-
-       printk("MDESC: Built graph with %u bytes of memory.\n",
-              mdesc_early_allocated);
+       cur_mdesc = hp;
 
        report_platform_properties();
-       mdesc_fill_in_cpu_data();
+
+       cpus_setall(mask);
+       mdesc_fill_in_cpu_data(mask);
 }
index 5d6adea3967f32255da6bcbd59dc4cbf393c3660..8dd4294ad21ec0bcf0b3345d53f920efe999703c 100644 (file)
@@ -1,7 +1,6 @@
-/* $Id: power.c,v 1.10 2001/12/11 01:57:16 davem Exp $
- * power.c: Power management driver.
+/* power.c: Power management driver.
  *
- * Copyright (C) 1999 David S. Miller (davem@redhat.com)
+ * Copyright (C) 1999, 2007 David S. Miller (davem@davemloft.net)
  */
 
 #include <linux/kernel.h>
@@ -19,6 +18,7 @@
 #include <asm/prom.h>
 #include <asm/of_device.h>
 #include <asm/io.h>
+#include <asm/power.h>
 #include <asm/sstate.h>
 
 #include <linux/unistd.h>
  */
 int scons_pwroff = 1; 
 
-#ifdef CONFIG_PCI
-#include <linux/pci.h>
 static void __iomem *power_reg;
 
 static DECLARE_WAIT_QUEUE_HEAD(powerd_wait);
 static int button_pressed;
 
-static irqreturn_t power_handler(int irq, void *dev_id)
+void wake_up_powerd(void)
 {
        if (button_pressed == 0) {
                button_pressed = 1;
                wake_up(&powerd_wait);
        }
+}
+
+static irqreturn_t power_handler(int irq, void *dev_id)
+{
+       wake_up_powerd();
 
        /* FIXME: Check registers for status... */
        return IRQ_HANDLED;
 }
-#endif /* CONFIG_PCI */
 
 extern void machine_halt(void);
 extern void machine_alt_power_off(void);
@@ -56,19 +58,18 @@ void machine_power_off(void)
 {
        sstate_poweroff();
        if (!serial_console || scons_pwroff) {
-#ifdef CONFIG_PCI
                if (power_reg) {
                        /* Both register bits seem to have the
                         * same effect, so until I figure out
                         * what the difference is...
                         */
                        writel(AUXIO_PCIO_CPWR_OFF | AUXIO_PCIO_SPWR_OFF, power_reg);
-               } else
-#endif /* CONFIG_PCI */
+               } else {
                        if (poweroff_method != NULL) {
                                poweroff_method();
                                /* not reached */
                        }
+               }
        }
        machine_halt();
 }
@@ -76,7 +77,6 @@ void machine_power_off(void)
 void (*pm_power_off)(void) = machine_power_off;
 EXPORT_SYMBOL(pm_power_off);
 
-#ifdef CONFIG_PCI
 static int powerd(void *__unused)
 {
        static char *envp[] = { "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
@@ -86,7 +86,7 @@ static int powerd(void *__unused)
        daemonize("powerd");
 
        add_wait_queue(&powerd_wait, &wait);
-again:
+
        for (;;) {
                set_task_state(current, TASK_INTERRUPTIBLE);
                if (button_pressed)
@@ -100,16 +100,28 @@ again:
        /* Ok, down we go... */
        button_pressed = 0;
        if (kernel_execve("/sbin/shutdown", argv, envp) < 0) {
-               printk("powerd: shutdown execution failed\n");
-               add_wait_queue(&powerd_wait, &wait);
-               goto again;
+               printk(KERN_ERR "powerd: shutdown execution failed\n");
+               machine_power_off();
        }
        return 0;
 }
 
+int start_powerd(void)
+{
+       int err;
+
+       err = kernel_thread(powerd, NULL, CLONE_FS);
+       if (err < 0)
+               printk(KERN_ERR "power: Failed to start power daemon.\n");
+       else
+               printk(KERN_INFO "power: powerd running.\n");
+
+       return err;
+}
+
 static int __init has_button_interrupt(unsigned int irq, struct device_node *dp)
 {
-       if (irq == PCI_IRQ_NONE)
+       if (irq == 0xffffffff)
                return 0;
        if (!of_find_property(dp, "button", NULL))
                return 0;
@@ -130,17 +142,14 @@ static int __devinit power_probe(struct of_device *op, const struct of_device_id
        poweroff_method = machine_halt;  /* able to use the standard halt */
 
        if (has_button_interrupt(irq, op->node)) {
-               if (kernel_thread(powerd, NULL, CLONE_FS) < 0) {
-                       printk("Failed to start power daemon.\n");
+               if (start_powerd() < 0)
                        return 0;
-               }
-               printk("powerd running.\n");
 
                if (request_irq(irq,
                                power_handler, 0, "power", NULL) < 0)
-                       printk("power: Error, cannot register IRQ handler.\n");
+                       printk(KERN_ERR "power: Cannot setup IRQ handler.\n");
        } else {
-               printk("not using powerd.\n");
+               printk(KERN_INFO "power: Not using powerd.\n");
        }
 
        return 0;
@@ -164,4 +173,3 @@ void __init power_init(void)
        of_register_driver(&power_driver, &of_bus_type);
        return;
 }
-#endif /* CONFIG_PCI */
index f5f97e2c669c53d71a9429c9eeaa5f624e767a8a..93557507ec9f76d765783677b800152ef00de20a 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/compat.h>
 #include <linux/tick.h>
 #include <linux/init.h>
+#include <linux/cpu.h>
 
 #include <asm/oplib.h>
 #include <asm/uaccess.h>
@@ -49,7 +50,7 @@
 
 /* #define VERBOSE_SHOWREGS */
 
-static void sparc64_yield(void)
+static void sparc64_yield(int cpu)
 {
        if (tlb_type != hypervisor)
                return;
@@ -57,7 +58,7 @@ static void sparc64_yield(void)
        clear_thread_flag(TIF_POLLING_NRFLAG);
        smp_mb__after_clear_bit();
 
-       while (!need_resched()) {
+       while (!need_resched() && !cpu_is_offline(cpu)) {
                unsigned long pstate;
 
                /* Disable interrupts. */
@@ -68,7 +69,7 @@ static void sparc64_yield(void)
                        : "=&r" (pstate)
                        : "i" (PSTATE_IE));
 
-               if (!need_resched())
+               if (!need_resched() && !cpu_is_offline(cpu))
                        sun4v_cpu_yield();
 
                /* Re-enable interrupts. */
@@ -86,15 +87,25 @@ static void sparc64_yield(void)
 /* The idle loop on sparc64. */
 void cpu_idle(void)
 {
+       int cpu = smp_processor_id();
+
        set_thread_flag(TIF_POLLING_NRFLAG);
 
        while(1) {
                tick_nohz_stop_sched_tick();
-               while (!need_resched())
-                       sparc64_yield();
+
+               while (!need_resched() && !cpu_is_offline(cpu))
+                       sparc64_yield(cpu);
+
                tick_nohz_restart_sched_tick();
 
                preempt_enable_no_resched();
+
+#ifdef CONFIG_HOTPLUG_CPU
+               if (cpu_is_offline(cpu))
+                       cpu_play_dead();
+#endif
+
                schedule();
                preempt_disable();
        }
index 61036b346664b994cf329e90eef89305f7a28be3..5d220302cd508709e65a9e32a3ea64cf98c40331 100644 (file)
@@ -1808,7 +1808,7 @@ static void __init of_fill_in_cpu_data(void)
 
 #ifdef CONFIG_SMP
                cpu_set(cpuid, cpu_present_map);
-               cpu_set(cpuid, phys_cpu_present_map);
+               cpu_set(cpuid, cpu_possible_map);
 #endif
        }
 
index 7490cc670a530e495a81e1d5d7d762b8228f7f22..dc928e49e341aa5e6a7127db941e9bf8d58fd838 100644 (file)
@@ -442,7 +442,6 @@ static int show_cpuinfo(struct seq_file *m, void *__unused)
                   "D$ parity tl1\t: %u\n"
                   "I$ parity tl1\t: %u\n"
 #ifndef CONFIG_SMP
-                  "Cpu0Bogo\t: %lu.%02lu\n"
                   "Cpu0ClkTck\t: %016lx\n"
 #endif
                   ,
@@ -455,10 +454,8 @@ static int show_cpuinfo(struct seq_file *m, void *__unused)
                   ncpus_probed,
                   num_online_cpus(),
                   dcache_parity_tl1_occurred,
-                  icache_parity_tl1_occurred
+                  icache_parity_tl1_occurred,
 #ifndef CONFIG_SMP
-                  , cpu_data(0).udelay_val/(500000/HZ),
-                  (cpu_data(0).udelay_val/(5000/HZ)) % 100,
                   cpu_data(0).clock_tick
 #endif
                );
index 40e40f968d61abd9ef8192aeb1a6f2a9b318c7e7..b448d33321c6d96c4732c4e6349a98671a56ec01 100644 (file)
@@ -1,6 +1,6 @@
 /* smp.c: Sparc64 SMP support.
  *
- * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
+ * Copyright (C) 1997, 2007 David S. Miller (davem@davemloft.net)
  */
 
 #include <linux/module.h>
@@ -28,6 +28,8 @@
 #include <asm/tlbflush.h>
 #include <asm/mmu_context.h>
 #include <asm/cpudata.h>
+#include <asm/hvtramp.h>
+#include <asm/io.h>
 
 #include <asm/irq.h>
 #include <asm/irq_regs.h>
 #include <asm/sections.h>
 #include <asm/prom.h>
 #include <asm/mdesc.h>
+#include <asm/ldc.h>
+#include <asm/hypervisor.h>
 
 extern void calibrate_delay(void);
 
 int sparc64_multi_core __read_mostly;
 
-/* Please don't make this stuff initdata!!!  --DaveM */
-unsigned char boot_cpu_id;
-
+cpumask_t cpu_possible_map __read_mostly = CPU_MASK_NONE;
 cpumask_t cpu_online_map __read_mostly = CPU_MASK_NONE;
-cpumask_t phys_cpu_present_map __read_mostly = CPU_MASK_NONE;
 cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly =
        { [0 ... NR_CPUS-1] = CPU_MASK_NONE };
 cpumask_t cpu_core_map[NR_CPUS] __read_mostly =
        { [0 ... NR_CPUS-1] = CPU_MASK_NONE };
+
+EXPORT_SYMBOL(cpu_possible_map);
+EXPORT_SYMBOL(cpu_online_map);
+EXPORT_SYMBOL(cpu_sibling_map);
+EXPORT_SYMBOL(cpu_core_map);
+
 static cpumask_t smp_commenced_mask;
-static cpumask_t cpu_callout_map;
 
 void smp_info(struct seq_file *m)
 {
@@ -73,18 +79,17 @@ void smp_bogo(struct seq_file *m)
        
        for_each_online_cpu(i)
                seq_printf(m,
-                          "Cpu%dBogo\t: %lu.%02lu\n"
                           "Cpu%dClkTck\t: %016lx\n",
-                          i, cpu_data(i).udelay_val / (500000/HZ),
-                          (cpu_data(i).udelay_val / (5000/HZ)) % 100,
                           i, cpu_data(i).clock_tick);
 }
 
+static __cacheline_aligned_in_smp DEFINE_SPINLOCK(call_lock);
+
 extern void setup_sparc64_timer(void);
 
 static volatile unsigned long callin_flag = 0;
 
-void __init smp_callin(void)
+void __devinit smp_callin(void)
 {
        int cpuid = hard_smp_processor_id();
 
@@ -102,8 +107,6 @@ void __init smp_callin(void)
 
        local_irq_enable();
 
-       calibrate_delay();
-       cpu_data(cpuid).udelay_val = loops_per_jiffy;
        callin_flag = 1;
        __asm__ __volatile__("membar #Sync\n\t"
                             "flush  %%g6" : : : "memory");
@@ -120,7 +123,9 @@ void __init smp_callin(void)
        while (!cpu_isset(cpuid, smp_commenced_mask))
                rmb();
 
+       spin_lock(&call_lock);
        cpu_set(cpuid, cpu_online_map);
+       spin_unlock(&call_lock);
 
        /* idle thread is expected to have preempt disabled */
        preempt_disable();
@@ -268,6 +273,67 @@ static void smp_synchronize_one_tick(int cpu)
        spin_unlock_irqrestore(&itc_sync_lock, flags);
 }
 
+#if defined(CONFIG_SUN_LDOMS) && defined(CONFIG_HOTPLUG_CPU)
+/* XXX Put this in some common place. XXX */
+static unsigned long kimage_addr_to_ra(void *p)
+{
+       unsigned long val = (unsigned long) p;
+
+       return kern_base + (val - KERNBASE);
+}
+
+static void ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg)
+{
+       extern unsigned long sparc64_ttable_tl0;
+       extern unsigned long kern_locked_tte_data;
+       extern int bigkernel;
+       struct hvtramp_descr *hdesc;
+       unsigned long trampoline_ra;
+       struct trap_per_cpu *tb;
+       u64 tte_vaddr, tte_data;
+       unsigned long hv_err;
+
+       hdesc = kzalloc(sizeof(*hdesc), GFP_KERNEL);
+       if (!hdesc) {
+               printk(KERN_ERR "ldom_startcpu_cpuid: Cannot allocate "
+                      "hvtramp_descr.\n");
+               return;
+       }
+
+       hdesc->cpu = cpu;
+       hdesc->num_mappings = (bigkernel ? 2 : 1);
+
+       tb = &trap_block[cpu];
+       tb->hdesc = hdesc;
+
+       hdesc->fault_info_va = (unsigned long) &tb->fault_info;
+       hdesc->fault_info_pa = kimage_addr_to_ra(&tb->fault_info);
+
+       hdesc->thread_reg = thread_reg;
+
+       tte_vaddr = (unsigned long) KERNBASE;
+       tte_data = kern_locked_tte_data;
+
+       hdesc->maps[0].vaddr = tte_vaddr;
+       hdesc->maps[0].tte   = tte_data;
+       if (bigkernel) {
+               tte_vaddr += 0x400000;
+               tte_data  += 0x400000;
+               hdesc->maps[1].vaddr = tte_vaddr;
+               hdesc->maps[1].tte   = tte_data;
+       }
+
+       trampoline_ra = kimage_addr_to_ra(hv_cpu_startup);
+
+       hv_err = sun4v_cpu_start(cpu, trampoline_ra,
+                                kimage_addr_to_ra(&sparc64_ttable_tl0),
+                                __pa(hdesc));
+       if (hv_err)
+               printk(KERN_ERR "ldom_startcpu_cpuid: sun4v_cpu_start() "
+                      "gives error %lu\n", hv_err);
+}
+#endif
+
 extern void sun4v_init_mondo_queues(int use_bootmem, int cpu, int alloc, int load);
 
 extern unsigned long sparc64_cpu_startup;
@@ -280,6 +346,7 @@ static struct thread_info *cpu_new_thread = NULL;
 
 static int __devinit smp_boot_one_cpu(unsigned int cpu)
 {
+       struct trap_per_cpu *tb = &trap_block[cpu];
        unsigned long entry =
                (unsigned long)(&sparc64_cpu_startup);
        unsigned long cookie =
@@ -290,20 +357,25 @@ static int __devinit smp_boot_one_cpu(unsigned int cpu)
        p = fork_idle(cpu);
        callin_flag = 0;
        cpu_new_thread = task_thread_info(p);
-       cpu_set(cpu, cpu_callout_map);
 
        if (tlb_type == hypervisor) {
                /* Alloc the mondo queues, cpu will load them.  */
                sun4v_init_mondo_queues(0, cpu, 1, 0);
 
-               prom_startcpu_cpuid(cpu, entry, cookie);
+#if defined(CONFIG_SUN_LDOMS) && defined(CONFIG_HOTPLUG_CPU)
+               if (ldom_domaining_enabled)
+                       ldom_startcpu_cpuid(cpu,
+                                           (unsigned long) cpu_new_thread);
+               else
+#endif
+                       prom_startcpu_cpuid(cpu, entry, cookie);
        } else {
                struct device_node *dp = of_find_node_by_cpuid(cpu);
 
                prom_startcpu(dp->node, entry, cookie);
        }
 
-       for (timeout = 0; timeout < 5000000; timeout++) {
+       for (timeout = 0; timeout < 50000; timeout++) {
                if (callin_flag)
                        break;
                udelay(100);
@@ -313,11 +385,15 @@ static int __devinit smp_boot_one_cpu(unsigned int cpu)
                ret = 0;
        } else {
                printk("Processor %d is stuck.\n", cpu);
-               cpu_clear(cpu, cpu_callout_map);
                ret = -ENODEV;
        }
        cpu_new_thread = NULL;
 
+       if (tb->hdesc) {
+               kfree(tb->hdesc);
+               tb->hdesc = NULL;
+       }
+
        return ret;
 }
 
@@ -720,7 +796,6 @@ struct call_data_struct {
        int wait;
 };
 
-static __cacheline_aligned_in_smp DEFINE_SPINLOCK(call_lock);
 static struct call_data_struct *call_data;
 
 extern unsigned long xcall_call_function;
@@ -1152,34 +1227,14 @@ void smp_penguin_jailcell(int irq, struct pt_regs *regs)
        preempt_enable();
 }
 
-void __init smp_tick_init(void)
-{
-       boot_cpu_id = hard_smp_processor_id();
-}
-
 /* /proc/profile writes can call this, don't __init it please. */
 int setup_profiling_timer(unsigned int multiplier)
 {
        return -EINVAL;
 }
 
-/* Constrain the number of cpus to max_cpus.  */
 void __init smp_prepare_cpus(unsigned int max_cpus)
 {
-       int i;
-
-       if (num_possible_cpus() > max_cpus) {
-               for_each_possible_cpu(i) {
-                       if (i != boot_cpu_id) {
-                               cpu_clear(i, phys_cpu_present_map);
-                               cpu_clear(i, cpu_present_map);
-                               if (num_possible_cpus() <= max_cpus)
-                                       break;
-                       }
-               }
-       }
-
-       cpu_data(boot_cpu_id).udelay_val = loops_per_jiffy;
 }
 
 void __devinit smp_prepare_boot_cpu(void)
@@ -1190,30 +1245,32 @@ void __devinit smp_fill_in_sib_core_maps(void)
 {
        unsigned int i;
 
-       for_each_possible_cpu(i) {
+       for_each_present_cpu(i) {
                unsigned int j;
 
+               cpus_clear(cpu_core_map[i]);
                if (cpu_data(i).core_id == 0) {
                        cpu_set(i, cpu_core_map[i]);
                        continue;
                }
 
-               for_each_possible_cpu(j) {
+               for_each_present_cpu(j) {
                        if (cpu_data(i).core_id ==
                            cpu_data(j).core_id)
                                cpu_set(j, cpu_core_map[i]);
                }
        }
 
-       for_each_possible_cpu(i) {
+       for_each_present_cpu(i) {
                unsigned int j;
 
+               cpus_clear(cpu_sibling_map[i]);
                if (cpu_data(i).proc_id == -1) {
                        cpu_set(i, cpu_sibling_map[i]);
                        continue;
                }
 
-               for_each_possible_cpu(j) {
+               for_each_present_cpu(j) {
                        if (cpu_data(i).proc_id ==
                            cpu_data(j).proc_id)
                                cpu_set(j, cpu_sibling_map[i]);
@@ -1242,18 +1299,112 @@ int __cpuinit __cpu_up(unsigned int cpu)
        return ret;
 }
 
-void __init smp_cpus_done(unsigned int max_cpus)
+#ifdef CONFIG_HOTPLUG_CPU
+void cpu_play_dead(void)
+{
+       int cpu = smp_processor_id();
+       unsigned long pstate;
+
+       idle_task_exit();
+
+       if (tlb_type == hypervisor) {
+               struct trap_per_cpu *tb = &trap_block[cpu];
+
+               sun4v_cpu_qconf(HV_CPU_QUEUE_CPU_MONDO,
+                               tb->cpu_mondo_pa, 0);
+               sun4v_cpu_qconf(HV_CPU_QUEUE_DEVICE_MONDO,
+                               tb->dev_mondo_pa, 0);
+               sun4v_cpu_qconf(HV_CPU_QUEUE_RES_ERROR,
+                               tb->resum_mondo_pa, 0);
+               sun4v_cpu_qconf(HV_CPU_QUEUE_NONRES_ERROR,
+                               tb->nonresum_mondo_pa, 0);
+       }
+
+       cpu_clear(cpu, smp_commenced_mask);
+       membar_safe("#Sync");
+
+       local_irq_disable();
+
+       __asm__ __volatile__(
+               "rdpr   %%pstate, %0\n\t"
+               "wrpr   %0, %1, %%pstate"
+               : "=r" (pstate)
+               : "i" (PSTATE_IE));
+
+       while (1)
+               barrier();
+}
+
+int __cpu_disable(void)
 {
-       unsigned long bogosum = 0;
+       int cpu = smp_processor_id();
+       cpuinfo_sparc *c;
        int i;
 
-       for_each_online_cpu(i)
-               bogosum += cpu_data(i).udelay_val;
-       printk("Total of %ld processors activated "
-              "(%lu.%02lu BogoMIPS).\n",
-              (long) num_online_cpus(),
-              bogosum/(500000/HZ),
-              (bogosum/(5000/HZ))%100);
+       for_each_cpu_mask(i, cpu_core_map[cpu])
+               cpu_clear(cpu, cpu_core_map[i]);
+       cpus_clear(cpu_core_map[cpu]);
+
+       for_each_cpu_mask(i, cpu_sibling_map[cpu])
+               cpu_clear(cpu, cpu_sibling_map[i]);
+       cpus_clear(cpu_sibling_map[cpu]);
+
+       c = &cpu_data(cpu);
+
+       c->core_id = 0;
+       c->proc_id = -1;
+
+       spin_lock(&call_lock);
+       cpu_clear(cpu, cpu_online_map);
+       spin_unlock(&call_lock);
+
+       smp_wmb();
+
+       /* Make sure no interrupts point to this cpu.  */
+       fixup_irqs();
+
+       local_irq_enable();
+       mdelay(1);
+       local_irq_disable();
+
+       return 0;
+}
+
+void __cpu_die(unsigned int cpu)
+{
+       int i;
+
+       for (i = 0; i < 100; i++) {
+               smp_rmb();
+               if (!cpu_isset(cpu, smp_commenced_mask))
+                       break;
+               msleep(100);
+       }
+       if (cpu_isset(cpu, smp_commenced_mask)) {
+               printk(KERN_ERR "CPU %u didn't die...\n", cpu);
+       } else {
+#if defined(CONFIG_SUN_LDOMS)
+               unsigned long hv_err;
+               int limit = 100;
+
+               do {
+                       hv_err = sun4v_cpu_stop(cpu);
+                       if (hv_err == HV_EOK) {
+                               cpu_clear(cpu, cpu_present_map);
+                               break;
+                       }
+               } while (--limit > 0);
+               if (limit <= 0) {
+                       printk(KERN_ERR "sun4v_cpu_stop() fails err=%lu\n",
+                              hv_err);
+               }
+#endif
+       }
+}
+#endif
+
+void __init smp_cpus_done(unsigned int max_cpus)
+{
 }
 
 void smp_send_reschedule(int cpu)
index 6fa76161289910680c8bb3f350429f18248553a9..719d676c2ddc5c2875a675f4bf3fe9bacc300b6d 100644 (file)
@@ -1,7 +1,6 @@
-/* $Id: sparc64_ksyms.c,v 1.121 2002/02/09 19:49:31 davem Exp $
- * arch/sparc64/kernel/sparc64_ksyms.c: Sparc64 specific ksyms support.
+/* arch/sparc64/kernel/sparc64_ksyms.c: Sparc64 specific ksyms support.
  *
- * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
+ * Copyright (C) 1996, 2007 David S. Miller (davem@davemloft.net)
  * Copyright (C) 1996 Eddie C. Dost (ecd@skynet.be)
  * Copyright (C) 1999 Jakub Jelinek (jj@ultra.linux.cz)
  */
@@ -28,7 +27,6 @@
 #include <net/compat.h>
 
 #include <asm/oplib.h>
-#include <asm/delay.h>
 #include <asm/system.h>
 #include <asm/auxio.h>
 #include <asm/pgtable.h>
@@ -124,10 +122,6 @@ EXPORT_SYMBOL(__write_lock);
 EXPORT_SYMBOL(__write_unlock);
 EXPORT_SYMBOL(__write_trylock);
 
-/* CPU online map and active count.  */
-EXPORT_SYMBOL(cpu_online_map);
-EXPORT_SYMBOL(phys_cpu_present_map);
-
 EXPORT_SYMBOL(smp_call_function);
 #endif /* CONFIG_SMP */
 
@@ -330,12 +324,6 @@ EXPORT_SYMBOL(memset);
 EXPORT_SYMBOL(memmove);
 EXPORT_SYMBOL(strncmp);
 
-/* Delay routines. */
-EXPORT_SYMBOL(__udelay);
-EXPORT_SYMBOL(__ndelay);
-EXPORT_SYMBOL(__const_udelay);
-EXPORT_SYMBOL(__delay);
-
 void VISenter(void);
 /* RAID code needs this */
 EXPORT_SYMBOL(VISenter);
index cdb1477af89f8f403a20541f42853bce6c43aba2..52816c7be0b96f8015c997c268dd5a866269979e 100644 (file)
@@ -193,7 +193,6 @@ static ssize_t show_##NAME(struct sys_device *dev, char *buf) \
 }
 
 SHOW_CPUDATA_ULONG_NAME(clock_tick, clock_tick);
-SHOW_CPUDATA_ULONG_NAME(udelay_val, udelay_val);
 SHOW_CPUDATA_UINT_NAME(l1_dcache_size, dcache_size);
 SHOW_CPUDATA_UINT_NAME(l1_dcache_line_size, dcache_line_size);
 SHOW_CPUDATA_UINT_NAME(l1_icache_size, icache_size);
@@ -203,7 +202,6 @@ SHOW_CPUDATA_UINT_NAME(l2_cache_line_size, ecache_line_size);
 
 static struct sysdev_attribute cpu_core_attrs[] = {
        _SYSDEV_ATTR(clock_tick,          0444, show_clock_tick, NULL),
-       _SYSDEV_ATTR(udelay_val,          0444, show_udelay_val, NULL),
        _SYSDEV_ATTR(l1_dcache_size,      0444, show_l1_dcache_size, NULL),
        _SYSDEV_ATTR(l1_dcache_line_size, 0444, show_l1_dcache_line_size, NULL),
        _SYSDEV_ATTR(l1_icache_size,      0444, show_l1_icache_size, NULL),
index a31a0439244f387973893d3a9d215ebd4ae0555c..62e316ab1339a0ed1687728dd5db0f7c89f31ec2 100644 (file)
@@ -849,9 +849,6 @@ static unsigned long sparc64_init_timers(void)
 {
        struct device_node *dp;
        unsigned long clock;
-#ifdef CONFIG_SMP
-       extern void smp_tick_init(void);
-#endif
 
        dp = of_find_node_by_path("/");
        if (tlb_type == spitfire) {
@@ -874,10 +871,6 @@ static unsigned long sparc64_init_timers(void)
                clock = of_getintprop_default(dp, "stick-frequency", 0);
        }
 
-#ifdef CONFIG_SMP
-       smp_tick_init();
-#endif
-
        return clock;
 }
 
@@ -1038,10 +1031,31 @@ static void __init setup_clockevent_multiplier(unsigned long hz)
        sparc64_clockevent.mult = mult;
 }
 
+static unsigned long tb_ticks_per_usec __read_mostly;
+
+void __delay(unsigned long loops)
+{
+       unsigned long bclock, now;
+
+       bclock = tick_ops->get_tick();
+       do {
+               now = tick_ops->get_tick();
+       } while ((now-bclock) < loops);
+}
+EXPORT_SYMBOL(__delay);
+
+void udelay(unsigned long usecs)
+{
+       __delay(tb_ticks_per_usec * usecs);
+}
+EXPORT_SYMBOL(udelay);
+
 void __init time_init(void)
 {
        unsigned long clock = sparc64_init_timers();
 
+       tb_ticks_per_usec = clock / USEC_PER_SEC;
+
        timer_ticks_per_nsec_quotient =
                clocksource_hz2mult(clock, SPARC64_NSEC_PER_CYC_SHIFT);
 
diff --git a/arch/sparc64/kernel/vio.c b/arch/sparc64/kernel/vio.c
new file mode 100644 (file)
index 0000000..49569b4
--- /dev/null
@@ -0,0 +1,395 @@
+/* vio.c: Virtual I/O channel devices probing infrastructure.
+ *
+ *    Copyright (c) 2003-2005 IBM Corp.
+ *     Dave Engebretsen engebret@us.ibm.com
+ *     Santiago Leon santil@us.ibm.com
+ *     Hollis Blanchard <hollisb@us.ibm.com>
+ *     Stephen Rothwell
+ *
+ * Adapted to sparc64 by David S. Miller davem@davemloft.net
+ */
+
+#include <linux/kernel.h>
+#include <linux/irq.h>
+#include <linux/init.h>
+
+#include <asm/mdesc.h>
+#include <asm/vio.h>
+
+static inline int find_in_proplist(const char *list, const char *match,
+                                  int len)
+{
+       while (len > 0) {
+               int l;
+
+               if (!strcmp(list, match))
+                       return 1;
+               l = strlen(list) + 1;
+               list += l;
+               len -= l;
+       }
+       return 0;
+}
+
+static const struct vio_device_id *vio_match_device(
+       const struct vio_device_id *matches,
+       const struct vio_dev *dev)
+{
+       const char *type, *compat;
+       int len;
+
+       type = dev->type;
+       compat = dev->compat;
+       len = dev->compat_len;
+
+       while (matches->type[0] || matches->compat[0]) {
+               int match = 1;
+               if (matches->type[0])
+                       match &= !strcmp(matches->type, type);
+
+               if (matches->compat[0]) {
+                       match &= len &&
+                               find_in_proplist(compat, matches->compat, len);
+               }
+               if (match)
+                       return matches;
+               matches++;
+       }
+       return NULL;
+}
+
+static int vio_bus_match(struct device *dev, struct device_driver *drv)
+{
+       struct vio_dev *vio_dev = to_vio_dev(dev);
+       struct vio_driver *vio_drv = to_vio_driver(drv);
+       const struct vio_device_id *matches = vio_drv->id_table;
+
+       if (!matches)
+               return 0;
+
+       return vio_match_device(matches, vio_dev) != NULL;
+}
+
+static int vio_device_probe(struct device *dev)
+{
+       struct vio_dev *vdev = to_vio_dev(dev);
+       struct vio_driver *drv = to_vio_driver(dev->driver);
+       const struct vio_device_id *id;
+       int error = -ENODEV;
+
+       if (drv->probe) {
+               id = vio_match_device(drv->id_table, vdev);
+               if (id)
+                       error = drv->probe(vdev, id);
+       }
+
+       return error;
+}
+
+static int vio_device_remove(struct device *dev)
+{
+       struct vio_dev *vdev = to_vio_dev(dev);
+       struct vio_driver *drv = to_vio_driver(dev->driver);
+
+       if (drv->remove)
+               return drv->remove(vdev);
+
+       return 1;
+}
+
+static ssize_t devspec_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct vio_dev *vdev = to_vio_dev(dev);
+       const char *str = "none";
+
+       if (!strcmp(vdev->type, "network"))
+               str = "vnet";
+       else if (!strcmp(vdev->type, "block"))
+               str = "vdisk";
+
+       return sprintf(buf, "%s\n", str);
+}
+
+static ssize_t type_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct vio_dev *vdev = to_vio_dev(dev);
+       return sprintf(buf, "%s\n", vdev->type);
+}
+
+static struct device_attribute vio_dev_attrs[] = {
+       __ATTR_RO(devspec),
+       __ATTR_RO(type),
+       __ATTR_NULL
+};
+
+static struct bus_type vio_bus_type = {
+       .name           = "vio",
+       .dev_attrs      = vio_dev_attrs,
+       .match          = vio_bus_match,
+       .probe          = vio_device_probe,
+       .remove         = vio_device_remove,
+};
+
+int vio_register_driver(struct vio_driver *viodrv)
+{
+       viodrv->driver.bus = &vio_bus_type;
+
+       return driver_register(&viodrv->driver);
+}
+EXPORT_SYMBOL(vio_register_driver);
+
+void vio_unregister_driver(struct vio_driver *viodrv)
+{
+       driver_unregister(&viodrv->driver);
+}
+EXPORT_SYMBOL(vio_unregister_driver);
+
+static void __devinit vio_dev_release(struct device *dev)
+{
+       kfree(to_vio_dev(dev));
+}
+
+static ssize_t
+show_pciobppath_attr(struct device *dev, struct device_attribute *attr,
+                    char *buf)
+{
+       struct vio_dev *vdev;
+       struct device_node *dp;
+
+       vdev = to_vio_dev(dev);
+       dp = vdev->dp;
+
+       return snprintf (buf, PAGE_SIZE, "%s\n", dp->full_name);
+}
+
+static DEVICE_ATTR(obppath, S_IRUSR | S_IRGRP | S_IROTH,
+                  show_pciobppath_attr, NULL);
+
+struct device_node *cdev_node;
+
+static struct vio_dev *root_vdev;
+static u64 cdev_cfg_handle;
+
+static void vio_fill_channel_info(struct mdesc_handle *hp, u64 mp,
+                                 struct vio_dev *vdev)
+{
+       u64 a;
+
+       mdesc_for_each_arc(a, hp, mp, MDESC_ARC_TYPE_FWD) {
+               const u64 *chan_id;
+               const u64 *irq;
+               u64 target;
+
+               target = mdesc_arc_target(hp, a);
+
+               irq = mdesc_get_property(hp, target, "tx-ino", NULL);
+               if (irq)
+                       vdev->tx_irq = sun4v_build_virq(cdev_cfg_handle, *irq);
+
+               irq = mdesc_get_property(hp, target, "rx-ino", NULL);
+               if (irq)
+                       vdev->rx_irq = sun4v_build_virq(cdev_cfg_handle, *irq);
+
+               chan_id = mdesc_get_property(hp, target, "id", NULL);
+               if (chan_id)
+                       vdev->channel_id = *chan_id;
+       }
+}
+
+static struct vio_dev *vio_create_one(struct mdesc_handle *hp, u64 mp,
+                                     struct device *parent)
+{
+       const char *type, *compat;
+       struct device_node *dp;
+       struct vio_dev *vdev;
+       int err, tlen, clen;
+
+       type = mdesc_get_property(hp, mp, "device-type", &tlen);
+       if (!type) {
+               type = mdesc_get_property(hp, mp, "name", &tlen);
+               if (!type) {
+                       type = mdesc_node_name(hp, mp);
+                       tlen = strlen(type) + 1;
+               }
+       }
+       if (tlen > VIO_MAX_TYPE_LEN) {
+               printk(KERN_ERR "VIO: Type string [%s] is too long.\n",
+                      type);
+               return NULL;
+       }
+
+       compat = mdesc_get_property(hp, mp, "device-type", &clen);
+       if (!compat) {
+               clen = 0;
+       } else if (clen > VIO_MAX_COMPAT_LEN) {
+               printk(KERN_ERR "VIO: Compat len %d for [%s] is too long.\n",
+                      clen, type);
+               return NULL;
+       }
+
+       vdev = kzalloc(sizeof(*vdev), GFP_KERNEL);
+       if (!vdev) {
+               printk(KERN_ERR "VIO: Could not allocate vio_dev\n");
+               return NULL;
+       }
+
+       vdev->mp = mp;
+       memcpy(vdev->type, type, tlen);
+       if (compat)
+               memcpy(vdev->compat, compat, clen);
+       else
+               memset(vdev->compat, 0, sizeof(vdev->compat));
+       vdev->compat_len = clen;
+
+       vdev->channel_id = ~0UL;
+       vdev->tx_irq = ~0;
+       vdev->rx_irq = ~0;
+
+       vio_fill_channel_info(hp, mp, vdev);
+
+       snprintf(vdev->dev.bus_id, BUS_ID_SIZE, "%lx", mp);
+       vdev->dev.parent = parent;
+       vdev->dev.bus = &vio_bus_type;
+       vdev->dev.release = vio_dev_release;
+
+       if (parent == NULL) {
+               dp = cdev_node;
+       } else if (to_vio_dev(parent) == root_vdev) {
+               dp = of_get_next_child(cdev_node, NULL);
+               while (dp) {
+                       if (!strcmp(dp->type, type))
+                               break;
+
+                       dp = of_get_next_child(cdev_node, dp);
+               }
+       } else {
+               dp = to_vio_dev(parent)->dp;
+       }
+       vdev->dp = dp;
+
+       err = device_register(&vdev->dev);
+       if (err) {
+               printk(KERN_ERR "VIO: Could not register device %s, err=%d\n",
+                      vdev->dev.bus_id, err);
+               kfree(vdev);
+               return NULL;
+       }
+       if (vdev->dp)
+               err = sysfs_create_file(&vdev->dev.kobj,
+                                       &dev_attr_obppath.attr);
+
+       return vdev;
+}
+
+static void walk_tree(struct mdesc_handle *hp, u64 n, struct vio_dev *parent)
+{
+       u64 a;
+
+       mdesc_for_each_arc(a, hp, n, MDESC_ARC_TYPE_FWD) {
+               struct vio_dev *vdev;
+               u64 target;
+
+               target = mdesc_arc_target(hp, a);
+               vdev = vio_create_one(hp, target, &parent->dev);
+               if (vdev)
+                       walk_tree(hp, target, vdev);
+       }
+}
+
+static void create_devices(struct mdesc_handle *hp, u64 root)
+{
+       u64 mp;
+
+       root_vdev = vio_create_one(hp, root, NULL);
+       if (!root_vdev) {
+               printk(KERN_ERR "VIO: Coult not create root device.\n");
+               return;
+       }
+
+       walk_tree(hp, root, root_vdev);
+
+       /* Domain services is odd as it doesn't sit underneath the
+        * channel-devices node, so we plug it in manually.
+        */
+       mp = mdesc_node_by_name(hp, MDESC_NODE_NULL, "domain-services");
+       if (mp != MDESC_NODE_NULL) {
+               struct vio_dev *parent = vio_create_one(hp, mp,
+                                                       &root_vdev->dev);
+
+               if (parent)
+                       walk_tree(hp, mp, parent);
+       }
+}
+
+const char *channel_devices_node = "channel-devices";
+const char *channel_devices_compat = "SUNW,sun4v-channel-devices";
+const char *cfg_handle_prop = "cfg-handle";
+
+static int __init vio_init(void)
+{
+       struct mdesc_handle *hp;
+       const char *compat;
+       const u64 *cfg_handle;
+       int err, len;
+       u64 root;
+
+       err = bus_register(&vio_bus_type);
+       if (err) {
+               printk(KERN_ERR "VIO: Could not register bus type err=%d\n",
+                      err);
+               return err;
+       }
+
+       hp = mdesc_grab();
+       if (!hp)
+               return 0;
+
+       root = mdesc_node_by_name(hp, MDESC_NODE_NULL, channel_devices_node);
+       if (root == MDESC_NODE_NULL) {
+               printk(KERN_INFO "VIO: No channel-devices MDESC node.\n");
+               mdesc_release(hp);
+               return 0;
+       }
+
+       cdev_node = of_find_node_by_name(NULL, "channel-devices");
+       err = -ENODEV;
+       if (!cdev_node) {
+               printk(KERN_INFO "VIO: No channel-devices OBP node.\n");
+               goto out_release;
+       }
+
+       compat = mdesc_get_property(hp, root, "compatible", &len);
+       if (!compat) {
+               printk(KERN_ERR "VIO: Channel devices lacks compatible "
+                      "property\n");
+               goto out_release;
+       }
+       if (!find_in_proplist(compat, channel_devices_compat, len)) {
+               printk(KERN_ERR "VIO: Channel devices node lacks (%s) "
+                      "compat entry.\n", channel_devices_compat);
+               goto out_release;
+       }
+
+       cfg_handle = mdesc_get_property(hp, root, cfg_handle_prop, NULL);
+       if (!cfg_handle) {
+               printk(KERN_ERR "VIO: Channel devices lacks %s property\n",
+                      cfg_handle_prop);
+               goto out_release;
+       }
+
+       cdev_cfg_handle = *cfg_handle;
+
+       create_devices(hp, root);
+
+       mdesc_release(hp);
+
+       return 0;
+
+out_release:
+       mdesc_release(hp);
+       return err;
+}
+
+postcore_initcall(vio_init);
diff --git a/arch/sparc64/kernel/viohs.c b/arch/sparc64/kernel/viohs.c
new file mode 100644 (file)
index 0000000..15613ad
--- /dev/null
@@ -0,0 +1,792 @@
+/* viohs.c: LDOM Virtual I/O handshake helper layer.
+ *
+ * Copyright (C) 2007 David S. Miller <davem@davemloft.net>
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/string.h>
+#include <linux/delay.h>
+#include <linux/sched.h>
+#include <linux/slab.h>
+
+#include <asm/ldc.h>
+#include <asm/vio.h>
+
+int vio_ldc_send(struct vio_driver_state *vio, void *data, int len)
+{
+       int err, limit = 1000;
+
+       err = -EINVAL;
+       while (limit-- > 0) {
+               err = ldc_write(vio->lp, data, len);
+               if (!err || (err != -EAGAIN))
+                       break;
+               udelay(1);
+       }
+
+       return err;
+}
+EXPORT_SYMBOL(vio_ldc_send);
+
+static int send_ctrl(struct vio_driver_state *vio,
+                    struct vio_msg_tag *tag, int len)
+{
+       tag->sid = vio_send_sid(vio);
+       return vio_ldc_send(vio, tag, len);
+}
+
+static void init_tag(struct vio_msg_tag *tag, u8 type, u8 stype, u16 stype_env)
+{
+       tag->type = type;
+       tag->stype = stype;
+       tag->stype_env = stype_env;
+}
+
+static int send_version(struct vio_driver_state *vio, u16 major, u16 minor)
+{
+       struct vio_ver_info pkt;
+
+       vio->_local_sid = (u32) sched_clock();
+
+       memset(&pkt, 0, sizeof(pkt));
+       init_tag(&pkt.tag, VIO_TYPE_CTRL, VIO_SUBTYPE_INFO, VIO_VER_INFO);
+       pkt.major = major;
+       pkt.minor = minor;
+       pkt.dev_class = vio->dev_class;
+
+       viodbg(HS, "SEND VERSION INFO maj[%u] min[%u] devclass[%u]\n",
+              major, minor, vio->dev_class);
+
+       return send_ctrl(vio, &pkt.tag, sizeof(pkt));
+}
+
+static int start_handshake(struct vio_driver_state *vio)
+{
+       int err;
+
+       viodbg(HS, "START HANDSHAKE\n");
+
+       vio->hs_state = VIO_HS_INVALID;
+
+       err = send_version(vio,
+                          vio->ver_table[0].major,
+                          vio->ver_table[0].minor);
+       if (err < 0)
+               return err;
+
+       return 0;
+}
+
+void vio_link_state_change(struct vio_driver_state *vio, int event)
+{
+       if (event == LDC_EVENT_UP) {
+               vio->hs_state = VIO_HS_INVALID;
+
+               switch (vio->dev_class) {
+               case VDEV_NETWORK:
+               case VDEV_NETWORK_SWITCH:
+                       vio->dr_state = (VIO_DR_STATE_TXREQ |
+                                        VIO_DR_STATE_RXREQ);
+                       break;
+
+               case VDEV_DISK:
+                       vio->dr_state = VIO_DR_STATE_TXREQ;
+                       break;
+               case VDEV_DISK_SERVER:
+                       vio->dr_state = VIO_DR_STATE_RXREQ;
+                       break;
+               }
+               start_handshake(vio);
+       }
+}
+EXPORT_SYMBOL(vio_link_state_change);
+
+static int handshake_failure(struct vio_driver_state *vio)
+{
+       struct vio_dring_state *dr;
+
+       /* XXX Put policy here...  Perhaps start a timer to fire
+        * XXX in 100 ms, which will bring the link up and retry
+        * XXX the handshake.
+        */
+
+       viodbg(HS, "HANDSHAKE FAILURE\n");
+
+       vio->dr_state &= ~(VIO_DR_STATE_TXREG |
+                          VIO_DR_STATE_RXREG);
+
+       dr = &vio->drings[VIO_DRIVER_RX_RING];
+       memset(dr, 0, sizeof(*dr));
+
+       kfree(vio->desc_buf);
+       vio->desc_buf = NULL;
+       vio->desc_buf_len = 0;
+
+       vio->hs_state = VIO_HS_INVALID;
+
+       return -ECONNRESET;
+}
+
+static int process_unknown(struct vio_driver_state *vio, void *arg)
+{
+       struct vio_msg_tag *pkt = arg;
+
+       viodbg(HS, "UNKNOWN CONTROL [%02x:%02x:%04x:%08x]\n",
+              pkt->type, pkt->stype, pkt->stype_env, pkt->sid);
+
+       printk(KERN_ERR "vio: ID[%lu] Resetting connection.\n",
+              vio->vdev->channel_id);
+
+       ldc_disconnect(vio->lp);
+
+       return -ECONNRESET;
+}
+
+static int send_dreg(struct vio_driver_state *vio)
+{
+       struct vio_dring_state *dr = &vio->drings[VIO_DRIVER_TX_RING];
+       union {
+               struct vio_dring_register pkt;
+               char all[sizeof(struct vio_dring_register) +
+                        (sizeof(struct ldc_trans_cookie) *
+                         dr->ncookies)];
+       } u;
+       int i;
+
+       memset(&u, 0, sizeof(u));
+       init_tag(&u.pkt.tag, VIO_TYPE_CTRL, VIO_SUBTYPE_INFO, VIO_DRING_REG);
+       u.pkt.dring_ident = 0;
+       u.pkt.num_descr = dr->num_entries;
+       u.pkt.descr_size = dr->entry_size;
+       u.pkt.options = VIO_TX_DRING;
+       u.pkt.num_cookies = dr->ncookies;
+
+       viodbg(HS, "SEND DRING_REG INFO ndesc[%u] dsz[%u] opt[0x%x] "
+              "ncookies[%u]\n",
+              u.pkt.num_descr, u.pkt.descr_size, u.pkt.options,
+              u.pkt.num_cookies);
+
+       for (i = 0; i < dr->ncookies; i++) {
+               u.pkt.cookies[i] = dr->cookies[i];
+
+               viodbg(HS, "DRING COOKIE(%d) [%016llx:%016llx]\n",
+                      i,
+                      (unsigned long long) u.pkt.cookies[i].cookie_addr,
+                      (unsigned long long) u.pkt.cookies[i].cookie_size);
+       }
+
+       return send_ctrl(vio, &u.pkt.tag, sizeof(u));
+}
+
+static int send_rdx(struct vio_driver_state *vio)
+{
+       struct vio_rdx pkt;
+
+       memset(&pkt, 0, sizeof(pkt));
+
+       init_tag(&pkt.tag, VIO_TYPE_CTRL, VIO_SUBTYPE_INFO, VIO_RDX);
+
+       viodbg(HS, "SEND RDX INFO\n");
+
+       return send_ctrl(vio, &pkt.tag, sizeof(pkt));
+}
+
+static int send_attr(struct vio_driver_state *vio)
+{
+       return vio->ops->send_attr(vio);
+}
+
+static struct vio_version *find_by_major(struct vio_driver_state *vio,
+                                        u16 major)
+{
+       struct vio_version *ret = NULL;
+       int i;
+
+       for (i = 0; i < vio->ver_table_entries; i++) {
+               struct vio_version *v = &vio->ver_table[i];
+               if (v->major <= major) {
+                       ret = v;
+                       break;
+               }
+       }
+       return ret;
+}
+
+static int process_ver_info(struct vio_driver_state *vio,
+                           struct vio_ver_info *pkt)
+{
+       struct vio_version *vap;
+       int err;
+
+       viodbg(HS, "GOT VERSION INFO maj[%u] min[%u] devclass[%u]\n",
+              pkt->major, pkt->minor, pkt->dev_class);
+
+       if (vio->hs_state != VIO_HS_INVALID) {
+               /* XXX Perhaps invoke start_handshake? XXX */
+               memset(&vio->ver, 0, sizeof(vio->ver));
+               vio->hs_state = VIO_HS_INVALID;
+       }
+
+       vap = find_by_major(vio, pkt->major);
+
+       vio->_peer_sid = pkt->tag.sid;
+
+       if (!vap) {
+               pkt->tag.stype = VIO_SUBTYPE_NACK;
+               pkt->major = 0;
+               pkt->minor = 0;
+               viodbg(HS, "SEND VERSION NACK maj[0] min[0]\n");
+               err = send_ctrl(vio, &pkt->tag, sizeof(*pkt));
+       } else if (vap->major != pkt->major) {
+               pkt->tag.stype = VIO_SUBTYPE_NACK;
+               pkt->major = vap->major;
+               pkt->minor = vap->minor;
+               viodbg(HS, "SEND VERSION NACK maj[%u] min[%u]\n",
+                      pkt->major, pkt->minor);
+               err = send_ctrl(vio, &pkt->tag, sizeof(*pkt));
+       } else {
+               struct vio_version ver = {
+                       .major = pkt->major,
+                       .minor = pkt->minor,
+               };
+               if (ver.minor > vap->minor)
+                       ver.minor = vap->minor;
+               pkt->minor = ver.minor;
+               pkt->tag.stype = VIO_SUBTYPE_ACK;
+               viodbg(HS, "SEND VERSION ACK maj[%u] min[%u]\n",
+                      pkt->major, pkt->minor);
+               err = send_ctrl(vio, &pkt->tag, sizeof(*pkt));
+               if (err > 0) {
+                       vio->ver = ver;
+                       vio->hs_state = VIO_HS_GOTVERS;
+               }
+       }
+       if (err < 0)
+               return handshake_failure(vio);
+
+       return 0;
+}
+
+static int process_ver_ack(struct vio_driver_state *vio,
+                          struct vio_ver_info *pkt)
+{
+       viodbg(HS, "GOT VERSION ACK maj[%u] min[%u] devclass[%u]\n",
+              pkt->major, pkt->minor, pkt->dev_class);
+
+       if (vio->hs_state & VIO_HS_GOTVERS) {
+               if (vio->ver.major != pkt->major ||
+                   vio->ver.minor != pkt->minor) {
+                       pkt->tag.stype = VIO_SUBTYPE_NACK;
+                       (void) send_ctrl(vio, &pkt->tag, sizeof(*pkt));
+                       return handshake_failure(vio);
+               }
+       } else {
+               vio->ver.major = pkt->major;
+               vio->ver.minor = pkt->minor;
+               vio->hs_state = VIO_HS_GOTVERS;
+       }
+
+       switch (vio->dev_class) {
+       case VDEV_NETWORK:
+       case VDEV_DISK:
+               if (send_attr(vio) < 0)
+                       return handshake_failure(vio);
+               break;
+
+       default:
+               break;
+       }
+
+       return 0;
+}
+
+static int process_ver_nack(struct vio_driver_state *vio,
+                           struct vio_ver_info *pkt)
+{
+       struct vio_version *nver;
+
+       viodbg(HS, "GOT VERSION NACK maj[%u] min[%u] devclass[%u]\n",
+              pkt->major, pkt->minor, pkt->dev_class);
+
+       if ((pkt->major == 0 && pkt->minor == 0) ||
+           !(nver = find_by_major(vio, pkt->major)))
+               return handshake_failure(vio);
+
+       if (send_version(vio, nver->major, nver->minor) < 0)
+               return handshake_failure(vio);
+
+       return 0;
+}
+
+static int process_ver(struct vio_driver_state *vio, struct vio_ver_info *pkt)
+{
+       switch (pkt->tag.stype) {
+       case VIO_SUBTYPE_INFO:
+               return process_ver_info(vio, pkt);
+
+       case VIO_SUBTYPE_ACK:
+               return process_ver_ack(vio, pkt);
+
+       case VIO_SUBTYPE_NACK:
+               return process_ver_nack(vio, pkt);
+
+       default:
+               return handshake_failure(vio);
+       };
+}
+
+static int process_attr(struct vio_driver_state *vio, void *pkt)
+{
+       int err;
+
+       if (!(vio->hs_state & VIO_HS_GOTVERS))
+               return handshake_failure(vio);
+
+       err = vio->ops->handle_attr(vio, pkt);
+       if (err < 0) {
+               return handshake_failure(vio);
+       } else {
+               vio->hs_state |= VIO_HS_GOT_ATTR;
+
+               if ((vio->dr_state & VIO_DR_STATE_TXREQ) &&
+                   !(vio->hs_state & VIO_HS_SENT_DREG)) {
+                       if (send_dreg(vio) < 0)
+                               return handshake_failure(vio);
+
+                       vio->hs_state |= VIO_HS_SENT_DREG;
+               }
+       }
+       return 0;
+}
+
+static int all_drings_registered(struct vio_driver_state *vio)
+{
+       int need_rx, need_tx;
+
+       need_rx = (vio->dr_state & VIO_DR_STATE_RXREQ);
+       need_tx = (vio->dr_state & VIO_DR_STATE_TXREQ);
+
+       if (need_rx &&
+           !(vio->dr_state & VIO_DR_STATE_RXREG))
+               return 0;
+
+       if (need_tx &&
+           !(vio->dr_state & VIO_DR_STATE_TXREG))
+               return 0;
+
+       return 1;
+}
+
+static int process_dreg_info(struct vio_driver_state *vio,
+                            struct vio_dring_register *pkt)
+{
+       struct vio_dring_state *dr;
+       int i, len;
+
+       viodbg(HS, "GOT DRING_REG INFO ident[%llx] "
+              "ndesc[%u] dsz[%u] opt[0x%x] ncookies[%u]\n",
+              (unsigned long long) pkt->dring_ident,
+              pkt->num_descr, pkt->descr_size, pkt->options,
+              pkt->num_cookies);
+
+       if (!(vio->dr_state & VIO_DR_STATE_RXREQ))
+               goto send_nack;
+
+       if (vio->dr_state & VIO_DR_STATE_RXREG)
+               goto send_nack;
+
+       vio->desc_buf = kzalloc(pkt->descr_size, GFP_ATOMIC);
+       if (!vio->desc_buf)
+               goto send_nack;
+
+       vio->desc_buf_len = pkt->descr_size;
+
+       dr = &vio->drings[VIO_DRIVER_RX_RING];
+
+       dr->num_entries = pkt->num_descr;
+       dr->entry_size = pkt->descr_size;
+       dr->ncookies = pkt->num_cookies;
+       for (i = 0; i < dr->ncookies; i++) {
+               dr->cookies[i] = pkt->cookies[i];
+
+               viodbg(HS, "DRING COOKIE(%d) [%016llx:%016llx]\n",
+                      i,
+                      (unsigned long long)
+                      pkt->cookies[i].cookie_addr,
+                      (unsigned long long)
+                      pkt->cookies[i].cookie_size);
+       }
+
+       pkt->tag.stype = VIO_SUBTYPE_ACK;
+       pkt->dring_ident = ++dr->ident;
+
+       viodbg(HS, "SEND DRING_REG ACK ident[%llx]\n",
+              (unsigned long long) pkt->dring_ident);
+
+       len = (sizeof(*pkt) +
+              (dr->ncookies * sizeof(struct ldc_trans_cookie)));
+       if (send_ctrl(vio, &pkt->tag, len) < 0)
+               goto send_nack;
+
+       vio->dr_state |= VIO_DR_STATE_RXREG;
+
+       return 0;
+
+send_nack:
+       pkt->tag.stype = VIO_SUBTYPE_NACK;
+       viodbg(HS, "SEND DRING_REG NACK\n");
+       (void) send_ctrl(vio, &pkt->tag, sizeof(*pkt));
+
+       return handshake_failure(vio);
+}
+
+static int process_dreg_ack(struct vio_driver_state *vio,
+                           struct vio_dring_register *pkt)
+{
+       struct vio_dring_state *dr;
+
+       viodbg(HS, "GOT DRING_REG ACK ident[%llx] "
+              "ndesc[%u] dsz[%u] opt[0x%x] ncookies[%u]\n",
+              (unsigned long long) pkt->dring_ident,
+              pkt->num_descr, pkt->descr_size, pkt->options,
+              pkt->num_cookies);
+
+       dr = &vio->drings[VIO_DRIVER_TX_RING];
+
+       if (!(vio->dr_state & VIO_DR_STATE_TXREQ))
+               return handshake_failure(vio);
+
+       dr->ident = pkt->dring_ident;
+       vio->dr_state |= VIO_DR_STATE_TXREG;
+
+       if (all_drings_registered(vio)) {
+               if (send_rdx(vio) < 0)
+                       return handshake_failure(vio);
+               vio->hs_state = VIO_HS_SENT_RDX;
+       }
+       return 0;
+}
+
+static int process_dreg_nack(struct vio_driver_state *vio,
+                            struct vio_dring_register *pkt)
+{
+       viodbg(HS, "GOT DRING_REG NACK ident[%llx] "
+              "ndesc[%u] dsz[%u] opt[0x%x] ncookies[%u]\n",
+              (unsigned long long) pkt->dring_ident,
+              pkt->num_descr, pkt->descr_size, pkt->options,
+              pkt->num_cookies);
+
+       return handshake_failure(vio);
+}
+
+static int process_dreg(struct vio_driver_state *vio,
+                       struct vio_dring_register *pkt)
+{
+       if (!(vio->hs_state & VIO_HS_GOTVERS))
+               return handshake_failure(vio);
+
+       switch (pkt->tag.stype) {
+       case VIO_SUBTYPE_INFO:
+               return process_dreg_info(vio, pkt);
+
+       case VIO_SUBTYPE_ACK:
+               return process_dreg_ack(vio, pkt);
+
+       case VIO_SUBTYPE_NACK:
+               return process_dreg_nack(vio, pkt);
+
+       default:
+               return handshake_failure(vio);
+       }
+}
+
+static int process_dunreg(struct vio_driver_state *vio,
+                         struct vio_dring_unregister *pkt)
+{
+       struct vio_dring_state *dr = &vio->drings[VIO_DRIVER_RX_RING];
+
+       viodbg(HS, "GOT DRING_UNREG\n");
+
+       if (pkt->dring_ident != dr->ident)
+               return 0;
+
+       vio->dr_state &= ~VIO_DR_STATE_RXREG;
+
+       memset(dr, 0, sizeof(*dr));
+
+       kfree(vio->desc_buf);
+       vio->desc_buf = NULL;
+       vio->desc_buf_len = 0;
+
+       return 0;
+}
+
+static int process_rdx_info(struct vio_driver_state *vio, struct vio_rdx *pkt)
+{
+       viodbg(HS, "GOT RDX INFO\n");
+
+       pkt->tag.stype = VIO_SUBTYPE_ACK;
+       viodbg(HS, "SEND RDX ACK\n");
+       if (send_ctrl(vio, &pkt->tag, sizeof(*pkt)) < 0)
+               return handshake_failure(vio);
+
+       vio->hs_state |= VIO_HS_SENT_RDX_ACK;
+       return 0;
+}
+
+static int process_rdx_ack(struct vio_driver_state *vio, struct vio_rdx *pkt)
+{
+       viodbg(HS, "GOT RDX ACK\n");
+
+       if (!(vio->hs_state & VIO_HS_SENT_RDX))
+               return handshake_failure(vio);
+
+       vio->hs_state |= VIO_HS_GOT_RDX_ACK;
+       return 0;
+}
+
+static int process_rdx_nack(struct vio_driver_state *vio, struct vio_rdx *pkt)
+{
+       viodbg(HS, "GOT RDX NACK\n");
+
+       return handshake_failure(vio);
+}
+
+static int process_rdx(struct vio_driver_state *vio, struct vio_rdx *pkt)
+{
+       if (!all_drings_registered(vio))
+               handshake_failure(vio);
+
+       switch (pkt->tag.stype) {
+       case VIO_SUBTYPE_INFO:
+               return process_rdx_info(vio, pkt);
+
+       case VIO_SUBTYPE_ACK:
+               return process_rdx_ack(vio, pkt);
+
+       case VIO_SUBTYPE_NACK:
+               return process_rdx_nack(vio, pkt);
+
+       default:
+               return handshake_failure(vio);
+       }
+}
+
+int vio_control_pkt_engine(struct vio_driver_state *vio, void *pkt)
+{
+       struct vio_msg_tag *tag = pkt;
+       u8 prev_state = vio->hs_state;
+       int err;
+
+       switch (tag->stype_env) {
+       case VIO_VER_INFO:
+               err = process_ver(vio, pkt);
+               break;
+
+       case VIO_ATTR_INFO:
+               err = process_attr(vio, pkt);
+               break;
+
+       case VIO_DRING_REG:
+               err = process_dreg(vio, pkt);
+               break;
+
+       case VIO_DRING_UNREG:
+               err = process_dunreg(vio, pkt);
+               break;
+
+       case VIO_RDX:
+               err = process_rdx(vio, pkt);
+               break;
+
+       default:
+               err = process_unknown(vio, pkt);
+               break;
+       }
+       if (!err &&
+           vio->hs_state != prev_state &&
+           (vio->hs_state & VIO_HS_COMPLETE))
+               vio->ops->handshake_complete(vio);
+
+       return err;
+}
+EXPORT_SYMBOL(vio_control_pkt_engine);
+
+void vio_conn_reset(struct vio_driver_state *vio)
+{
+}
+EXPORT_SYMBOL(vio_conn_reset);
+
+/* The issue is that the Solaris virtual disk server just mirrors the
+ * SID values it gets from the client peer.  So we work around that
+ * here in vio_{validate,send}_sid() so that the drivers don't need
+ * to be aware of this crap.
+ */
+int vio_validate_sid(struct vio_driver_state *vio, struct vio_msg_tag *tp)
+{
+       u32 sid;
+
+       /* Always let VERSION+INFO packets through unchecked, they
+        * define the new SID.
+        */
+       if (tp->type == VIO_TYPE_CTRL &&
+           tp->stype == VIO_SUBTYPE_INFO &&
+           tp->stype_env == VIO_VER_INFO)
+               return 0;
+
+       /* Ok, now figure out which SID to use.  */
+       switch (vio->dev_class) {
+       case VDEV_NETWORK:
+       case VDEV_NETWORK_SWITCH:
+       case VDEV_DISK_SERVER:
+       default:
+               sid = vio->_peer_sid;
+               break;
+
+       case VDEV_DISK:
+               sid = vio->_local_sid;
+               break;
+       }
+
+       if (sid == tp->sid)
+               return 0;
+       viodbg(DATA, "BAD SID tag->sid[%08x] peer_sid[%08x] local_sid[%08x]\n",
+              tp->sid, vio->_peer_sid, vio->_local_sid);
+       return -EINVAL;
+}
+EXPORT_SYMBOL(vio_validate_sid);
+
+u32 vio_send_sid(struct vio_driver_state *vio)
+{
+       switch (vio->dev_class) {
+       case VDEV_NETWORK:
+       case VDEV_NETWORK_SWITCH:
+       case VDEV_DISK:
+       default:
+               return vio->_local_sid;
+
+       case VDEV_DISK_SERVER:
+               return vio->_peer_sid;
+       }
+}
+EXPORT_SYMBOL(vio_send_sid);
+
+extern int vio_ldc_alloc(struct vio_driver_state *vio,
+                        struct ldc_channel_config *base_cfg,
+                        void *event_arg)
+{
+       struct ldc_channel_config cfg = *base_cfg;
+       struct ldc_channel *lp;
+
+       cfg.tx_irq = vio->vdev->tx_irq;
+       cfg.rx_irq = vio->vdev->rx_irq;
+
+       lp = ldc_alloc(vio->vdev->channel_id, &cfg, event_arg);
+       if (IS_ERR(lp))
+               return PTR_ERR(lp);
+
+       vio->lp = lp;
+
+       return 0;
+}
+EXPORT_SYMBOL(vio_ldc_alloc);
+
+void vio_ldc_free(struct vio_driver_state *vio)
+{
+       ldc_free(vio->lp);
+       vio->lp = NULL;
+
+       kfree(vio->desc_buf);
+       vio->desc_buf = NULL;
+       vio->desc_buf_len = 0;
+}
+EXPORT_SYMBOL(vio_ldc_free);
+
+void vio_port_up(struct vio_driver_state *vio)
+{
+       unsigned long flags;
+       int err, state;
+
+       spin_lock_irqsave(&vio->lock, flags);
+
+       state = ldc_state(vio->lp);
+
+       err = 0;
+       if (state == LDC_STATE_INIT) {
+               err = ldc_bind(vio->lp, vio->name);
+               if (err)
+                       printk(KERN_WARNING "%s: Port %lu bind failed, "
+                              "err=%d\n",
+                              vio->name, vio->vdev->channel_id, err);
+       }
+
+       if (!err) {
+               err = ldc_connect(vio->lp);
+               if (err)
+                       printk(KERN_WARNING "%s: Port %lu connect failed, "
+                              "err=%d\n",
+                              vio->name, vio->vdev->channel_id, err);
+       }
+       if (err) {
+               unsigned long expires = jiffies + HZ;
+
+               expires = round_jiffies(expires);
+               mod_timer(&vio->timer, expires);
+       }
+
+       spin_unlock_irqrestore(&vio->lock, flags);
+}
+EXPORT_SYMBOL(vio_port_up);
+
+static void vio_port_timer(unsigned long _arg)
+{
+       struct vio_driver_state *vio = (struct vio_driver_state *) _arg;
+
+       vio_port_up(vio);
+}
+
+int vio_driver_init(struct vio_driver_state *vio, struct vio_dev *vdev,
+                   u8 dev_class, struct vio_version *ver_table,
+                   int ver_table_size, struct vio_driver_ops *ops,
+                   char *name)
+{
+       switch (dev_class) {
+       case VDEV_NETWORK:
+       case VDEV_NETWORK_SWITCH:
+       case VDEV_DISK:
+       case VDEV_DISK_SERVER:
+               break;
+
+       default:
+               return -EINVAL;
+       }
+
+       if (!ops->send_attr ||
+           !ops->handle_attr ||
+           !ops->handshake_complete)
+               return -EINVAL;
+
+       if (!ver_table || ver_table_size < 0)
+               return -EINVAL;
+
+       if (!name)
+               return -EINVAL;
+
+       spin_lock_init(&vio->lock);
+
+       vio->name = name;
+
+       vio->dev_class = dev_class;
+       vio->vdev = vdev;
+
+       vio->ver_table = ver_table;
+       vio->ver_table_entries = ver_table_size;
+
+       vio->ops = ops;
+
+       setup_timer(&vio->timer, vio_port_timer, (unsigned long) vio);
+
+       return 0;
+}
+EXPORT_SYMBOL(vio_driver_init);
index 4a725d8985f1b384f6cbeb56d36f595966d47edb..c4a6d6e7d03c804bc54d293acf60ff65ff64842d 100644 (file)
@@ -14,6 +14,6 @@ lib-y := PeeCeeI.o copy_page.o clear_page.o strlen.o strncmp.o \
         NGmemcpy.o NGcopy_from_user.o NGcopy_to_user.o NGpatch.o \
         NGpage.o NGbzero.o \
         copy_in_user.o user_fixup.o memmove.o \
-        mcount.o ipcsum.o rwsem.o xor.o delay.o
+        mcount.o ipcsum.o rwsem.o xor.o
 
 obj-y += iomap.o
diff --git a/arch/sparc64/lib/delay.c b/arch/sparc64/lib/delay.c
deleted file mode 100644 (file)
index fb27e54..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* delay.c: Delay loops for sparc64
- *
- * Copyright (C) 2004, 2006 David S. Miller <davem@davemloft.net>
- *
- * Based heavily upon x86 variant which is:
- *     Copyright (C) 1993 Linus Torvalds
- *     Copyright (C) 1997 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
- */
-
-#include <linux/delay.h>
-#include <asm/timer.h>
-
-void __delay(unsigned long loops)
-{
-       unsigned long bclock, now;
-       
-       bclock = tick_ops->get_tick();
-       do {
-               now = tick_ops->get_tick();
-       } while ((now-bclock) < loops);
-}
-
-/* We used to multiply by HZ after shifting down by 32 bits
- * but that runs into problems for higher values of HZ and
- * slow cpus.
- */
-void __const_udelay(unsigned long n)
-{
-       n *= 4;
-
-       n *= (cpu_data(raw_smp_processor_id()).udelay_val * (HZ/4));
-       n >>= 32;
-
-       __delay(n + 1);
-}
-
-void __udelay(unsigned long n)
-{
-       __const_udelay(n * 0x10c7UL);
-}
-
-
-void __ndelay(unsigned long n)
-{
-       __const_udelay(n * 0x5UL);
-}
index f3e0c14e9eef001ba157307375555e2adf5efc57..33c5b7da31e5522906855441953caa933d5ec835 100644 (file)
@@ -14,6 +14,7 @@
 #include <asm/openprom.h>
 #include <asm/oplib.h>
 #include <asm/system.h>
+#include <asm/ldc.h>
 
 int prom_service_exists(const char *service_name)
 {
@@ -37,6 +38,10 @@ void prom_sun4v_guest_soft_state(void)
 /* Reset and reboot the machine with the command 'bcommand'. */
 void prom_reboot(const char *bcommand)
 {
+#ifdef CONFIG_SUN_LDOMS
+       if (ldom_domaining_enabled)
+               ldom_reboot(bcommand);
+#endif
        p1275_cmd("boot", P1275_ARG(0, P1275_ARG_IN_STRING) |
                  P1275_INOUT(1, 0), bcommand);
 }
@@ -91,6 +96,10 @@ void prom_cmdline(void)
  */
 void prom_halt(void)
 {
+#ifdef CONFIG_SUN_LDOMS
+       if (ldom_domaining_enabled)
+               ldom_power_off();
+#endif
 again:
        p1275_cmd("exit", P1275_INOUT(0, 0));
        goto again; /* PROM is out to get me -DaveM */
@@ -98,6 +107,10 @@ again:
 
 void prom_halt_power_off(void)
 {
+#ifdef CONFIG_SUN_LDOMS
+       if (ldom_domaining_enabled)
+               ldom_power_off();
+#endif
        p1275_cmd("SUNW,power-off", P1275_INOUT(0, 0));
 
        /* if nothing else helps, we just halt */
index 2b32c489860c6c878a382a5063eeb48a20b7499a..7fcccc0e19cfffd3ab4b0b8f3545cabdf50e2648 100644 (file)
@@ -16,6 +16,7 @@
 #include <asm/system.h>
 #include <asm/spitfire.h>
 #include <asm/pstate.h>
+#include <asm/ldc.h>
 
 struct {
        long prom_callback;                     /* 0x00 */
index 500f05e2cfcb655af8ba1deeb0ae224192b560b9..17b7ecfe7ca95aed84232c40020509a50f48ddf6 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <asm/openprom.h>
 #include <asm/oplib.h>
+#include <asm/ldc.h>
 
 /* Return the child of node 'node' or zero if no this node has no
  * direct descendent.
@@ -261,9 +262,17 @@ int prom_node_has_property(int node, const char *prop)
 int
 prom_setprop(int node, const char *pname, char *value, int size)
 {
-       if(size == 0) return 0;
-       if((pname == 0) || (value == 0)) return 0;
+       if (size == 0)
+               return 0;
+       if ((pname == 0) || (value == 0))
+               return 0;
        
+#ifdef CONFIG_SUN_LDOMS
+       if (ldom_domaining_enabled) {
+               ldom_set_var(pname, value);
+               return 0;
+       }
+#endif
        return p1275_cmd ("setprop", P1275_ARG(1,P1275_ARG_IN_STRING)|
                                          P1275_ARG(2,P1275_ARG_IN_BUF)|
                                          P1275_INOUT(4, 1), 
index 09c1aca6339f94cf629a419387eff7f4f2517820..c86f5eb29fd584619a807e4c10520a40fa81b6eb 100644 (file)
@@ -47,4 +47,13 @@ config GCOV
         If you're involved in UML kernel development and want to use gcov,
         say Y.  If you're unsure, say N.
 
+config DEBUG_STACK_USAGE
+       bool "Stack utilization instrumentation"
+       default N
+       help
+         Track the maximum kernel stack usage - this will look at each
+         kernel stack at process exit and log it if it's the deepest
+         stack seen so far.
+
+         This option will slow down process creation and destruction somewhat.
 endmenu
diff --git a/arch/um/config.release b/arch/um/config.release
deleted file mode 100644 (file)
index fc68bcb..0000000
+++ /dev/null
@@ -1,333 +0,0 @@
-#
-# Automatically generated make config: don't edit
-#
-CONFIG_USERMODE=y
-# CONFIG_ISA is not set
-# CONFIG_SBUS is not set
-# CONFIG_PCI is not set
-CONFIG_UID16=y
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-
-#
-# General Setup
-#
-CONFIG_STDIO_CONSOLE=y
-CONFIG_NET=y
-CONFIG_SYSVIPC=y
-CONFIG_BSD_PROCESS_ACCT=y
-CONFIG_SYSCTL=y
-CONFIG_BINFMT_AOUT=y
-CONFIG_BINFMT_ELF=y
-CONFIG_BINFMT_MISC=y
-CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=256
-CONFIG_SSL=y
-CONFIG_HOSTFS=y
-CONFIG_MCONSOLE=y
-CONFIG_MAGIC_SYSRQ=y
-# CONFIG_HOST_2G_2G is not set
-# CONFIG_UML_SMP is not set
-# CONFIG_SMP is not set
-CONFIG_CON_ZERO_CHAN="fd:0,fd:1"
-CONFIG_CON_CHAN="xterm"
-CONFIG_SSL_CHAN="pty"
-CONFIG_NEST_LEVEL=0
-CONFIG_KERNEL_HALF_GIGS=1
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_KMOD=y
-
-#
-# Devices
-#
-CONFIG_BLK_DEV_UBD=y
-# CONFIG_BLK_DEV_UBD_SYNC is not set
-CONFIG_BLK_DEV_LOOP=y
-CONFIG_BLK_DEV_NBD=y
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_MMAPPER is not set
-CONFIG_UML_SOUND=y
-CONFIG_SOUND=y
-CONFIG_HOSTAUDIO=y
-# CONFIG_UML_WATCHDOG is not set
-# CONFIG_TTY_LOG is not set
-CONFIG_FD_CHAN=y
-# CONFIG_NULL_CHAN is not set
-CONFIG_PORT_CHAN=y
-CONFIG_PTY_CHAN=y
-CONFIG_TTY_CHAN=y
-CONFIG_XTERM_CHAN=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=y
-# CONFIG_NETLINK_DEV is not set
-# CONFIG_NETFILTER is not set
-# CONFIG_FILTER is not set
-CONFIG_UNIX=y
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-# CONFIG_IP_PNP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_ARPD is not set
-# CONFIG_INET_ECN is not set
-# CONFIG_SYN_COOKIES is not set
-# CONFIG_IPV6 is not set
-# CONFIG_KHTTPD is not set
-# CONFIG_ATM is not set
-# CONFIG_VLAN_8021Q is not set
-
-#
-#  
-#
-# CONFIG_IPX is not set
-# CONFIG_ATALK is not set
-# CONFIG_DECNET is not set
-# CONFIG_BRIDGE is not set
-# CONFIG_X25 is not set
-# CONFIG_LAPB is not set
-# CONFIG_LLC is not set
-# CONFIG_NET_DIVERT is not set
-# CONFIG_ECONET is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_NET_HW_FLOWCONTROL is not set
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-
-#
-# Network device support
-#
-CONFIG_UML_NET=y
-CONFIG_UML_NET_ETHERTAP=y
-CONFIG_UML_NET_TUNTAP=y
-CONFIG_UML_NET_SLIP=y
-CONFIG_UML_NET_DAEMON=y
-CONFIG_UML_NET_MCAST=y
-CONFIG_NETDEVICES=y
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
-CONFIG_DUMMY=y
-CONFIG_BONDING=m
-CONFIG_EQUALIZER=m
-CONFIG_TUN=y
-# CONFIG_ETHERTAP is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-# CONFIG_NET_ETHERNET is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-# CONFIG_ACENIC is not set
-# CONFIG_DL2K is not set
-# CONFIG_MYRI_SBUS is not set
-# CONFIG_NS83820 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_SK98LIN is not set
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-CONFIG_PLIP=m
-CONFIG_PPP=m
-CONFIG_PPP_MULTILINK=y
-# CONFIG_PPP_FILTER is not set
-# CONFIG_PPP_ASYNC is not set
-CONFIG_PPP_SYNC_TTY=m
-CONFIG_PPP_DEFLATE=m
-CONFIG_PPP_BSDCOMP=m
-CONFIG_PPPOE=m
-CONFIG_SLIP=m
-CONFIG_SLIP_COMPRESSED=y
-CONFIG_SLIP_SMART=y
-# CONFIG_SLIP_MODE_SLIP6 is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Token Ring devices
-#
-# CONFIG_TR is not set
-# CONFIG_NET_FC is not set
-# CONFIG_RCPCI is not set
-CONFIG_SHAPER=m
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-
-#
-# File systems
-#
-CONFIG_QUOTA=y
-CONFIG_AUTOFS_FS=m
-CONFIG_AUTOFS4_FS=m
-CONFIG_REISERFS_FS=m
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-CONFIG_ADFS_FS=m
-# CONFIG_ADFS_FS_RW is not set
-CONFIG_AFFS_FS=m
-CONFIG_HFS_FS=m
-CONFIG_BFS_FS=m
-CONFIG_EXT3_FS=y
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-CONFIG_FAT_FS=y
-CONFIG_MSDOS_FS=y
-CONFIG_UMSDOS_FS=y
-CONFIG_VFAT_FS=y
-CONFIG_EFS_FS=m
-# CONFIG_JFFS_FS is not set
-# CONFIG_JFFS2_FS is not set
-CONFIG_CRAMFS=m
-CONFIG_TMPFS=y
-CONFIG_RAMFS=m
-CONFIG_ISO9660_FS=y
-# CONFIG_JOLIET is not set
-# CONFIG_ZISOFS is not set
-CONFIG_MINIX_FS=m
-CONFIG_VXFS_FS=m
-# CONFIG_NTFS_FS is not set
-# CONFIG_NTFS_RW is not set
-CONFIG_HPFS_FS=m
-CONFIG_PROC_FS=y
-CONFIG_DEVFS_FS=y
-CONFIG_DEVFS_MOUNT=y
-# CONFIG_DEVFS_DEBUG is not set
-CONFIG_DEVPTS_FS=y
-CONFIG_QNX4FS_FS=m
-# CONFIG_QNX4FS_RW is not set
-CONFIG_ROMFS_FS=m
-CONFIG_EXT2_FS=y
-CONFIG_SYSV_FS=m
-CONFIG_UDF_FS=m
-CONFIG_UFS_FS=m
-# CONFIG_UFS_FS_WRITE is not set
-
-#
-# Network File Systems
-#
-# CONFIG_CODA_FS is not set
-# CONFIG_INTERMEZZO_FS is not set
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-# CONFIG_ROOT_NFS is not set
-CONFIG_NFSD=y
-CONFIG_NFSD_V3=y
-CONFIG_SUNRPC=y
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-# CONFIG_SMB_FS is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_NCPFS_PACKET_SIGNING is not set
-# CONFIG_NCPFS_IOCTL_LOCKING is not set
-# CONFIG_NCPFS_STRONG is not set
-# CONFIG_NCPFS_NFS_NS is not set
-# CONFIG_NCPFS_OS2_NS is not set
-# CONFIG_NCPFS_SMALLDOS is not set
-# CONFIG_NCPFS_NLS is not set
-# CONFIG_NCPFS_EXTRAS is not set
-# CONFIG_ZISOFS_FS is not set
-CONFIG_ZLIB_FS_INFLATE=m
-
-#
-# Partition Types
-#
-# CONFIG_PARTITION_ADVANCED is not set
-CONFIG_MSDOS_PARTITION=y
-# CONFIG_SMB_NLS is not set
-CONFIG_NLS=y
-
-#
-# Native Language Support
-#
-CONFIG_NLS_DEFAULT="iso8859-1"
-# CONFIG_NLS_CODEPAGE_437 is not set
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ISO8859_1 is not set
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-# CONFIG_MD is not set
-# CONFIG_BLK_DEV_MD is not set
-# CONFIG_MD_LINEAR is not set
-# CONFIG_MD_RAID0 is not set
-# CONFIG_MD_RAID1 is not set
-# CONFIG_MD_RAID5 is not set
-# CONFIG_MD_MULTIPATH is not set
-# CONFIG_BLK_DEV_LVM is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-# CONFIG_MTD is not set
-
-#
-# Kernel hacking
-#
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_PT_PROXY is not set
-# CONFIG_GPROF is not set
-# CONFIG_GCOV is not set
index a54d0efecae1567074ca28ec77edcb70e8bb88ae..a25cd25d55d44d67335527a947655ec89037e460 100644 (file)
@@ -189,7 +189,7 @@ CONFIG_XTERM_CHAN=y
 # CONFIG_NOCONFIG_CHAN is not set
 CONFIG_CON_ZERO_CHAN="fd:0,fd:1"
 CONFIG_CON_CHAN="xterm"
-CONFIG_SSL_CHAN="pty"
+CONFIG_SSL_CHAN="pts"
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -527,3 +527,4 @@ CONFIG_FORCED_INLINING=y
 # CONFIG_RCU_TORTURE_TEST is not set
 # CONFIG_GPROF is not set
 # CONFIG_GCOV is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
index 3aa351611763cbcf625f5cc6a09b4f4aad41ea5f..368d3e97dfd9a85a918c5455fb63390f3f0ab197 100644 (file)
@@ -203,22 +203,37 @@ void chan_enable_winch(struct list_head *chans, struct tty_struct *tty)
        }
 }
 
-void enable_chan(struct line *line)
+int enable_chan(struct line *line)
 {
        struct list_head *ele;
        struct chan *chan;
+       int err;
 
        list_for_each(ele, &line->chan_list){
                chan = list_entry(ele, struct chan, list);
-               if(open_one_chan(chan))
+               err = open_one_chan(chan);
+               if (err) {
+                       if (chan->primary)
+                               goto out_close;
+
                        continue;
+               }
 
                if(chan->enabled)
                        continue;
-               line_setup_irq(chan->fd, chan->input, chan->output, line,
-                              chan);
+               err = line_setup_irq(chan->fd, chan->input, chan->output, line,
+                                    chan);
+               if (err)
+                       goto out_close;
+
                chan->enabled = 1;
        }
+
+       return 0;
+
+ out_close:
+       close_chan(&line->chan_list, 0);
+       return err;
 }
 
 /* Items are added in IRQ context, when free_irq can't be called, and
index 13f0bf852b2a195e8b15ceab084c51e6153ad3eb..4d438f36ea2e66b68451dd6f9039b28e6dab11c2 100644 (file)
@@ -51,19 +51,21 @@ error:
 /*
  * UML SIGWINCH handling
  *
- * The point of this is to handle SIGWINCH on consoles which have host ttys and
- * relay them inside UML to whatever might be running on the console and cares
- * about the window size (since SIGWINCH notifies about terminal size changes).
+ * The point of this is to handle SIGWINCH on consoles which have host
+ * ttys and relay them inside UML to whatever might be running on the
+ * console and cares about the window size (since SIGWINCH notifies
+ * about terminal size changes).
  *
- * So, we have a separate thread for each host tty attached to a UML device
- * (side-issue - I'm annoyed that one thread can't have multiple controlling
- * ttys for purposed of handling SIGWINCH, but I imagine there are other reasons
- * that doesn't make any sense).
+ * So, we have a separate thread for each host tty attached to a UML
+ * device (side-issue - I'm annoyed that one thread can't have
+ * multiple controlling ttys for the purpose of handling SIGWINCH, but
+ * I imagine there are other reasons that doesn't make any sense).
  *
- * SIGWINCH can't be received synchronously, so you have to set up to receive it
- * as a signal.  That being the case, if you are going to wait for it, it is
- * convenient to sit in sigsuspend() and wait for the signal to bounce you out of
- * it (see below for how we make sure to exit only on SIGWINCH).
+ * SIGWINCH can't be received synchronously, so you have to set up to
+ * receive it as a signal.  That being the case, if you are going to
+ * wait for it, it is convenient to sit in sigsuspend() and wait for
+ * the signal to bounce you out of it (see below for how we make sure
+ * to exit only on SIGWINCH).
  */
 
 static void winch_handler(int sig)
@@ -112,7 +114,8 @@ static int winch_thread(void *arg)
 
        err = os_new_tty_pgrp(pty_fd, os_getpid());
        if(err < 0){
-               printk("winch_thread : new_tty_pgrp failed, err = %d\n", -err);
+               printk("winch_thread : new_tty_pgrp failed on fd %d, "
+                      "err = %d\n", pty_fd, -err);
                exit(1);
        }
 
@@ -126,8 +129,9 @@ static int winch_thread(void *arg)
                       "err = %d\n", -count);
 
        while(1){
-               /* This will be interrupted by SIGWINCH only, since other signals
-                * are blocked.*/
+               /* This will be interrupted by SIGWINCH only, since
+                * other signals are blocked.
+                */
                sigsuspend(&sigs);
 
                count = os_write_file(pipe_fd, &c, sizeof(c));
@@ -137,10 +141,10 @@ static int winch_thread(void *arg)
        }
 }
 
-static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out)
+static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out,
+                      unsigned long *stack_out)
 {
        struct winch_data data;
-       unsigned long stack;
        int fds[2], n, err;
        char c;
 
@@ -153,9 +157,11 @@ static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out)
        data = ((struct winch_data) { .pty_fd           = fd,
                                      .pipe_fd          = fds[1] } );
        /* CLONE_FILES so this thread doesn't hold open files which are open
-        * now, but later closed.  This is a problem with /dev/net/tun.
+        * now, but later closed in a different thread.  This is a
+        * problem with /dev/net/tun, which if held open by this
+        * thread, prevents the TUN/TAP device from being reused.
         */
-       err = run_helper_thread(winch_thread, &data, CLONE_FILES, &stack, 0);
+       err = run_helper_thread(winch_thread, &data, CLONE_FILES, stack_out);
        if(err < 0){
                printk("fork of winch_thread failed - errno = %d\n", -err);
                goto out_close;
@@ -170,7 +176,13 @@ static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out)
                 err = -EINVAL;
                goto out_close;
        }
-       return err ;
+
+       if (os_set_fd_block(*fd_out, 0)) {
+               printk("winch_tramp: failed to set thread_fd non-blocking.\n");
+               goto out_close;
+       }
+
+       return err;
 
  out_close:
        os_close_file(fds[1]);
@@ -181,25 +193,25 @@ static int winch_tramp(int fd, struct tty_struct *tty, int *fd_out)
 
 void register_winch(int fd, struct tty_struct *tty)
 {
-       int pid, thread, thread_fd = -1;
-       int count;
+       unsigned long stack;
+       int pid, thread, count, thread_fd = -1;
        char c = 1;
 
        if(!isatty(fd))
                return;
 
        pid = tcgetpgrp(fd);
-       if(!CHOOSE_MODE_PROC(is_tracer_winch, is_skas_winch, pid, fd,
-                            tty) && (pid == -1)){
-               thread = winch_tramp(fd, tty, &thread_fd);
-               if(thread > 0){
-                       register_winch_irq(thread_fd, fd, thread, tty);
-
-                       count = os_write_file(thread_fd, &c, sizeof(c));
-                       if(count != sizeof(c))
-                               printk("register_winch : failed to write "
-                                      "synchronization byte, err = %d\n",
-                                       -count);
-               }
+       if (!CHOOSE_MODE_PROC(is_tracer_winch, is_skas_winch, pid, fd, tty) &&
+           (pid == -1)) {
+               thread = winch_tramp(fd, tty, &thread_fd, &stack);
+               if (thread < 0)
+                       return;
+
+               register_winch_irq(thread_fd, fd, thread, tty, stack);
+
+               count = os_write_file(thread_fd, &c, sizeof(c));
+               if(count != sizeof(c))
+                       printk("register_winch : failed to write "
+                              "synchronization byte, err = %d\n", -count);
        }
 }
index 15453845d2bab85eaa1c1a15f59740779eb225f3..ca8c9e11a39b9f94361b10c6739e8712ec3a932c 100644 (file)
@@ -8,7 +8,7 @@
 
 static inline void *cow_malloc(int size)
 {
-       return um_kmalloc(size);
+       return kmalloc(size, UM_GFP_KERNEL);
 }
 
 static inline void cow_free(void *ptr)
index b869e3899683e548d6f98e17ec9959e801ef8a6b..8d2008f0668282e7c9bcc4d61d95ff9e08fbe619 100644 (file)
@@ -35,7 +35,7 @@ static struct sockaddr_un *new_addr(void *name, int len)
 {
        struct sockaddr_un *sun;
 
-       sun = um_kmalloc(sizeof(struct sockaddr_un));
+       sun = kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL);
        if(sun == NULL){
                printk("new_addr: allocation of sockaddr_un failed\n");
                return NULL;
@@ -83,7 +83,7 @@ static int connect_to_switch(struct daemon_data *pri)
                goto out_close;
        }
 
-       sun = um_kmalloc(sizeof(struct sockaddr_un));
+       sun = kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL);
        if(sun == NULL){
                printk("new_addr: allocation of sockaddr_un failed\n");
                err = -ENOMEM;
index 7f083ec47a4f03bec098b528b000c1be0fb327d4..39c01ffd45c92a7cb9d2b9a52fb57a0eb2dea2e7 100644 (file)
@@ -37,7 +37,7 @@ static void *fd_init(char *str, int device, const struct chan_opts *opts)
                printk("fd_init : couldn't parse file descriptor '%s'\n", str);
                return(NULL);
        }
-       data = um_kmalloc(sizeof(*data));
+       data = kmalloc(sizeof(*data), UM_GFP_KERNEL);
        if(data == NULL) return(NULL);
        *data = ((struct fd_chan) { .fd         = n,
                                    .raw        = opts->raw });
index 5eeecf8917c3158b31a6ef960a14a7d9312f4d1b..1171790f742c33c79fe41b18fe4801947cc640d8 100644 (file)
@@ -68,7 +68,7 @@ int start_watchdog(int *in_fd_ret, int *out_fd_ret, char *sock)
                args = pid_args;
        }
 
-       pid = run_helper(pre_exec, &data, args, NULL);
+       pid = run_helper(pre_exec, &data, args);
 
        os_close_file(out_fds[0]);
        os_close_file(in_fds[1]);
index 4bd40bb43ec27f3935306fb784e84bdf160172a4..3e0b68e297f2426a3701c4acc0c62a332c0b85ee 100644 (file)
@@ -454,7 +454,10 @@ int line_open(struct line *lines, struct tty_struct *tty)
        tty->driver_data = line;
        line->tty = tty;
 
-       enable_chan(line);
+       err = enable_chan(line);
+       if (err)
+               return err;
+
        INIT_DELAYED_WORK(&line->task, line_timer_cb);
 
        if(!line->sigio){
@@ -746,8 +749,24 @@ struct winch {
        int tty_fd;
        int pid;
        struct tty_struct *tty;
+       unsigned long stack;
 };
 
+static void free_winch(struct winch *winch, int free_irq_ok)
+{
+       list_del(&winch->list);
+
+       if (winch->pid != -1)
+               os_kill_process(winch->pid, 1);
+       if (winch->fd != -1)
+               os_close_file(winch->fd);
+       if (winch->stack != 0)
+               free_stack(winch->stack, 0);
+       if (free_irq_ok)
+               free_irq(WINCH_IRQ, winch);
+       kfree(winch);
+}
+
 static irqreturn_t winch_interrupt(int irq, void *data)
 {
        struct winch *winch = data;
@@ -764,12 +783,13 @@ static irqreturn_t winch_interrupt(int irq, void *data)
                                       "errno = %d\n", -err);
                                printk("fd %d is losing SIGWINCH support\n",
                                       winch->tty_fd);
+                               free_winch(winch, 0);
                                return IRQ_HANDLED;
                        }
                        goto out;
                }
        }
-       tty  = winch->tty;
+       tty = winch->tty;
        if (tty != NULL) {
                line = tty->driver_data;
                chan_window_size(&line->chan_list, &tty->winsize.ws_row,
@@ -782,43 +802,44 @@ static irqreturn_t winch_interrupt(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-void register_winch_irq(int fd, int tty_fd, int pid, struct tty_struct *tty)
+void register_winch_irq(int fd, int tty_fd, int pid, struct tty_struct *tty,
+                       unsigned long stack)
 {
        struct winch *winch;
 
        winch = kmalloc(sizeof(*winch), GFP_KERNEL);
        if (winch == NULL) {
                printk("register_winch_irq - kmalloc failed\n");
-               return;
+               goto cleanup;
        }
 
        *winch = ((struct winch) { .list        = LIST_HEAD_INIT(winch->list),
                                   .fd          = fd,
                                   .tty_fd      = tty_fd,
                                   .pid         = pid,
-                                  .tty         = tty });
+                                  .tty         = tty,
+                                  .stack       = stack });
+
+       if (um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt,
+                          IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM,
+                          "winch", winch) < 0) {
+               printk("register_winch_irq - failed to register IRQ\n");
+               goto out_free;
+       }
 
        spin_lock(&winch_handler_lock);
        list_add(&winch->list, &winch_handlers);
        spin_unlock(&winch_handler_lock);
 
-       if(um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt,
-                         IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM,
-                         "winch", winch) < 0)
-               printk("register_winch_irq - failed to register IRQ\n");
-}
-
-static void free_winch(struct winch *winch)
-{
-       list_del(&winch->list);
-
-       if(winch->pid != -1)
-               os_kill_process(winch->pid, 1);
-       if(winch->fd != -1)
-               os_close_file(winch->fd);
+       return;
 
-       free_irq(WINCH_IRQ, winch);
+ out_free:
        kfree(winch);
+ cleanup:
+       os_kill_process(pid, 1);
+       os_close_file(fd);
+       if (stack != 0)
+               free_stack(stack, 0);
 }
 
 static void unregister_winch(struct tty_struct *tty)
@@ -831,7 +852,7 @@ static void unregister_winch(struct tty_struct *tty)
        list_for_each(ele, &winch_handlers){
                winch = list_entry(ele, struct winch, list);
                 if(winch->tty == tty){
-                       free_winch(winch);
+                       free_winch(winch, 1);
                        break;
                 }
         }
@@ -847,7 +868,7 @@ static void winch_cleanup(void)
 
        list_for_each_safe(ele, next, &winch_handlers){
                winch = list_entry(ele, struct winch, list);
-               free_winch(winch);
+               free_winch(winch, 1);
        }
 
        spin_unlock(&winch_handler_lock);
index d319db16d4ec30af79eb58f161540d7e68a5d0b2..236a3dfc297d513dbbefbfab729932906455b0df 100644 (file)
@@ -30,7 +30,7 @@ static struct sockaddr_in *new_addr(char *addr, unsigned short port)
 {
        struct sockaddr_in *sin;
 
-       sin = um_kmalloc(sizeof(struct sockaddr_in));
+       sin = kmalloc(sizeof(struct sockaddr_in), UM_GFP_KERNEL);
        if(sin == NULL){
                printk("new_addr: allocation of sockaddr_in failed\n");
                return NULL;
index 62e5ad63181a69c999b61dc40f0e4083c8e1a0ba..f31e71546e52b1f26ddadff022a421273ab66a9d 100644 (file)
@@ -86,8 +86,9 @@ int mconsole_get_request(int fd, struct mc_request *req)
        int len;
 
        req->originlen = sizeof(req->origin);
-       req->len = recvfrom(fd, &req->request, sizeof(req->request), 0,
-                           (struct sockaddr *) req->origin, &req->originlen);
+       req->len = recvfrom(fd, &req->request, sizeof(req->request),
+                           MSG_DONTWAIT, (struct sockaddr *) req->origin,
+                           &req->originlen);
        if (req->len < 0)
                return 0;
 
index 3503cff867c34d1166466c5da5acc6a14de3f46d..da946e3e1bf26322a3d7078c53868ca005378ec2 100644 (file)
@@ -187,7 +187,7 @@ static int change_tramp(char **argv, char *output, int output_len)
        }
        pe_data.close_me = fds[0];
        pe_data.stdout = fds[1];
-       pid = run_helper(change_pre_exec, &pe_data, argv, NULL);
+       pid = run_helper(change_pre_exec, &pe_data, argv);
 
        if (pid > 0)    /* Avoid hang as we won't get data in failure case. */
                read_output(fds[0], output, output_len);
@@ -217,7 +217,7 @@ static void change(char *dev, char *what, unsigned char *addr,
                netmask[2], netmask[3]);
 
        output_len = UM_KERN_PAGE_SIZE;
-       output = um_kmalloc(output_len);
+       output = kmalloc(output_len, UM_GFP_KERNEL);
        if(output == NULL)
                printk("change : failed to allocate output buffer\n");
 
index 3f6357d24bee19bc69a469fec39555a138de9f3a..c799b00012c7fa898aa4ae8fa4711d36603ad93c 100644 (file)
@@ -50,7 +50,7 @@ static void *port_init(char *str, int device, const struct chan_opts *opts)
        if(kern_data == NULL)
                return NULL;
 
-       data = um_kmalloc(sizeof(*data));
+       data = kmalloc(sizeof(*data), UM_GFP_KERNEL);
        if(data == NULL)
                goto err;
 
@@ -188,7 +188,7 @@ int port_connection(int fd, int *socket, int *pid_out)
                { .sock_fd              = new,
                  .pipe_fd              = socket[1] });
 
-       err = run_helper(port_pre_exec, &data, argv, NULL);
+       err = run_helper(port_pre_exec, &data, argv);
        if(err < 0)
                goto out_shutdown;
 
index df4976c9eef223df0f94ca1a27c5aec800b08467..1e3fd619a83732f53244f1b025661557bc020955 100644 (file)
@@ -1,5 +1,5 @@
 /* 
- * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
+ * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
  * Licensed under the GPL
  */
 
@@ -7,12 +7,14 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
+#include <fcntl.h>
 #include <errno.h>
 #include <termios.h>
+#include <sys/stat.h>
 #include "chan_user.h"
-#include "user.h"
-#include "kern_util.h"
 #include "os.h"
+#include "user.h"
+#include "kern_constants.h"
 #include "um_malloc.h"
 
 struct pty_chan {
@@ -27,12 +29,14 @@ static void *pty_chan_init(char *str, int device, const struct chan_opts *opts)
 {
        struct pty_chan *data;
 
-       data = um_kmalloc(sizeof(*data));
-       if(data == NULL) return(NULL);
+       data = kmalloc(sizeof(*data), UM_GFP_KERNEL);
+       if (data == NULL)
+               return NULL;
+
        *data = ((struct pty_chan) { .announce          = opts->announce, 
                                     .dev               = device,
                                     .raw               = opts->raw });
-       return(data);
+       return data;
 }
 
 static int pts_open(int input, int output, int primary, void *d,
@@ -43,31 +47,35 @@ static int pts_open(int input, int output, int primary, void *d,
        int fd, err;
 
        fd = get_pty();
-       if(fd < 0){
+       if (fd < 0) {
                err = -errno;
-               printk("open_pts : Failed to open pts\n");
+               printk(UM_KERN_ERR "open_pts : Failed to open pts\n");
                return err;
        }
-       if(data->raw){
+
+       if (data->raw) {
                CATCH_EINTR(err = tcgetattr(fd, &data->tt));
-               if(err)
-                       return(err);
+               if (err)
+                       return err;
 
                err = raw(fd);
-               if(err)
-                       return(err);
+               if (err)
+                       return err;
        }
 
        dev = ptsname(fd);
        sprintf(data->dev_name, "%s", dev);
        *dev_out = data->dev_name;
+
        if (data->announce)
                (*data->announce)(dev, data->dev);
-       return(fd);
+
+       return fd;
 }
 
 static int getmaster(char *line)
 {
+       struct stat buf;
        char *pty, *bank, *cp;
        int master, err;
 
@@ -75,24 +83,29 @@ static int getmaster(char *line)
        for (bank = "pqrs"; *bank; bank++) {
                line[strlen("/dev/pty")] = *bank;
                *pty = '0';
-               if (os_stat_file(line, NULL) < 0)
+               /* Did we hit the end ? */
+               if ((stat(line, &buf) < 0) && (errno == ENOENT))
                        break;
+
                for (cp = "0123456789abcdef"; *cp; cp++) {
                        *pty = *cp;
-                       master = os_open_file(line, of_rdwr(OPENFLAGS()), 0);
+                       master = open(line, O_RDWR);
                        if (master >= 0) {
                                char *tp = &line[strlen("/dev/")];
 
                                /* verify slave side is usable */
                                *tp = 't';
-                               err = os_access(line, OS_ACC_RW_OK);
+                               err = access(line, R_OK | W_OK);
                                *tp = 'p';
-                               if(err == 0) return(master);
-                               (void) os_close_file(master);
+                               if(!err)
+                                       return master;
+                               close(master);
                        }
                }
        }
-       return(-1);
+
+       printk(UM_KERN_ERR "getmaster - no usable host pty devices\n");
+       return -ENOENT;
 }
 
 static int pty_open(int input, int output, int primary, void *d,
@@ -103,20 +116,22 @@ static int pty_open(int input, int output, int primary, void *d,
        char dev[sizeof("/dev/ptyxx\0")] = "/dev/ptyxx";
 
        fd = getmaster(dev);
-       if(fd < 0)
-               return(-errno);
+       if (fd < 0)
+               return fd;
 
        if(data->raw){
                err = raw(fd);
-               if(err)
-                       return(err);
+               if (err)
+                       return err;
        }
        
-       if(data->announce) (*data->announce)(dev, data->dev);
+       if (data->announce)
+               (*data->announce)(dev, data->dev);
 
        sprintf(data->dev_name, "%s", dev);
        *dev_out = data->dev_name;
-       return(fd);
+
+       return fd;
 }
 
 const struct chan_ops pty_ops = {
@@ -144,14 +159,3 @@ const struct chan_ops pts_ops = {
        .free           = generic_free,
        .winch          = 0,
 };
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
index 78f0e515da8f792ca57334d6ea1a5f26c0657638..c0b73c28cff0f7e5615a27f13a339752287fffad 100644 (file)
@@ -85,13 +85,13 @@ static int slip_tramp(char **argv, int fd)
        pe_data.stdin = fd;
        pe_data.stdout = fds[1];
        pe_data.close_me = fds[0];
-       err = run_helper(slip_pre_exec, &pe_data, argv, NULL);
+       err = run_helper(slip_pre_exec, &pe_data, argv);
        if(err < 0)
                goto out_close;
        pid = err;
 
        output_len = UM_KERN_PAGE_SIZE;
-       output = um_kmalloc(output_len);
+       output = kmalloc(output_len, UM_GFP_KERNEL);
        if(output == NULL){
                printk("slip_tramp : failed to allocate output buffer\n");
                os_kill_process(pid, 1);
index 39f889fe994966a54a00b5818bfbf42f77a3c55a..0e462f64f227f6cae75b4fa95e28bc13450a0aa6 100644 (file)
@@ -42,7 +42,7 @@ static int slirp_tramp(char **argv, int fd)
 
        pe_data.stdin = fd;
        pe_data.stdout = fd;
-       pid = run_helper(slirp_pre_exec, &pe_data, argv, NULL);
+       pid = run_helper(slirp_pre_exec, &pe_data, argv);
 
        return(pid);
 }
index fd09ad9e9c0aa704e1d05d621fa9ed0c166d5a83..875d60d0c6a25da5ab3694378dfe22fec4bf1004 100644 (file)
@@ -42,8 +42,6 @@ static struct chan_opts opts = {
        .announce       = ssl_announce,
        .xterm_title    = "Serial Line #%d",
        .raw            = 1,
-       .tramp_stack    = 0,
-       .in_kernel      = 1,
 };
 
 static int ssl_config(char *str, char **error_out);
@@ -99,7 +97,13 @@ static int ssl_remove(int n, char **error_out)
 
 static int ssl_open(struct tty_struct *tty, struct file *filp)
 {
-       return line_open(serial_lines, tty);
+       int err = line_open(serial_lines, tty);
+
+       if (err)
+               printk(KERN_ERR "Failed to open serial line %d, err = %d\n",
+                      tty->index, err);
+
+       return err;
 }
 
 #if 0
index 2bb4193ac1aafd4289883f97a2233a2be53f2704..656036e90b196958d13e593bcff3180ebb4a25cd 100644 (file)
@@ -46,8 +46,6 @@ static struct chan_opts opts = {
        .announce       = stdio_announce,
        .xterm_title    = "Virtual Console #%d",
        .raw            = 1,
-       .tramp_stack    = 0,
-       .in_kernel      = 1,
 };
 
 static int con_config(char *str, char **error_out);
@@ -101,7 +99,12 @@ static int con_remove(int n, char **error_out)
 
 static int con_open(struct tty_struct *tty, struct file *filp)
 {
-       return line_open(vts, tty);
+       int err = line_open(vts, tty);
+       if (err)
+               printk(KERN_ERR "Failed to open console %d, err = %d\n",
+                      tty->index, err);
+
+       return err;
 }
 
 /* Set in an initcall, checked in an exitcall */
index c07d0d56278029ea8ed040c6cc5b17ce4e520723..a9f87e19c5bf9f283faf134f52ad9f0de4b5fdd1 100644 (file)
@@ -29,7 +29,7 @@ static void *tty_chan_init(char *str, int device, const struct chan_opts *opts)
        }
        str++;
 
-       data = um_kmalloc(sizeof(*data));
+       data = kmalloc(sizeof(*data), UM_GFP_KERNEL);
        if(data == NULL)
                return NULL;
        *data = ((struct tty_chan) { .dev       = str,
index 2e09f162c42f01b6ac39f3689eae208f5d4b75b1..fc27f6c72b41d606ecae66f4c8bbdfeb8ca8c252 100644 (file)
@@ -712,6 +712,8 @@ static int ubd_add(int n, char **error_out)
        ubd_dev->queue->queuedata = ubd_dev;
 
        blk_queue_max_hw_segments(ubd_dev->queue, MAX_SG);
+       if(ubd_dev->cow.file != NULL)
+               blk_queue_max_sectors(ubd_dev->queue, 8 * sizeof(long));
        err = ubd_disk_register(MAJOR_NR, ubd_dev->size, n, &ubd_gendisk[n]);
        if(err){
                *error_out = "Failed to register device";
@@ -1083,7 +1085,7 @@ static void do_ubd_request(request_queue_t *q)
 {
        struct io_thread_req *io_req;
        struct request *req;
-       int n;
+       int n, last_sectors;
 
        while(1){
                struct ubd *dev = q->queuedata;
@@ -1099,9 +1101,11 @@ static void do_ubd_request(request_queue_t *q)
                }
 
                req = dev->request;
+               last_sectors = 0;
                while(dev->start_sg < dev->end_sg){
                        struct scatterlist *sg = &dev->sg[dev->start_sg];
 
+                       req->sector += last_sectors;
                        io_req = kmalloc(sizeof(struct io_thread_req),
                                         GFP_ATOMIC);
                        if(io_req == NULL){
@@ -1113,6 +1117,7 @@ static void do_ubd_request(request_queue_t *q)
                                        (unsigned long long) req->sector << 9,
                                        sg->offset, sg->length, sg->page);
 
+                       last_sectors = sg->length >> 9;
                        n = os_write_file(thread_fd, &io_req,
                                          sizeof(struct io_thread_req *));
                        if(n != sizeof(struct io_thread_req *)){
@@ -1124,7 +1129,6 @@ static void do_ubd_request(request_queue_t *q)
                                return;
                        }
 
-                       req->sector += sg->length >> 9;
                        dev->start_sg++;
                }
                dev->end_sg = 0;
index 4707b3f14c2fcf45029a0c4ae65d84bfad5004e8..41d254bd38df5222d06f6d08e643dda7469df524 100644 (file)
@@ -43,6 +43,12 @@ int start_io_thread(unsigned long sp, int *fd_out)
        kernel_fd = fds[0];
        *fd_out = fds[1];
 
+       err = os_set_fd_block(*fd_out, 0);
+       if (err) {
+               printk("start_io_thread - failed to set nonblocking I/O.\n");
+               goto out_close;
+       }
+
        pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM | SIGCHLD,
                    NULL);
        if(pid < 0){
index 571c2b3325d573a1819d47b9d4e69f18a1c40540..fd817e5415435564fcf359945a7362b6ad38db23 100644 (file)
@@ -1,22 +1,20 @@
 /* 
- * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
+ * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
  * Licensed under the GPL
  */
 
-#include <stdio.h>
 #include <stdlib.h>
+#include <stdio.h>
 #include <unistd.h>
 #include <string.h>
 #include <errno.h>
 #include <termios.h>
-#include <signal.h>
-#include <sched.h>
-#include <sys/socket.h>
-#include "kern_util.h"
 #include "chan_user.h"
-#include "user.h"
 #include "os.h"
+#include "init.h"
+#include "user.h"
 #include "xterm.h"
+#include "kern_constants.h"
 
 struct xterm_chan {
        int pid;
@@ -25,25 +23,21 @@ struct xterm_chan {
        int device;
        int raw;
        struct termios tt;
-       unsigned long stack;
-       int direct_rcv;
 };
 
-/* Not static because it's called directly by the tt mode gdb code */
-void *xterm_init(char *str, int device, const struct chan_opts *opts)
+static void *xterm_init(char *str, int device, const struct chan_opts *opts)
 {
        struct xterm_chan *data;
 
        data = malloc(sizeof(*data));
-       if(data == NULL) return(NULL);
-       *data = ((struct xterm_chan) { .pid             = -1, 
+       if (data == NULL)
+               return NULL;
+       *data = ((struct xterm_chan) { .pid             = -1,
                                       .helper_pid      = -1,
-                                      .device          = device, 
+                                      .device          = device,
                                       .title           = opts->xterm_title,
-                                      .raw             = opts->raw,
-                                      .stack           = opts->tramp_stack,
-                                      .direct_rcv      = !opts->in_kernel } );
-       return(data);
+                                      .raw             = opts->raw } );
+       return data;
 }
 
 /* Only changed by xterm_setup, which is a setup */
@@ -57,16 +51,22 @@ static int __init xterm_setup(char *line, int *add)
        terminal_emulator = line;
 
        line = strchr(line, ',');
-       if(line == NULL) return(0);
+       if (line == NULL)
+               return 0;
+
        *line++ = '\0';
-       if(*line) title_switch = line;
+       if (*line)
+               title_switch = line;
 
        line = strchr(line, ',');
-       if(line == NULL) return(0);
+       if (line == NULL)
+               return 0;
+
        *line++ = '\0';
-       if(*line) exec_switch = line;
+       if (*line)
+               exec_switch = line;
 
-       return(0);
+       return 0;
 }
 
 __uml_setup("xterm=", xterm_setup,
@@ -82,107 +82,128 @@ __uml_setup("xterm=", xterm_setup,
 "    are 'xterm=gnome-terminal,-t,-x'.\n\n"
 );
 
-/* XXX This badly needs some cleaning up in the error paths
- * Not static because it's called directly by the tt mode gdb code
- */
-int xterm_open(int input, int output, int primary, void *d,
+static int xterm_open(int input, int output, int primary, void *d,
                      char **dev_out)
 {
        struct xterm_chan *data = d;
-       unsigned long stack;
        int pid, fd, new, err;
        char title[256], file[] = "/tmp/xterm-pipeXXXXXX";
-       char *argv[] = { terminal_emulator, title_switch, title, exec_switch, 
+       char *argv[] = { terminal_emulator, title_switch, title, exec_switch,
                         "/usr/lib/uml/port-helper", "-uml-socket",
                         file, NULL };
 
-       if(os_access(argv[4], OS_ACC_X_OK) < 0)
+       if (access(argv[4], X_OK) < 0)
                argv[4] = "port-helper";
 
        /* Check that DISPLAY is set, this doesn't guarantee the xterm
         * will work but w/o it we can be pretty sure it won't. */
-       if (!getenv("DISPLAY")) {
-               printk("xterm_open: $DISPLAY not set.\n");
+       if (getenv("DISPLAY") == NULL) {
+               printk(UM_KERN_ERR "xterm_open: $DISPLAY not set.\n");
                return -ENODEV;
        }
 
+       /*
+        * This business of getting a descriptor to a temp file,
+        * deleting the file and closing the descriptor is just to get
+        * a known-unused name for the Unix socket that we really
+        * want.
+        */
        fd = mkstemp(file);
-       if(fd < 0){
+       if (fd < 0) {
                err = -errno;
-               printk("xterm_open : mkstemp failed, errno = %d\n", errno);
+               printk(UM_KERN_ERR "xterm_open : mkstemp failed, errno = %d\n",
+                      errno);
                return err;
        }
 
-       if(unlink(file)){
+       if (unlink(file)) {
                err = -errno;
-               printk("xterm_open : unlink failed, errno = %d\n", errno);
+               printk(UM_KERN_ERR "xterm_open : unlink failed, errno = %d\n",
+                      errno);
                return err;
        }
-       os_close_file(fd);
+       close(fd);
 
        fd = os_create_unix_socket(file, sizeof(file), 1);
-       if(fd < 0){
-               printk("xterm_open : create_unix_socket failed, errno = %d\n", 
-                      -fd);
-               return(fd);
+       if (fd < 0) {
+               printk(UM_KERN_ERR "xterm_open : create_unix_socket failed, "
+                      "errno = %d\n", -fd);
+               return fd;
        }
 
        sprintf(title, data->title, data->device);
-       stack = data->stack;
-       pid = run_helper(NULL, NULL, argv, &stack);
-       if(pid < 0){
-               printk("xterm_open : run_helper failed, errno = %d\n", -pid);
-               return(pid);
+       pid = run_helper(NULL, NULL, argv);
+       if (pid < 0) {
+               err = pid;
+               printk(UM_KERN_ERR "xterm_open : run_helper failed, "
+                      "errno = %d\n", -err);
+               goto out_close1;
        }
 
-       if (data->direct_rcv) {
-               new = os_rcv_fd(fd, &data->helper_pid);
-       } else {
-               err = os_set_fd_block(fd, 0);
-               if(err < 0){
-                       printk("xterm_open : failed to set descriptor "
-                              "non-blocking, err = %d\n", -err);
-                       return(err);
-               }
-               new = xterm_fd(fd, &data->helper_pid);
+       err = os_set_fd_block(fd, 0);
+       if (err < 0) {
+               printk(UM_KERN_ERR "xterm_open : failed to set descriptor "
+                      "non-blocking, err = %d\n", -err);
+               goto out_kill;
        }
-       if(new < 0){
-               printk("xterm_open : os_rcv_fd failed, err = %d\n", -new);
-               goto out;
+
+       new = xterm_fd(fd, &data->helper_pid);
+       if (new < 0) {
+               err = new;
+               printk(UM_KERN_ERR "xterm_open : os_rcv_fd failed, err = %d\n",
+                      -err);
+               goto out_kill;
+       }
+
+       err = os_set_fd_block(new, 0);
+       if (err) {
+               printk(UM_KERN_ERR "xterm_open : failed to set xterm "
+                      "descriptor non-blocking, err = %d\n", -err);
+               goto out_close2;
        }
 
        CATCH_EINTR(err = tcgetattr(new, &data->tt));
-       if(err){
+       if (err) {
                new = err;
-               goto out;
+               goto out_close2;
        }
 
-       if(data->raw){
+       if (data->raw) {
                err = raw(new);
-               if(err){
+               if (err) {
                        new = err;
-                       goto out;
+                       goto out_close2;
                }
        }
 
+       unlink(file);
        data->pid = pid;
        *dev_out = NULL;
- out:
-       unlink(file);
-       return(new);
+
+       return new;
+
+ out_close2:
+       close(new);
+ out_kill:
+       os_kill_process(pid, 1);
+ out_close1:
+       close(fd);
+
+       return err;
 }
 
-/* Not static because it's called directly by the tt mode gdb code */
-void xterm_close(int fd, void *d)
+static void xterm_close(int fd, void *d)
 {
        struct xterm_chan *data = d;
        
-       if(data->pid != -1) 
+       if (data->pid != -1)
                os_kill_process(data->pid, 1);
        data->pid = -1;
-       if(data->helper_pid != -1) 
+
+       if (data->helper_pid != -1)
                os_kill_process(data->helper_pid, 0);
        data->helper_pid = -1;
+
        os_close_file(fd);
 }
 
@@ -203,14 +224,3 @@ const struct chan_ops xterm_ops = {
        .free           = xterm_free,
        .winch          = 1,
 };
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
index a4ce7058e10e7c360fd0f72f049d6183530dc4eb..b646bccef37aa8586fb95701a6c750d1246aa8c3 100644 (file)
@@ -1,18 +1,14 @@
 /* 
- * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
+ * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
  * Licensed under the GPL
  */
 
-#include "linux/errno.h"
-#include "linux/slab.h"
-#include "linux/signal.h"
-#include "linux/interrupt.h"
-#include "asm/irq.h"
-#include "irq_user.h"
+#include <linux/slab.h>
+#include <linux/completion.h>
+#include <linux/irqreturn.h>
+#include <asm/irq.h>
 #include "irq_kern.h"
-#include "kern_util.h"
 #include "os.h"
-#include "xterm.h"
 
 struct xterm_wait {
        struct completion ready;
@@ -27,12 +23,13 @@ static irqreturn_t xterm_interrupt(int irq, void *data)
        int fd;
 
        fd = os_rcv_fd(xterm->fd, &xterm->pid);
-       if(fd == -EAGAIN)
-               return(IRQ_NONE);
+       if (fd == -EAGAIN)
+               return IRQ_NONE;
 
        xterm->new_fd = fd;
        complete(&xterm->ready);
-       return(IRQ_HANDLED);
+
+       return IRQ_HANDLED;
 }
 
 int xterm_fd(int socket, int *pid_out)
@@ -41,22 +38,21 @@ int xterm_fd(int socket, int *pid_out)
        int err, ret;
 
        data = kmalloc(sizeof(*data), GFP_KERNEL);
-       if(data == NULL){
+       if (data == NULL) {
                printk(KERN_ERR "xterm_fd : failed to allocate xterm_wait\n");
-               return(-ENOMEM);
+               return -ENOMEM;
        }
 
        /* This is a locked semaphore... */
-       *data = ((struct xterm_wait) 
-               { .fd           = socket,
-                 .pid          = -1,
-                 .new_fd       = -1 });
+       *data = ((struct xterm_wait) { .fd              = socket,
+                                      .pid             = -1,
+                                      .new_fd          = -1 });
        init_completion(&data->ready);
 
-       err = um_request_irq(XTERM_IRQ, socket, IRQ_READ, xterm_interrupt, 
+       err = um_request_irq(XTERM_IRQ, socket, IRQ_READ, xterm_interrupt,
                             IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM,
                             "xterm", data);
-       if (err){
+       if (err) {
                printk(KERN_ERR "xterm_fd : failed to get IRQ for xterm, "
                       "err = %d\n",  err);
                ret = err;
@@ -76,16 +72,5 @@ int xterm_fd(int socket, int *pid_out)
  out:
        kfree(data);
 
-       return(ret);
+       return ret;
 }
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
index c4b41bb1035f6f8ef10a193b92bea717650711fc..624b5100a3cd778e5d7293cda886e16bae5fc943 100644 (file)
@@ -40,7 +40,7 @@ extern int console_open_chan(struct line *line, struct console *co);
 extern void deactivate_chan(struct list_head *chans, int irq);
 extern void reactivate_chan(struct list_head *chans, int irq);
 extern void chan_enable_winch(struct list_head *chans, struct tty_struct *tty);
-extern void enable_chan(struct line *line);
+extern int enable_chan(struct line *line);
 extern void close_chan(struct list_head *chans, int delay_free_irq);
 extern int chan_window_size(struct list_head *chans, 
                             unsigned short *rows_out, 
index 38f16d812e7c29d230aa6d72086ef2f3329b40eb..5a2263e05bb20cb62bf5b8f7eecc02cde8d324b6 100644 (file)
@@ -12,8 +12,6 @@ struct chan_opts {
        void (*const announce)(char *dev_name, int dev);
        char *xterm_title;
        const int raw;
-       const unsigned long tramp_stack;
-       const int in_kernel;
 };
 
 enum chan_init_pri { INIT_STATIC, INIT_ALL, INIT_ONE };
@@ -44,7 +42,8 @@ extern void generic_free(void *data);
 
 struct tty_struct;
 extern void register_winch(int fd,  struct tty_struct *tty);
-extern void register_winch_irq(int fd, int tty_fd, int pid, struct tty_struct *tty);
+extern void register_winch_irq(int fd, int tty_fd, int pid,
+                              struct tty_struct *tty, unsigned long stack);
 
 #define __channel_help(fn, prefix) \
 __uml_help(fn, prefix "[0-9]*=<channel description>\n" \
index 7376ee44e330a878f55737ef7a5ef3529d74ccd1..6eee343e53eb1d446b29f59b4badce413fbc9956 100644 (file)
@@ -27,6 +27,9 @@ DEFINE(UM_ELFCLASS64, ELFCLASS64);
 
 DEFINE(UM_NR_CPUS, NR_CPUS);
 
+DEFINE(UM_GFP_KERNEL, GFP_KERNEL);
+DEFINE(UM_GFP_ATOMIC, GFP_ATOMIC);
+
 /* For crypto assembler code. */
 DEFINE(crypto_tfm_ctx_offset, offsetof(struct crypto_tfm, __crt_ctx));
 
index 4d9fb26387d565290a58ef093d34f3c25d10042b..930b261ea483ddf1e3e777c05e92c867ca7227fc 100644 (file)
@@ -239,11 +239,9 @@ extern unsigned long __do_user_copy(void *to, const void *from, int n,
 /* execvp.c */
 extern int execvp_noalloc(char *buf, const char *file, char *const argv[]);
 /* helper.c */
-extern int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv,
-                     unsigned long *stack_out);
+extern int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv);
 extern int run_helper_thread(int (*proc)(void *), void *arg,
-                            unsigned int flags, unsigned long *stack_out,
-                            int stack_order);
+                            unsigned int flags, unsigned long *stack_out);
 extern int helper_wait(int pid);
 
 
index e6d7c5aa3f4e26202e70e5fd2b325adcff03dbfa..0ad17cb83d96ef6b0ace0a4ea800113a8cc05040 100644 (file)
@@ -6,11 +6,17 @@
 #ifndef __UM_MALLOC_H__
 #define __UM_MALLOC_H__
 
-extern void *um_kmalloc(int size);
-extern void *um_kmalloc_atomic(int size);
+#include "kern_constants.h"
+
+extern void *__kmalloc(int size, int flags);
+static inline void *kmalloc(int size, int flags)
+{
+       return __kmalloc(size, flags);
+}
+
 extern void kfree(const void *ptr);
 
-extern void *um_vmalloc(int size);
+extern void *vmalloc(unsigned long size);
 extern void vfree(void *ptr);
 
 #endif /* __UM_MALLOC_H__ */
index dba04d88b4320bde93b7ce4bee3f728193fd257f..9870febdbead3897b2ed9257ba0548d7e0389159 100644 (file)
@@ -30,7 +30,6 @@
 #include "irq_kern.h"
 #include "os.h"
 #include "sigio.h"
-#include "um_malloc.h"
 #include "misc_constants.h"
 #include "as-layout.h"
 
index 8d2c5496532b942899ad6201665431f6f5aceccc..bfa52f206bb6438d520316db40c70e9a22ca51bb 100644 (file)
@@ -46,7 +46,6 @@
 #include "mode.h"
 #include "mode_kern.h"
 #include "choose-mode.h"
-#include "um_malloc.h"
 
 /* This is a per-cpu array.  A processor only modifies its entry and it only
  * cares about its entry, so it's OK if another processor is modifying its
@@ -262,21 +261,6 @@ void dump_thread(struct pt_regs *regs, struct user *u)
 {
 }
 
-void *um_kmalloc(int size)
-{
-       return kmalloc(size, GFP_KERNEL);
-}
-
-void *um_kmalloc_atomic(int size)
-{
-       return kmalloc(size, GFP_ATOMIC);
-}
-
-void *um_vmalloc(int size)
-{
-       return vmalloc(size);
-}
-
 int __cant_sleep(void) {
        return in_atomic() || irqs_disabled() || in_interrupt();
        /* Is in_interrupt() really needed? */
index 9bf944f6a1dbe75639e4ae029938929c7b0d03d0..b126df4ea168e6f9211b289ee4f033835fa7ec66 100644 (file)
@@ -177,6 +177,7 @@ static int do_not_aio(struct aio_thread_req *req)
 static int aio_req_fd_r = -1;
 static int aio_req_fd_w = -1;
 static int aio_pid = -1;
+static unsigned long aio_stack;
 
 static int not_aio_thread(void *arg)
 {
@@ -212,7 +213,6 @@ static int not_aio_thread(void *arg)
 
 static int init_aio_24(void)
 {
-       unsigned long stack;
        int fds[2], err;
 
        err = os_pipe(fds, 1, 1);
@@ -227,7 +227,7 @@ static int init_aio_24(void)
                goto out_close_pipe;
 
        err = run_helper_thread(not_aio_thread, NULL,
-                               CLONE_FILES | CLONE_VM | SIGCHLD, &stack, 0);
+                               CLONE_FILES | CLONE_VM | SIGCHLD, &aio_stack);
        if(err < 0)
                goto out_close_pipe;
 
@@ -252,7 +252,6 @@ out:
 #define DEFAULT_24_AIO 0
 static int init_aio_26(void)
 {
-       unsigned long stack;
        int err;
 
        if(io_setup(256, &ctx)){
@@ -263,7 +262,7 @@ static int init_aio_26(void)
        }
 
        err = run_helper_thread(aio_thread, NULL,
-                               CLONE_FILES | CLONE_VM | SIGCHLD, &stack, 0);
+                               CLONE_FILES | CLONE_VM | SIGCHLD, &aio_stack);
        if(err < 0)
                return err;
 
@@ -365,8 +364,10 @@ __initcall(init_aio);
 
 static void exit_aio(void)
 {
-       if(aio_pid != -1)
+       if (aio_pid != -1) {
                os_kill_process(aio_pid, 1);
+               free_stack(aio_stack, 0);
+       }
 }
 
 __uml_exitcall(exit_aio);
index acba301612879b4af1d45b96f9b416f8e35a98f6..61d3953c7ac92410aee83a79a6efcd7af50383e1 100644 (file)
@@ -54,7 +54,7 @@ static void etap_change(int op, unsigned char *addr, unsigned char *netmask,
                return;
        }
 
-       output = um_kmalloc(UM_KERN_PAGE_SIZE);
+       output = kmalloc(UM_KERN_PAGE_SIZE, UM_GFP_KERNEL);
        if(output == NULL)
                printk("etap_change : Failed to allocate output buffer\n");
        read_output(fd, output, UM_KERN_PAGE_SIZE);
@@ -117,7 +117,7 @@ static int etap_tramp(char *dev, char *gate, int control_me,
        pe_data.control_remote = control_remote;
        pe_data.control_me = control_me;
        pe_data.data_me = data_me;
-       pid = run_helper(etap_pre_exec, &pe_data, args, NULL);
+       pid = run_helper(etap_pre_exec, &pe_data, args);
 
        if(pid < 0)
                err = pid;
@@ -166,7 +166,7 @@ static int etap_open(void *data)
        err = etap_tramp(pri->dev_name, pri->gate_addr, control_fds[0], 
                         control_fds[1], data_fds[0], data_fds[1]);
        output_len = UM_KERN_PAGE_SIZE;
-       output = um_kmalloc(output_len);
+       output = kmalloc(output_len, UM_GFP_KERNEL);
        read_output(control_fds[0], output, output_len);
 
        if(output == NULL)
index 11a9779dc9f1dea57cd1c0ac808c16d90d111157..f848b4ea9343685a901a91103fa4e2d13b874276 100644 (file)
@@ -83,7 +83,7 @@ static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote,
        data.stdout = remote;
        data.close_me = me;
 
-       pid = run_helper(tuntap_pre_exec, &data, argv, NULL);
+       pid = run_helper(tuntap_pre_exec, &data, argv);
 
        if(pid < 0)
                return -pid;
index 97bed16bf4c73c2817ceffa283589a8aa02753ef..d81af7b8587a8331cae925c71802841ad181cb1e 100644 (file)
@@ -44,17 +44,13 @@ static int helper_child(void *arg)
 /* Returns either the pid of the child process we run or -E* on failure.
  * XXX The alloc_stack here breaks if this is called in the tracing thread, so
  * we need to receive a preallocated stack (a local buffer is ok). */
-int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv,
-              unsigned long *stack_out)
+int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv)
 {
        struct helper_data data;
        unsigned long stack, sp;
        int pid, fds[2], ret, n;
 
-       if ((stack_out != NULL) && (*stack_out != 0))
-               stack = *stack_out;
-       else
-               stack = alloc_stack(0, __cant_sleep());
+       stack = alloc_stack(0, __cant_sleep());
        if (stack == 0)
                return -ENOMEM;
 
@@ -76,8 +72,8 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv,
        data.pre_data = pre_data;
        data.argv = argv;
        data.fd = fds[1];
-       data.buf = __cant_sleep() ? um_kmalloc_atomic(PATH_MAX) :
-                                       um_kmalloc(PATH_MAX);
+       data.buf = __cant_sleep() ? kmalloc(PATH_MAX, UM_GFP_ATOMIC) :
+                                       kmalloc(PATH_MAX, UM_GFP_KERNEL);
        pid = clone(helper_child, (void *) sp, CLONE_VM | SIGCHLD, &data);
        if (pid < 0) {
                ret = -errno;
@@ -113,22 +109,21 @@ out_close:
                close(fds[1]);
        close(fds[0]);
 out_free:
-       if ((stack_out == NULL) || (*stack_out == 0))
-               free_stack(stack, 0);
+       free_stack(stack, 0);
        return ret;
 }
 
 int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,
-                     unsigned long *stack_out, int stack_order)
+                     unsigned long *stack_out)
 {
        unsigned long stack, sp;
        int pid, status, err;
 
-       stack = alloc_stack(stack_order, __cant_sleep());
+       stack = alloc_stack(0, __cant_sleep());
        if (stack == 0)
                return -ENOMEM;
 
-       sp = stack + (UM_KERN_PAGE_SIZE << stack_order) - sizeof(void *);
+       sp = stack + UM_KERN_PAGE_SIZE - sizeof(void *);
        pid = clone(proc, (void *) sp, flags | SIGCHLD, arg);
        if (pid < 0) {
                err = -errno;
@@ -147,7 +142,7 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,
                if (!WIFEXITED(status) || (WEXITSTATUS(status) != 0))
                        printk("run_helper_thread - thread returned status "
                               "0x%x\n", status);
-               free_stack(stack, stack_order);
+               free_stack(stack, 0);
        } else
                *stack_out = stack;
        return pid;
index fb510d40480cc2dbec1dc6fd0651364de3981808..e85f4995a011a16a226f0963941b2bbf0355dea0 100644 (file)
@@ -235,8 +235,8 @@ void *__wrap_malloc(int size)
                return __real_malloc(size);
        else if(size <= UM_KERN_PAGE_SIZE)
                /* finding contiguous pages can be hard*/
-               ret = um_kmalloc(size);
-       else ret = um_vmalloc(size);
+               ret = kmalloc(size, UM_GFP_KERNEL);
+       else ret = vmalloc(size);
 
        /* glibc people insist that if malloc fails, errno should be
         * set by malloc as well. So we do.
index 8d4e0c6b8c92e085e697557f68e59b87af7afe23..dc03e9cccb630146c0d62504d5ff4ea5e2c14b50 100644 (file)
@@ -26,6 +26,7 @@
  * exitcall.
  */
 static int write_sigio_pid = -1;
+static unsigned long write_sigio_stack;
 
 /* These arrays are initialized before the sigio thread is started, and
  * the descriptors closed after it is killed.  So, it can't see them change.
@@ -104,7 +105,7 @@ static int need_poll(struct pollfds *polls, int n)
        if(n <= polls->size)
                return 0;
 
-       new = um_kmalloc_atomic(n * sizeof(struct pollfd));
+       new = kmalloc(n * sizeof(struct pollfd), UM_GFP_ATOMIC);
        if(new == NULL){
                printk("need_poll : failed to allocate new pollfds\n");
                return -ENOMEM;
@@ -144,8 +145,10 @@ static void update_thread(void)
        return;
  fail:
        /* Critical section start */
-       if(write_sigio_pid != -1)
+       if (write_sigio_pid != -1) {
                os_kill_process(write_sigio_pid, 1);
+               free_stack(write_sigio_stack, 0);
+       }
        write_sigio_pid = -1;
        close(sigio_private[0]);
        close(sigio_private[1]);
@@ -230,7 +233,7 @@ static struct pollfd *setup_initial_poll(int fd)
 {
        struct pollfd *p;
 
-       p = um_kmalloc(sizeof(struct pollfd));
+       p = kmalloc(sizeof(struct pollfd), UM_GFP_KERNEL);
        if (p == NULL) {
                printk("setup_initial_poll : failed to allocate poll\n");
                return NULL;
@@ -243,7 +246,6 @@ static struct pollfd *setup_initial_poll(int fd)
 
 static void write_sigio_workaround(void)
 {
-       unsigned long stack;
        struct pollfd *p;
        int err;
        int l_write_sigio_fds[2];
@@ -293,7 +295,8 @@ static void write_sigio_workaround(void)
        memcpy(sigio_private, l_sigio_private, sizeof(l_sigio_private));
 
        write_sigio_pid = run_helper_thread(write_sigio_thread, NULL,
-                                           CLONE_FILES | CLONE_VM, &stack, 0);
+                                           CLONE_FILES | CLONE_VM,
+                                           &write_sigio_stack);
 
        if (write_sigio_pid < 0)
                goto out_clear;
@@ -356,10 +359,12 @@ out:
 
 static void sigio_cleanup(void)
 {
-       if(write_sigio_pid != -1){
-               os_kill_process(write_sigio_pid, 1);
-               write_sigio_pid = -1;
-       }
+       if (write_sigio_pid == -1)
+               return;
+
+       os_kill_process(write_sigio_pid, 1);
+       free_stack(write_sigio_stack, 0);
+       write_sigio_pid = -1;
 }
 
 __uml_exitcall(sigio_cleanup);
index 46c00cc429bc70e49ba12bfb97b3c4eb88ff2b32..ba9af8d62055299dcf005dabe9248d5a381df030 100644 (file)
@@ -41,7 +41,7 @@ int is_skas_winch(int pid, int fd, void *data)
        if(pid != os_getpgrp())
                return(0);
 
-       register_winch_irq(-1, fd, -1, data);
+       register_winch_irq(-1, fd, -1, data, 0);
        return(1);
 }
 
index 3f33165ada689cfea8d8bf92bd0bb36610a0060a..419b2d5ff6de13db3a76269f191679bae47a0218 100644 (file)
@@ -5,7 +5,8 @@
  * so I *must* declare good prototypes for them and then EXPORT them.
  * The kernel code uses the macro defined by include/linux/string.h,
  * so I undef macros; the userspace code does not include that and I
- * add an EXPORT for the glibc one.*/
+ * add an EXPORT for the glibc one.
+ */
 
 #undef strlen
 #undef strstr
@@ -61,12 +62,18 @@ EXPORT_SYMBOL_PROTO(dup2);
 EXPORT_SYMBOL_PROTO(__xstat);
 EXPORT_SYMBOL_PROTO(__lxstat);
 EXPORT_SYMBOL_PROTO(__lxstat64);
+EXPORT_SYMBOL_PROTO(__fxstat64);
 EXPORT_SYMBOL_PROTO(lseek);
 EXPORT_SYMBOL_PROTO(lseek64);
 EXPORT_SYMBOL_PROTO(chown);
+EXPORT_SYMBOL_PROTO(fchown);
 EXPORT_SYMBOL_PROTO(truncate);
+EXPORT_SYMBOL_PROTO(ftruncate64);
 EXPORT_SYMBOL_PROTO(utime);
+EXPORT_SYMBOL_PROTO(utimes);
+EXPORT_SYMBOL_PROTO(futimes);
 EXPORT_SYMBOL_PROTO(chmod);
+EXPORT_SYMBOL_PROTO(fchmod);
 EXPORT_SYMBOL_PROTO(rename);
 EXPORT_SYMBOL_PROTO(__xmknod);
 
@@ -102,14 +109,3 @@ EXPORT_SYMBOL(__stack_smash_handler);
 
 extern long __guard __attribute__((weak));
 EXPORT_SYMBOL(__guard);
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
index 47565c3345d240523999a79962806f82942941be..782dea8194384e2f4024400d937a5649102af91d 100644 (file)
@@ -526,7 +526,7 @@ ia32_sys_call_table:
        .quad sys_init_module
        .quad sys_delete_module
        .quad quiet_ni_syscall          /* 130  get_kernel_syms */
-       .quad sys_quotactl
+       .quad sys32_quotactl
        .quad sys_getpgid
        .quad sys_fchdir
        .quad quiet_ni_syscall  /* bdflush */
index 1fab487dee86d56dcf01f8a4976a7fdff2482c31..941c84baecc8da3fc4496d912216760a083e034a 100644 (file)
@@ -73,7 +73,11 @@ startup_64:
        addq    %rbp, init_level4_pgt + (511*8)(%rip)
 
        addq    %rbp, level3_ident_pgt + 0(%rip)
+
        addq    %rbp, level3_kernel_pgt + (510*8)(%rip)
+       addq    %rbp, level3_kernel_pgt + (511*8)(%rip)
+
+       addq    %rbp, level2_fixmap_pgt + (506*8)(%rip)
 
        /* Add an Identity mapping if I am above 1G */
        leaq    _text(%rip), %rdi
@@ -314,7 +318,16 @@ NEXT_PAGE(level3_kernel_pgt)
        .fill   510,8,0
        /* (2^48-(2*1024*1024*1024)-((2^39)*511))/(2^30) = 510 */
        .quad   level2_kernel_pgt - __START_KERNEL_map + _KERNPG_TABLE
-       .fill   1,8,0
+       .quad   level2_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLE
+
+NEXT_PAGE(level2_fixmap_pgt)
+       .fill   506,8,0
+       .quad   level1_fixmap_pgt - __START_KERNEL_map + _PAGE_TABLE
+       /* 8MB reserved for vsyscalls + a 2MB hole = 4 + 1 entries */
+       .fill   5,8,0
+
+NEXT_PAGE(level1_fixmap_pgt)
+       .fill   512,8,0
 
 NEXT_PAGE(level2_ident_pgt)
        /* Since I easily can, map the first 1G.
index aac1c0be54c6b8f99c032f61f6b29f904d91977d..7fa155c394d934548df7fedce29d9a554fa5bfbc 100644 (file)
@@ -531,7 +531,7 @@ void die(const char * str, struct pt_regs * regs, long err)
        unsigned long flags = oops_begin();
 
        if (!user_mode(regs))
-               report_bug(regs->rip);
+               report_bug(regs->rip, regs);
 
        __die(str, regs, err);
        oops_end(flags);
index 102c751a124c1d0368b9c7e9d8b1c421181e7667..3d73323ff79bbcb95edb739798a26786b7c9b8d7 100644 (file)
 
 static void *c_start(struct seq_file *m, loff_t *pos)
 {
-       struct list_head *v;
-       loff_t n = *pos;
-
        down_read(&crypto_alg_sem);
-       list_for_each(v, &crypto_alg_list)
-               if (!n--)
-                       return list_entry(v, struct crypto_alg, cra_list);
-       return NULL;
+       return seq_list_start(&crypto_alg_list, *pos);
 }
 
 static void *c_next(struct seq_file *m, void *p, loff_t *pos)
 {
-       struct list_head *v = p;
-       
-       (*pos)++;
-       v = v->next;
-       return (v == &crypto_alg_list) ?
-               NULL : list_entry(v, struct crypto_alg, cra_list);
+       return seq_list_next(p, &crypto_alg_list, pos);
 }
 
 static void c_stop(struct seq_file *m, void *p)
@@ -50,7 +39,7 @@ static void c_stop(struct seq_file *m, void *p)
 
 static int c_show(struct seq_file *m, void *p)
 {
-       struct crypto_alg *alg = (struct crypto_alg *)p;
+       struct crypto_alg *alg = list_entry(p, struct crypto_alg, cra_list);
        
        seq_printf(m, "name         : %s\n", alg->cra_name);
        seq_printf(m, "driver       : %s\n", alg->cra_driver_name);
index 5b4fab24155f98105473683ff9145b46e5d3ee22..bb4ae6281491a88186b1bae5ac905475004626ad 100644 (file)
@@ -142,7 +142,7 @@ config ATM_ENI_BURST_RX_2W
 
 config ATM_FIRESTREAM
        tristate "Fujitsu FireStream (FS50/FS155) "
-       depends on PCI
+       depends on PCI && VIRT_TO_BUS
        help
          Driver for the Fujitsu FireStream 155 (MB86697) and
          FireStream 50 (MB86695) ATM PCI chips.
@@ -152,7 +152,7 @@ config ATM_FIRESTREAM
 
 config ATM_ZATM
        tristate "ZeitNet ZN1221/ZN1225"
-       depends on PCI
+       depends on PCI && VIRT_TO_BUS
        help
          Driver for the ZeitNet ZN1221 (MMF) and ZN1225 (UTP-5) 155 Mbps ATM
          adapters.
@@ -240,7 +240,7 @@ config ATM_IDT77252_USE_SUNI
 
 config ATM_AMBASSADOR
        tristate "Madge Ambassador (Collage PCI 155 Server)"
-       depends on PCI
+       depends on PCI && VIRT_TO_BUS
        select BITREVERSE
        help
          This is a driver for ATMizer based ATM card produced by Madge
@@ -265,7 +265,7 @@ config ATM_AMBASSADOR_DEBUG
 
 config ATM_HORIZON
        tristate "Madge Horizon [Ultra] (Collage PCI 25 and Collage PCI 155 Client)"
-       depends on PCI
+       depends on PCI && VIRT_TO_BUS
        help
          This is a driver for the Horizon chipset ATM adapter cards once
          produced by Madge Networks Ltd. Say Y (or M to compile as a module
index ea4fe3e48f33c3213b9c0447a26fbeddb3d38148..de2fcce10ba526c1eb0c32c788f978e9fe1172ee 100644 (file)
@@ -5,8 +5,11 @@
 # Auxiliary display drivers configuration.
 #
 
-menu "Auxiliary Display support"
+menuconfig AUXDISPLAY
        depends on PARPORT
+       bool "Auxiliary Display support"
+
+if AUXDISPLAY && PARPORT
 
 config KS0108
        tristate "KS0108 LCD Controller"
@@ -111,4 +114,5 @@ config CFAG12864B_RATE
 
          If you compile this as a module, you can still override this
          value using the module parameters.
-endmenu
+
+endif # AUXDISPLAY
index 91970e9bb05e3071f98346b5f378f064ec18e4b8..7647abfe189081dcec38eace34025899dd531a99 100644 (file)
@@ -127,7 +127,7 @@ dma_pool_create (const char *name, struct device *dev,
        } else if (allocation < size)
                return NULL;
 
-       if (!(retval = kmalloc (sizeof *retval, GFP_KERNEL)))
+       if (!(retval = kmalloc_node (sizeof *retval, GFP_KERNEL, dev_to_node(dev))))
                return retval;
 
        strlcpy (retval->name, name, sizeof retval->name);
index 95d6838c4ff3ef2a95160982cd8914992402e30b..c5a61571a07694a80117add7b0c67579d3a78b19 100644 (file)
@@ -102,7 +102,7 @@ source "drivers/block/paride/Kconfig"
 
 config BLK_CPQ_DA
        tristate "Compaq SMART2 support"
-       depends on PCI
+       depends on PCI && VIRT_TO_BUS
        help
          This is the driver for Compaq Smart Array controllers.  Everyone
          using these boards should say Y here.  See the file
@@ -412,6 +412,13 @@ config ATA_OVER_ETH
        This driver provides Support for ATA over Ethernet block
        devices like the Coraid EtherDrive (R) Storage Blade.
 
+config SUNVDC
+       tristate "Sun Virtual Disk Client support"
+       depends on SUN_LDOMS
+       help
+         Support for virtual disk devices as a client under Sun
+         Logical Domains.
+
 source "drivers/s390/block/Kconfig"
 
 endif # BLK_DEV
index bba3119b28c47436e5d02cb16089b883bf297d4f..7926be8c9fb7417f9d66f458e7e4d991957337b5 100644 (file)
@@ -18,6 +18,7 @@ obj-$(CONFIG_BLK_CPQ_DA)      += cpqarray.o
 obj-$(CONFIG_BLK_CPQ_CISS_DA)  += cciss.o
 obj-$(CONFIG_BLK_DEV_DAC960)   += DAC960.o
 obj-$(CONFIG_CDROM_PKTCDVD)    += pktcdvd.o
+obj-$(CONFIG_SUNVDC)           += sunvdc.o
 
 obj-$(CONFIG_BLK_DEV_UMEM)     += umem.o
 obj-$(CONFIG_BLK_DEV_NBD)      += nbd.o
index c575fb1d585f1131714a6658cc1b823404140cfd..c1295102409026468226d57d6d527006288f51f7 100644 (file)
@@ -122,17 +122,12 @@ static int sock_xmit(struct socket *sock, int send, void *buf, int size,
        int result;
        struct msghdr msg;
        struct kvec iov;
-       unsigned long flags;
-       sigset_t oldset;
+       sigset_t blocked, oldset;
 
        /* Allow interception of SIGKILL only
         * Don't allow other signals to interrupt the transmission */
-       spin_lock_irqsave(&current->sighand->siglock, flags);
-       oldset = current->blocked;
-       sigfillset(&current->blocked);
-       sigdelsetmask(&current->blocked, sigmask(SIGKILL));
-       recalc_sigpending();
-       spin_unlock_irqrestore(&current->sighand->siglock, flags);
+       siginitsetinv(&blocked, sigmask(SIGKILL));
+       sigprocmask(SIG_SETMASK, &blocked, &oldset);
 
        do {
                sock->sk->sk_allocation = GFP_NOIO;
@@ -151,11 +146,9 @@ static int sock_xmit(struct socket *sock, int send, void *buf, int size,
 
                if (signal_pending(current)) {
                        siginfo_t info;
-                       spin_lock_irqsave(&current->sighand->siglock, flags);
                        printk(KERN_WARNING "nbd (pid %d: %s) got signal %d\n",
-                               current->pid, current->comm, 
-                               dequeue_signal(current, &current->blocked, &info));
-                       spin_unlock_irqrestore(&current->sighand->siglock, flags);
+                               current->pid, current->comm,
+                               dequeue_signal_lock(current, &current->blocked, &info));
                        result = -EINTR;
                        break;
                }
@@ -169,10 +162,7 @@ static int sock_xmit(struct socket *sock, int send, void *buf, int size,
                buf += result;
        } while (size > 0);
 
-       spin_lock_irqsave(&current->sighand->siglock, flags);
-       current->blocked = oldset;
-       recalc_sigpending();
-       spin_unlock_irqrestore(&current->sighand->siglock, flags);
+       sigprocmask(SIG_SETMASK, &oldset, NULL);
 
        return result;
 }
index ce64e86d6ffbb9d4205a96f0e189dec7519632ca..7c294a40002e26f1ac7f73741c2e3d836f7ae4a5 100644 (file)
@@ -1652,9 +1652,6 @@ static int kcdrwd(void *foobar)
                                }
                        }
 
-                       if (signal_pending(current)) {
-                               flush_signals(current);
-                       }
                        if (kthread_should_stop())
                                break;
                }
diff --git a/drivers/block/sunvdc.c b/drivers/block/sunvdc.c
new file mode 100644 (file)
index 0000000..0f5e3ca
--- /dev/null
@@ -0,0 +1,972 @@
+/* sunvdc.c: Sun LDOM Virtual Disk Client.
+ *
+ * Copyright (C) 2007 David S. Miller <davem@davemloft.net>
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/blkdev.h>
+#include <linux/hdreg.h>
+#include <linux/genhd.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/completion.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/list.h>
+
+#include <asm/vio.h>
+#include <asm/ldc.h>
+
+#define DRV_MODULE_NAME                "sunvdc"
+#define PFX DRV_MODULE_NAME    ": "
+#define DRV_MODULE_VERSION     "1.0"
+#define DRV_MODULE_RELDATE     "June 25, 2007"
+
+static char version[] __devinitdata =
+       DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
+MODULE_AUTHOR("David S. Miller (davem@davemloft.net)");
+MODULE_DESCRIPTION("Sun LDOM virtual disk client driver");
+MODULE_LICENSE("GPL");
+MODULE_VERSION(DRV_MODULE_VERSION);
+
+#define VDC_TX_RING_SIZE       256
+
+#define WAITING_FOR_LINK_UP    0x01
+#define WAITING_FOR_TX_SPACE   0x02
+#define WAITING_FOR_GEN_CMD    0x04
+#define WAITING_FOR_ANY                -1
+
+struct vdc_req_entry {
+       struct request          *req;
+};
+
+struct vdc_port {
+       struct vio_driver_state vio;
+
+       struct vdc              *vp;
+
+       struct gendisk          *disk;
+
+       struct vdc_completion   *cmp;
+
+       u64                     req_id;
+       u64                     seq;
+       struct vdc_req_entry    rq_arr[VDC_TX_RING_SIZE];
+
+       unsigned long           ring_cookies;
+
+       u64                     max_xfer_size;
+       u32                     vdisk_block_size;
+
+       /* The server fills these in for us in the disk attribute
+        * ACK packet.
+        */
+       u64                     operations;
+       u32                     vdisk_size;
+       u8                      vdisk_type;
+       u8                      dev_no;
+
+       char                    disk_name[32];
+
+       struct vio_disk_geom    geom;
+       struct vio_disk_vtoc    label;
+
+       struct list_head        list;
+};
+
+static inline struct vdc_port *to_vdc_port(struct vio_driver_state *vio)
+{
+       return container_of(vio, struct vdc_port, vio);
+}
+
+struct vdc {
+       /* Protects prot_list.  */
+       spinlock_t              lock;
+
+       struct vio_dev          *dev;
+
+       struct list_head        port_list;
+};
+
+/* Ordered from largest major to lowest */
+static struct vio_version vdc_versions[] = {
+       { .major = 1, .minor = 0 },
+};
+
+#define VDCBLK_NAME    "vdisk"
+static int vdc_major;
+#define PARTITION_SHIFT        3
+
+static inline u32 vdc_tx_dring_avail(struct vio_dring_state *dr)
+{
+       return vio_dring_avail(dr, VDC_TX_RING_SIZE);
+}
+
+static int vdc_getgeo(struct block_device *bdev, struct hd_geometry *geo)
+{
+       struct gendisk *disk = bdev->bd_disk;
+       struct vdc_port *port = disk->private_data;
+
+       geo->heads = (u8) port->geom.num_hd;
+       geo->sectors = (u8) port->geom.num_sec;
+       geo->cylinders = port->geom.num_cyl;
+
+       return 0;
+}
+
+static struct block_device_operations vdc_fops = {
+       .owner          = THIS_MODULE,
+       .getgeo         = vdc_getgeo,
+};
+
+static void vdc_finish(struct vio_driver_state *vio, int err, int waiting_for)
+{
+       if (vio->cmp &&
+           (waiting_for == -1 ||
+            vio->cmp->waiting_for == waiting_for)) {
+               vio->cmp->err = err;
+               complete(&vio->cmp->com);
+               vio->cmp = NULL;
+       }
+}
+
+static void vdc_handshake_complete(struct vio_driver_state *vio)
+{
+       vdc_finish(vio, 0, WAITING_FOR_LINK_UP);
+}
+
+static int vdc_handle_unknown(struct vdc_port *port, void *arg)
+{
+       struct vio_msg_tag *pkt = arg;
+
+       printk(KERN_ERR PFX "Received unknown msg [%02x:%02x:%04x:%08x]\n",
+              pkt->type, pkt->stype, pkt->stype_env, pkt->sid);
+       printk(KERN_ERR PFX "Resetting connection.\n");
+
+       ldc_disconnect(port->vio.lp);
+
+       return -ECONNRESET;
+}
+
+static int vdc_send_attr(struct vio_driver_state *vio)
+{
+       struct vdc_port *port = to_vdc_port(vio);
+       struct vio_disk_attr_info pkt;
+
+       memset(&pkt, 0, sizeof(pkt));
+
+       pkt.tag.type = VIO_TYPE_CTRL;
+       pkt.tag.stype = VIO_SUBTYPE_INFO;
+       pkt.tag.stype_env = VIO_ATTR_INFO;
+       pkt.tag.sid = vio_send_sid(vio);
+
+       pkt.xfer_mode = VIO_DRING_MODE;
+       pkt.vdisk_block_size = port->vdisk_block_size;
+       pkt.max_xfer_size = port->max_xfer_size;
+
+       viodbg(HS, "SEND ATTR xfer_mode[0x%x] blksz[%u] max_xfer[%lu]\n",
+              pkt.xfer_mode, pkt.vdisk_block_size, pkt.max_xfer_size);
+
+       return vio_ldc_send(&port->vio, &pkt, sizeof(pkt));
+}
+
+static int vdc_handle_attr(struct vio_driver_state *vio, void *arg)
+{
+       struct vdc_port *port = to_vdc_port(vio);
+       struct vio_disk_attr_info *pkt = arg;
+
+       viodbg(HS, "GOT ATTR stype[0x%x] ops[%lx] disk_size[%lu] disk_type[%x] "
+              "xfer_mode[0x%x] blksz[%u] max_xfer[%lu]\n",
+              pkt->tag.stype, pkt->operations,
+              pkt->vdisk_size, pkt->vdisk_type,
+              pkt->xfer_mode, pkt->vdisk_block_size,
+              pkt->max_xfer_size);
+
+       if (pkt->tag.stype == VIO_SUBTYPE_ACK) {
+               switch (pkt->vdisk_type) {
+               case VD_DISK_TYPE_DISK:
+               case VD_DISK_TYPE_SLICE:
+                       break;
+
+               default:
+                       printk(KERN_ERR PFX "%s: Bogus vdisk_type 0x%x\n",
+                              vio->name, pkt->vdisk_type);
+                       return -ECONNRESET;
+               }
+
+               if (pkt->vdisk_block_size > port->vdisk_block_size) {
+                       printk(KERN_ERR PFX "%s: BLOCK size increased "
+                              "%u --> %u\n",
+                              vio->name,
+                              port->vdisk_block_size, pkt->vdisk_block_size);
+                       return -ECONNRESET;
+               }
+
+               port->operations = pkt->operations;
+               port->vdisk_size = pkt->vdisk_size;
+               port->vdisk_type = pkt->vdisk_type;
+               if (pkt->max_xfer_size < port->max_xfer_size)
+                       port->max_xfer_size = pkt->max_xfer_size;
+               port->vdisk_block_size = pkt->vdisk_block_size;
+               return 0;
+       } else {
+               printk(KERN_ERR PFX "%s: Attribute NACK\n", vio->name);
+
+               return -ECONNRESET;
+       }
+}
+
+static void vdc_end_special(struct vdc_port *port, struct vio_disk_desc *desc)
+{
+       int err = desc->status;
+
+       vdc_finish(&port->vio, -err, WAITING_FOR_GEN_CMD);
+}
+
+static void vdc_end_request(struct request *req, int uptodate, int num_sectors)
+{
+       if (end_that_request_first(req, uptodate, num_sectors))
+               return;
+       add_disk_randomness(req->rq_disk);
+       end_that_request_last(req, uptodate);
+}
+
+static void vdc_end_one(struct vdc_port *port, struct vio_dring_state *dr,
+                       unsigned int index)
+{
+       struct vio_disk_desc *desc = vio_dring_entry(dr, index);
+       struct vdc_req_entry *rqe = &port->rq_arr[index];
+       struct request *req;
+
+       if (unlikely(desc->hdr.state != VIO_DESC_DONE))
+               return;
+
+       ldc_unmap(port->vio.lp, desc->cookies, desc->ncookies);
+       desc->hdr.state = VIO_DESC_FREE;
+       dr->cons = (index + 1) & (VDC_TX_RING_SIZE - 1);
+
+       req = rqe->req;
+       if (req == NULL) {
+               vdc_end_special(port, desc);
+               return;
+       }
+
+       rqe->req = NULL;
+
+       vdc_end_request(req, !desc->status, desc->size >> 9);
+
+       if (blk_queue_stopped(port->disk->queue))
+               blk_start_queue(port->disk->queue);
+}
+
+static int vdc_ack(struct vdc_port *port, void *msgbuf)
+{
+       struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING];
+       struct vio_dring_data *pkt = msgbuf;
+
+       if (unlikely(pkt->dring_ident != dr->ident ||
+                    pkt->start_idx != pkt->end_idx ||
+                    pkt->start_idx >= VDC_TX_RING_SIZE))
+               return 0;
+
+       vdc_end_one(port, dr, pkt->start_idx);
+
+       return 0;
+}
+
+static int vdc_nack(struct vdc_port *port, void *msgbuf)
+{
+       /* XXX Implement me XXX */
+       return 0;
+}
+
+static void vdc_event(void *arg, int event)
+{
+       struct vdc_port *port = arg;
+       struct vio_driver_state *vio = &port->vio;
+       unsigned long flags;
+       int err;
+
+       spin_lock_irqsave(&vio->lock, flags);
+
+       if (unlikely(event == LDC_EVENT_RESET ||
+                    event == LDC_EVENT_UP)) {
+               vio_link_state_change(vio, event);
+               spin_unlock_irqrestore(&vio->lock, flags);
+               return;
+       }
+
+       if (unlikely(event != LDC_EVENT_DATA_READY)) {
+               printk(KERN_WARNING PFX "Unexpected LDC event %d\n", event);
+               spin_unlock_irqrestore(&vio->lock, flags);
+               return;
+       }
+
+       err = 0;
+       while (1) {
+               union {
+                       struct vio_msg_tag tag;
+                       u64 raw[8];
+               } msgbuf;
+
+               err = ldc_read(vio->lp, &msgbuf, sizeof(msgbuf));
+               if (unlikely(err < 0)) {
+                       if (err == -ECONNRESET)
+                               vio_conn_reset(vio);
+                       break;
+               }
+               if (err == 0)
+                       break;
+               viodbg(DATA, "TAG [%02x:%02x:%04x:%08x]\n",
+                      msgbuf.tag.type,
+                      msgbuf.tag.stype,
+                      msgbuf.tag.stype_env,
+                      msgbuf.tag.sid);
+               err = vio_validate_sid(vio, &msgbuf.tag);
+               if (err < 0)
+                       break;
+
+               if (likely(msgbuf.tag.type == VIO_TYPE_DATA)) {
+                       if (msgbuf.tag.stype == VIO_SUBTYPE_ACK)
+                               err = vdc_ack(port, &msgbuf);
+                       else if (msgbuf.tag.stype == VIO_SUBTYPE_NACK)
+                               err = vdc_nack(port, &msgbuf);
+                       else
+                               err = vdc_handle_unknown(port, &msgbuf);
+               } else if (msgbuf.tag.type == VIO_TYPE_CTRL) {
+                       err = vio_control_pkt_engine(vio, &msgbuf);
+               } else {
+                       err = vdc_handle_unknown(port, &msgbuf);
+               }
+               if (err < 0)
+                       break;
+       }
+       if (err < 0)
+               vdc_finish(&port->vio, err, WAITING_FOR_ANY);
+       spin_unlock_irqrestore(&vio->lock, flags);
+}
+
+static int __vdc_tx_trigger(struct vdc_port *port)
+{
+       struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING];
+       struct vio_dring_data hdr = {
+               .tag = {
+                       .type           = VIO_TYPE_DATA,
+                       .stype          = VIO_SUBTYPE_INFO,
+                       .stype_env      = VIO_DRING_DATA,
+                       .sid            = vio_send_sid(&port->vio),
+               },
+               .dring_ident            = dr->ident,
+               .start_idx              = dr->prod,
+               .end_idx                = dr->prod,
+       };
+       int err, delay;
+
+       hdr.seq = dr->snd_nxt;
+       delay = 1;
+       do {
+               err = vio_ldc_send(&port->vio, &hdr, sizeof(hdr));
+               if (err > 0) {
+                       dr->snd_nxt++;
+                       break;
+               }
+               udelay(delay);
+               if ((delay <<= 1) > 128)
+                       delay = 128;
+       } while (err == -EAGAIN);
+
+       return err;
+}
+
+static int __send_request(struct request *req)
+{
+       struct vdc_port *port = req->rq_disk->private_data;
+       struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING];
+       struct scatterlist sg[port->ring_cookies];
+       struct vdc_req_entry *rqe;
+       struct vio_disk_desc *desc;
+       unsigned int map_perm;
+       int nsg, err, i;
+       u64 len;
+       u8 op;
+
+       map_perm = LDC_MAP_SHADOW | LDC_MAP_DIRECT | LDC_MAP_IO;
+
+       if (rq_data_dir(req) == READ) {
+               map_perm |= LDC_MAP_W;
+               op = VD_OP_BREAD;
+       } else {
+               map_perm |= LDC_MAP_R;
+               op = VD_OP_BWRITE;
+       }
+
+       nsg = blk_rq_map_sg(req->q, req, sg);
+
+       len = 0;
+       for (i = 0; i < nsg; i++)
+               len += sg[i].length;
+
+       if (unlikely(vdc_tx_dring_avail(dr) < 1)) {
+               blk_stop_queue(port->disk->queue);
+               err = -ENOMEM;
+               goto out;
+       }
+
+       desc = vio_dring_cur(dr);
+
+       err = ldc_map_sg(port->vio.lp, sg, nsg,
+                        desc->cookies, port->ring_cookies,
+                        map_perm);
+       if (err < 0) {
+               printk(KERN_ERR PFX "ldc_map_sg() failure, err=%d.\n", err);
+               return err;
+       }
+
+       rqe = &port->rq_arr[dr->prod];
+       rqe->req = req;
+
+       desc->hdr.ack = VIO_ACK_ENABLE;
+       desc->req_id = port->req_id;
+       desc->operation = op;
+       if (port->vdisk_type == VD_DISK_TYPE_DISK) {
+               desc->slice = 2;
+       } else {
+               desc->slice = 0;
+       }
+       desc->status = ~0;
+       desc->offset = (req->sector << 9) / port->vdisk_block_size;
+       desc->size = len;
+       desc->ncookies = err;
+
+       /* This has to be a non-SMP write barrier because we are writing
+        * to memory which is shared with the peer LDOM.
+        */
+       wmb();
+       desc->hdr.state = VIO_DESC_READY;
+
+       err = __vdc_tx_trigger(port);
+       if (err < 0) {
+               printk(KERN_ERR PFX "vdc_tx_trigger() failure, err=%d\n", err);
+       } else {
+               port->req_id++;
+               dr->prod = (dr->prod + 1) & (VDC_TX_RING_SIZE - 1);
+       }
+out:
+
+       return err;
+}
+
+static void do_vdc_request(request_queue_t *q)
+{
+       while (1) {
+               struct request *req = elv_next_request(q);
+
+               if (!req)
+                       break;
+
+               blkdev_dequeue_request(req);
+               if (__send_request(req) < 0)
+                       vdc_end_request(req, 0, req->hard_nr_sectors);
+       }
+}
+
+static int generic_request(struct vdc_port *port, u8 op, void *buf, int len)
+{
+       struct vio_dring_state *dr;
+       struct vio_completion comp;
+       struct vio_disk_desc *desc;
+       unsigned int map_perm;
+       unsigned long flags;
+       int op_len, err;
+       void *req_buf;
+
+       if (!(((u64)1 << ((u64)op - 1)) & port->operations))
+               return -EOPNOTSUPP;
+
+       switch (op) {
+       case VD_OP_BREAD:
+       case VD_OP_BWRITE:
+       default:
+               return -EINVAL;
+
+       case VD_OP_FLUSH:
+               op_len = 0;
+               map_perm = 0;
+               break;
+
+       case VD_OP_GET_WCE:
+               op_len = sizeof(u32);
+               map_perm = LDC_MAP_W;
+               break;
+
+       case VD_OP_SET_WCE:
+               op_len = sizeof(u32);
+               map_perm = LDC_MAP_R;
+               break;
+
+       case VD_OP_GET_VTOC:
+               op_len = sizeof(struct vio_disk_vtoc);
+               map_perm = LDC_MAP_W;
+               break;
+
+       case VD_OP_SET_VTOC:
+               op_len = sizeof(struct vio_disk_vtoc);
+               map_perm = LDC_MAP_R;
+               break;
+
+       case VD_OP_GET_DISKGEOM:
+               op_len = sizeof(struct vio_disk_geom);
+               map_perm = LDC_MAP_W;
+               break;
+
+       case VD_OP_SET_DISKGEOM:
+               op_len = sizeof(struct vio_disk_geom);
+               map_perm = LDC_MAP_R;
+               break;
+
+       case VD_OP_SCSICMD:
+               op_len = 16;
+               map_perm = LDC_MAP_RW;
+               break;
+
+       case VD_OP_GET_DEVID:
+               op_len = sizeof(struct vio_disk_devid);
+               map_perm = LDC_MAP_W;
+               break;
+
+       case VD_OP_GET_EFI:
+       case VD_OP_SET_EFI:
+               return -EOPNOTSUPP;
+               break;
+       };
+
+       map_perm |= LDC_MAP_SHADOW | LDC_MAP_DIRECT | LDC_MAP_IO;
+
+       op_len = (op_len + 7) & ~7;
+       req_buf = kzalloc(op_len, GFP_KERNEL);
+       if (!req_buf)
+               return -ENOMEM;
+
+       if (len > op_len)
+               len = op_len;
+
+       if (map_perm & LDC_MAP_R)
+               memcpy(req_buf, buf, len);
+
+       spin_lock_irqsave(&port->vio.lock, flags);
+
+       dr = &port->vio.drings[VIO_DRIVER_TX_RING];
+
+       /* XXX If we want to use this code generically we have to
+        * XXX handle TX ring exhaustion etc.
+        */
+       desc = vio_dring_cur(dr);
+
+       err = ldc_map_single(port->vio.lp, req_buf, op_len,
+                            desc->cookies, port->ring_cookies,
+                            map_perm);
+       if (err < 0) {
+               spin_unlock_irqrestore(&port->vio.lock, flags);
+               kfree(req_buf);
+               return err;
+       }
+
+       init_completion(&comp.com);
+       comp.waiting_for = WAITING_FOR_GEN_CMD;
+       port->vio.cmp = &comp;
+
+       desc->hdr.ack = VIO_ACK_ENABLE;
+       desc->req_id = port->req_id;
+       desc->operation = op;
+       desc->slice = 0;
+       desc->status = ~0;
+       desc->offset = 0;
+       desc->size = op_len;
+       desc->ncookies = err;
+
+       /* This has to be a non-SMP write barrier because we are writing
+        * to memory which is shared with the peer LDOM.
+        */
+       wmb();
+       desc->hdr.state = VIO_DESC_READY;
+
+       err = __vdc_tx_trigger(port);
+       if (err >= 0) {
+               port->req_id++;
+               dr->prod = (dr->prod + 1) & (VDC_TX_RING_SIZE - 1);
+               spin_unlock_irqrestore(&port->vio.lock, flags);
+
+               wait_for_completion(&comp.com);
+               err = comp.err;
+       } else {
+               port->vio.cmp = NULL;
+               spin_unlock_irqrestore(&port->vio.lock, flags);
+       }
+
+       if (map_perm & LDC_MAP_W)
+               memcpy(buf, req_buf, len);
+
+       kfree(req_buf);
+
+       return err;
+}
+
+static int __devinit vdc_alloc_tx_ring(struct vdc_port *port)
+{
+       struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING];
+       unsigned long len, entry_size;
+       int ncookies;
+       void *dring;
+
+       entry_size = sizeof(struct vio_disk_desc) +
+               (sizeof(struct ldc_trans_cookie) * port->ring_cookies);
+       len = (VDC_TX_RING_SIZE * entry_size);
+
+       ncookies = VIO_MAX_RING_COOKIES;
+       dring = ldc_alloc_exp_dring(port->vio.lp, len,
+                                   dr->cookies, &ncookies,
+                                   (LDC_MAP_SHADOW |
+                                    LDC_MAP_DIRECT |
+                                    LDC_MAP_RW));
+       if (IS_ERR(dring))
+               return PTR_ERR(dring);
+
+       dr->base = dring;
+       dr->entry_size = entry_size;
+       dr->num_entries = VDC_TX_RING_SIZE;
+       dr->prod = dr->cons = 0;
+       dr->pending = VDC_TX_RING_SIZE;
+       dr->ncookies = ncookies;
+
+       return 0;
+}
+
+static void vdc_free_tx_ring(struct vdc_port *port)
+{
+       struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING];
+
+       if (dr->base) {
+               ldc_free_exp_dring(port->vio.lp, dr->base,
+                                  (dr->entry_size * dr->num_entries),
+                                  dr->cookies, dr->ncookies);
+               dr->base = NULL;
+               dr->entry_size = 0;
+               dr->num_entries = 0;
+               dr->pending = 0;
+               dr->ncookies = 0;
+       }
+}
+
+static int probe_disk(struct vdc_port *port)
+{
+       struct vio_completion comp;
+       struct request_queue *q;
+       struct gendisk *g;
+       int err;
+
+       init_completion(&comp.com);
+       comp.err = 0;
+       comp.waiting_for = WAITING_FOR_LINK_UP;
+       port->vio.cmp = &comp;
+
+       vio_port_up(&port->vio);
+
+       wait_for_completion(&comp.com);
+       if (comp.err)
+               return comp.err;
+
+       err = generic_request(port, VD_OP_GET_VTOC,
+                             &port->label, sizeof(port->label));
+       if (err < 0) {
+               printk(KERN_ERR PFX "VD_OP_GET_VTOC returns error %d\n", err);
+               return err;
+       }
+
+       err = generic_request(port, VD_OP_GET_DISKGEOM,
+                             &port->geom, sizeof(port->geom));
+       if (err < 0) {
+               printk(KERN_ERR PFX "VD_OP_GET_DISKGEOM returns "
+                      "error %d\n", err);
+               return err;
+       }
+
+       port->vdisk_size = ((u64)port->geom.num_cyl *
+                           (u64)port->geom.num_hd *
+                           (u64)port->geom.num_sec);
+
+       q = blk_init_queue(do_vdc_request, &port->vio.lock);
+       if (!q) {
+               printk(KERN_ERR PFX "%s: Could not allocate queue.\n",
+                      port->vio.name);
+               return -ENOMEM;
+       }
+       g = alloc_disk(1 << PARTITION_SHIFT);
+       if (!g) {
+               printk(KERN_ERR PFX "%s: Could not allocate gendisk.\n",
+                      port->vio.name);
+               blk_cleanup_queue(q);
+               return -ENOMEM;
+       }
+
+       port->disk = g;
+
+       blk_queue_max_hw_segments(q, port->ring_cookies);
+       blk_queue_max_phys_segments(q, port->ring_cookies);
+       blk_queue_max_sectors(q, port->max_xfer_size);
+       g->major = vdc_major;
+       g->first_minor = port->dev_no << PARTITION_SHIFT;
+       strcpy(g->disk_name, port->disk_name);
+
+       g->fops = &vdc_fops;
+       g->queue = q;
+       g->private_data = port;
+       g->driverfs_dev = &port->vio.vdev->dev;
+
+       set_capacity(g, port->vdisk_size);
+
+       printk(KERN_INFO PFX "%s: %u sectors (%u MB)\n",
+              g->disk_name,
+              port->vdisk_size, (port->vdisk_size >> (20 - 9)));
+
+       add_disk(g);
+
+       return 0;
+}
+
+static struct ldc_channel_config vdc_ldc_cfg = {
+       .event          = vdc_event,
+       .mtu            = 64,
+       .mode           = LDC_MODE_UNRELIABLE,
+};
+
+static struct vio_driver_ops vdc_vio_ops = {
+       .send_attr              = vdc_send_attr,
+       .handle_attr            = vdc_handle_attr,
+       .handshake_complete     = vdc_handshake_complete,
+};
+
+static int __devinit vdc_port_probe(struct vio_dev *vdev,
+                                   const struct vio_device_id *id)
+{
+       struct mdesc_handle *hp;
+       struct vdc_port *port;
+       unsigned long flags;
+       struct vdc *vp;
+       const u64 *port_id;
+       int err;
+
+       vp = dev_get_drvdata(vdev->dev.parent);
+       if (!vp) {
+               printk(KERN_ERR PFX "Cannot find port parent vdc.\n");
+               return -ENODEV;
+       }
+
+       hp = mdesc_grab();
+
+       port_id = mdesc_get_property(hp, vdev->mp, "id", NULL);
+       err = -ENODEV;
+       if (!port_id) {
+               printk(KERN_ERR PFX "Port lacks id property.\n");
+               goto err_out_release_mdesc;
+       }
+       if ((*port_id << PARTITION_SHIFT) & ~(u64)MINORMASK) {
+               printk(KERN_ERR PFX "Port id [%lu] too large.\n", *port_id);
+               goto err_out_release_mdesc;
+       }
+
+       port = kzalloc(sizeof(*port), GFP_KERNEL);
+       err = -ENOMEM;
+       if (!port) {
+               printk(KERN_ERR PFX "Cannot allocate vdc_port.\n");
+               goto err_out_release_mdesc;
+       }
+
+       port->vp = vp;
+       port->dev_no = *port_id;
+
+       if (port->dev_no >= 26)
+               snprintf(port->disk_name, sizeof(port->disk_name),
+                        VDCBLK_NAME "%c%c",
+                        'a' + (port->dev_no / 26) - 1,
+                        'a' + (port->dev_no % 26));
+       else
+               snprintf(port->disk_name, sizeof(port->disk_name),
+                        VDCBLK_NAME "%c", 'a' + (port->dev_no % 26));
+
+       err = vio_driver_init(&port->vio, vdev, VDEV_DISK,
+                             vdc_versions, ARRAY_SIZE(vdc_versions),
+                             &vdc_vio_ops, port->disk_name);
+       if (err)
+               goto err_out_free_port;
+
+       port->vdisk_block_size = 512;
+       port->max_xfer_size = ((128 * 1024) / port->vdisk_block_size);
+       port->ring_cookies = ((port->max_xfer_size *
+                              port->vdisk_block_size) / PAGE_SIZE) + 2;
+
+       err = vio_ldc_alloc(&port->vio, &vdc_ldc_cfg, port);
+       if (err)
+               goto err_out_free_port;
+
+       err = vdc_alloc_tx_ring(port);
+       if (err)
+               goto err_out_free_ldc;
+
+       err = probe_disk(port);
+       if (err)
+               goto err_out_free_tx_ring;
+
+       INIT_LIST_HEAD(&port->list);
+
+       spin_lock_irqsave(&vp->lock, flags);
+       list_add(&port->list, &vp->port_list);
+       spin_unlock_irqrestore(&vp->lock, flags);
+
+       dev_set_drvdata(&vdev->dev, port);
+
+       mdesc_release(hp);
+
+       return 0;
+
+err_out_free_tx_ring:
+       vdc_free_tx_ring(port);
+
+err_out_free_ldc:
+       vio_ldc_free(&port->vio);
+
+err_out_free_port:
+       kfree(port);
+
+err_out_release_mdesc:
+       mdesc_release(hp);
+       return err;
+}
+
+static int vdc_port_remove(struct vio_dev *vdev)
+{
+       struct vdc_port *port = dev_get_drvdata(&vdev->dev);
+
+       if (port) {
+               del_timer_sync(&port->vio.timer);
+
+               vdc_free_tx_ring(port);
+               vio_ldc_free(&port->vio);
+
+               dev_set_drvdata(&vdev->dev, NULL);
+
+               kfree(port);
+       }
+       return 0;
+}
+
+static struct vio_device_id vdc_port_match[] = {
+       {
+               .type = "vdc-port",
+       },
+       {},
+};
+MODULE_DEVICE_TABLE(vio, vdc_match);
+
+static struct vio_driver vdc_port_driver = {
+       .id_table       = vdc_port_match,
+       .probe          = vdc_port_probe,
+       .remove         = vdc_port_remove,
+       .driver         = {
+               .name   = "vdc_port",
+               .owner  = THIS_MODULE,
+       }
+};
+
+static int __devinit vdc_probe(struct vio_dev *vdev,
+                              const struct vio_device_id *id)
+{
+       static int vdc_version_printed;
+       struct vdc *vp;
+
+       if (vdc_version_printed++ == 0)
+               printk(KERN_INFO "%s", version);
+
+       vp = kzalloc(sizeof(struct vdc), GFP_KERNEL);
+       if (!vp)
+               return -ENOMEM;
+
+       spin_lock_init(&vp->lock);
+       vp->dev = vdev;
+       INIT_LIST_HEAD(&vp->port_list);
+
+       dev_set_drvdata(&vdev->dev, vp);
+
+       return 0;
+}
+
+static int vdc_remove(struct vio_dev *vdev)
+{
+
+       struct vdc *vp = dev_get_drvdata(&vdev->dev);
+
+       if (vp) {
+               kfree(vp);
+               dev_set_drvdata(&vdev->dev, NULL);
+       }
+       return 0;
+}
+
+static struct vio_device_id vdc_match[] = {
+       {
+               .type = "block",
+       },
+       {},
+};
+MODULE_DEVICE_TABLE(vio, vdc_match);
+
+static struct vio_driver vdc_driver = {
+       .id_table       = vdc_match,
+       .probe          = vdc_probe,
+       .remove         = vdc_remove,
+       .driver         = {
+               .name   = "vdc",
+               .owner  = THIS_MODULE,
+       }
+};
+
+static int __init vdc_init(void)
+{
+       int err;
+
+       err = register_blkdev(0, VDCBLK_NAME);
+       if (err < 0)
+               goto out_err;
+
+       vdc_major = err;
+       err = vio_register_driver(&vdc_driver);
+       if (err)
+               goto out_unregister_blkdev;
+
+       err = vio_register_driver(&vdc_port_driver);
+       if (err)
+               goto out_unregister_vdc;
+
+       return 0;
+
+out_unregister_vdc:
+       vio_unregister_driver(&vdc_driver);
+
+out_unregister_blkdev:
+       unregister_blkdev(vdc_major, VDCBLK_NAME);
+       vdc_major = 0;
+
+out_err:
+       return err;
+}
+
+static void __exit vdc_exit(void)
+{
+       vio_unregister_driver(&vdc_port_driver);
+       vio_unregister_driver(&vdc_driver);
+       unregister_blkdev(vdc_major, VDCBLK_NAME);
+}
+
+module_init(vdc_init);
+module_exit(vdc_exit);
index 7cc2685ca84abb08c29a8ec426cb871e84566ad6..2abf94cc3137ab9df84ebcdb8c9613fa5e4dd66b 100644 (file)
@@ -44,9 +44,6 @@
 extern int m68k_realnum_memory;
 extern struct mem_info m68k_memory[NUM_MEMINFO];
 
-#define TRUE                  (1)
-#define FALSE                 (0)
-
 #define Z2MINOR_COMBINED      (0)
 #define Z2MINOR_Z2ONLY        (1)
 #define Z2MINOR_CHIPONLY      (2)
index f6648682b43ab4669a8e06dbb46adf9649c94049..ec9dc3d53f18355ded75309baf8afd7746563032 100644 (file)
@@ -979,15 +979,14 @@ config GPIO_VR41XX
        depends on CPU_VR41XX
 
 config RAW_DRIVER
-       tristate "RAW driver (/dev/raw/rawN) (OBSOLETE)"
+       tristate "RAW driver (/dev/raw/rawN)"
        depends on BLOCK
        help
-         The raw driver permits block devices to be bound to /dev/raw/rawN. 
-         Once bound, I/O against /dev/raw/rawN uses efficient zero-copy I/O. 
+         The raw driver permits block devices to be bound to /dev/raw/rawN.
+         Once bound, I/O against /dev/raw/rawN uses efficient zero-copy I/O.
          See the raw(8) manpage for more details.
 
-          The raw driver is deprecated and will be removed soon.
-          Applications should simply open the device (eg /dev/hda1)
+          Applications should preferably open the device (eg /dev/hda1)
           with the O_DIRECT flag.
 
 config MAX_RAW_DEVS
index 2f56ecc035aa9366ba018074ef1aba24065b3b6b..f2996a95eb070e9e37057446c731f05667117131 100644 (file)
@@ -15,6 +15,7 @@ obj-y                         += misc.o
 obj-$(CONFIG_VT)               += vt_ioctl.o vc_screen.o consolemap.o \
                                   consolemap_deftbl.o selection.o keyboard.o
 obj-$(CONFIG_HW_CONSOLE)       += vt.o defkeymap.o
+obj-$(CONFIG_AUDIT)            += tty_audit.o
 obj-$(CONFIG_MAGIC_SYSRQ)      += sysrq.o
 obj-$(CONFIG_ESPSERIAL)                += esp.o
 obj-$(CONFIG_MVME147_SCC)      += generic_serial.o vme_scc.o
index 4eaceabd8cea6c09818f527c9816c24e1f29f3c3..7b02bf1289a2b2b0aad2f20d25cc06316967a38e 100644 (file)
@@ -738,6 +738,7 @@ static void change_speed(struct async_struct *info,
        }
        /* If the quotient is zero refuse the change */
        if (!quot && old_termios) {
+               /* FIXME: Will need updating for new tty in the end */
                info->tty->termios->c_cflag &= ~CBAUD;
                info->tty->termios->c_cflag |= (old_termios->c_cflag & CBAUD);
                baud = tty_get_baud_rate(info->tty);
@@ -783,7 +784,6 @@ static void change_speed(struct async_struct *info,
        /*
         * Set up parity check flag
         */
-#define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
 
        info->read_status_mask = UART_LSR_OE | UART_LSR_DR;
        if (I_INPCK(info->tty))
@@ -1367,11 +1367,6 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
        unsigned long flags;
        unsigned int cflag = tty->termios->c_cflag;
 
-       if (   (cflag == old_termios->c_cflag)
-           && (   RELEVANT_IFLAG(tty->termios->c_iflag) 
-               == RELEVANT_IFLAG(old_termios->c_iflag)))
-         return;
-
        change_speed(info, old_termios);
 
        /* Handle transition to B0 status */
index fd40b959afddd92c18a1924d74b24f14551df6b2..4b3916f549099d16b1a1ed1cb6d280eeafcd02ad 100644 (file)
@@ -177,6 +177,7 @@ struct uni_pagedir {
        unsigned long   refcount;
        unsigned long   sum;
        unsigned char   *inverse_translations[4];
+       u16             *inverse_trans_unicode;
        int             readonly;
 };
 
@@ -207,6 +208,41 @@ static void set_inverse_transl(struct vc_data *conp, struct uni_pagedir *p, int
        }
 }
 
+static void set_inverse_trans_unicode(struct vc_data *conp,
+                                     struct uni_pagedir *p)
+{
+       int i, j, k, glyph;
+       u16 **p1, *p2;
+       u16 *q;
+
+       if (!p) return;
+       q = p->inverse_trans_unicode;
+       if (!q) {
+               q = p->inverse_trans_unicode =
+                       kmalloc(MAX_GLYPH * sizeof(u16), GFP_KERNEL);
+               if (!q)
+                       return;
+       }
+       memset(q, 0, MAX_GLYPH * sizeof(u16));
+
+       for (i = 0; i < 32; i++) {
+               p1 = p->uni_pgdir[i];
+               if (!p1)
+                       continue;
+               for (j = 0; j < 32; j++) {
+                       p2 = p1[j];
+                       if (!p2)
+                               continue;
+                       for (k = 0; k < 64; k++) {
+                               glyph = p2[k];
+                               if (glyph >= 0 && glyph < MAX_GLYPH
+                                              && q[glyph] < 32)
+                                       q[glyph] = (i << 11) + (j << 6) + k;
+                       }
+               }
+       }
+}
+
 unsigned short *set_translate(int m, struct vc_data *vc)
 {
        inv_translate[vc->vc_num] = m;
@@ -217,19 +253,29 @@ unsigned short *set_translate(int m, struct vc_data *vc)
  * Inverse translation is impossible for several reasons:
  * 1. The font<->character maps are not 1-1.
  * 2. The text may have been written while a different translation map
- *    was active, or using Unicode.
+ *    was active.
  * Still, it is now possible to a certain extent to cut and paste non-ASCII.
  */
-unsigned char inverse_translate(struct vc_data *conp, int glyph)
+u16 inverse_translate(struct vc_data *conp, int glyph, int use_unicode)
 {
        struct uni_pagedir *p;
+       int m;
        if (glyph < 0 || glyph >= MAX_GLYPH)
                return 0;
-       else if (!(p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc) ||
-                !p->inverse_translations[inv_translate[conp->vc_num]])
+       else if (!(p = (struct uni_pagedir *)*conp->vc_uni_pagedir_loc))
                return glyph;
-       else
-               return p->inverse_translations[inv_translate[conp->vc_num]][glyph];
+       else if (use_unicode) {
+               if (!p->inverse_trans_unicode)
+                       return glyph;
+               else
+                       return p->inverse_trans_unicode[glyph];
+       } else {
+               m = inv_translate[conp->vc_num];
+               if (!p->inverse_translations[m])
+                       return glyph;
+               else
+                       return p->inverse_translations[m][glyph];
+       }
 }
 
 static void update_user_maps(void)
@@ -243,6 +289,7 @@ static void update_user_maps(void)
                p = (struct uni_pagedir *)*vc_cons[i].d->vc_uni_pagedir_loc;
                if (p && p != q) {
                        set_inverse_transl(vc_cons[i].d, p, USER_MAP);
+                       set_inverse_trans_unicode(vc_cons[i].d, p);
                        q = p;
                }
        }
@@ -353,6 +400,10 @@ static void con_release_unimap(struct uni_pagedir *p)
                kfree(p->inverse_translations[i]);
                p->inverse_translations[i] = NULL;
        }
+       if (p->inverse_trans_unicode) {
+               kfree(p->inverse_trans_unicode);
+               p->inverse_trans_unicode = NULL;
+       }
 }
 
 void con_free_unimap(struct vc_data *vc)
@@ -511,6 +562,7 @@ int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list)
 
        for (i = 0; i <= 3; i++)
                set_inverse_transl(vc, p, i); /* Update all inverse translations */
+       set_inverse_trans_unicode(vc, p);
   
        return err;
 }
@@ -561,6 +613,7 @@ int con_set_default_unimap(struct vc_data *vc)
 
        for (i = 0; i <= 3; i++)
                set_inverse_transl(vc, p, i);   /* Update all inverse translations */
+       set_inverse_trans_unicode(vc, p);
        dflt = p;
        return err;
 }
@@ -617,6 +670,19 @@ void con_protect_unimap(struct vc_data *vc, int rdonly)
                p->readonly = rdonly;
 }
 
+/* may be called during an interrupt */
+u32 conv_8bit_to_uni(unsigned char c)
+{
+       /*
+        * Always use USER_MAP. This function is used by the keyboard,
+        * which shouldn't be affected by G0/G1 switching, etc.
+        * If the user map still contains default values, i.e. the
+        * direct-to-font mapping, then assume user is using Latin1.
+        */
+       unsigned short uni = translations[USER_MAP][c];
+       return uni == (0xf000 | c) ? c : uni;
+}
+
 int
 conv_uni_to_pc(struct vc_data *conp, long ucs) 
 {
index ca376b92162c293fe3508852971305b14538b528..e04005b5f8a64e57de3ebfcaf3e448708257d571 100644 (file)
@@ -4127,10 +4127,6 @@ static void cy_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
        printk(KERN_DEBUG "cyc:cy_set_termios ttyC%d\n", info->line);
 #endif
 
-       if (tty->termios->c_cflag == old_termios->c_cflag &&
-                       (tty->termios->c_iflag & (IXON | IXANY)) ==
-                       (old_termios->c_iflag & (IXON | IXANY)))
-               return;
        set_line_char(info);
 
        if ((old_termios->c_cflag & CRTSCTS) &&
index d1bfbaa2aa0284f62a2d400ed8e74d34221106eb..74cd5118af5771160dfd9597d9fa427f8e0ff134 100644 (file)
@@ -1121,8 +1121,6 @@ static void change_speed(struct esp_struct *info)
        /*
         * Set up parity check flag
         */
-#define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
-
        info->read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
        if (I_INPCK(info->tty))
                info->read_status_mask |= UART_LSR_FE | UART_LSR_PE;
@@ -1920,11 +1918,6 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
        struct esp_struct *info = (struct esp_struct *)tty->driver_data;
        unsigned long flags;
 
-       if (   (tty->termios->c_cflag == old_termios->c_cflag)
-           && (   RELEVANT_IFLAG(tty->termios->c_iflag) 
-               == RELEVANT_IFLAG(old_termios->c_iflag)))
-               return;
-
        change_speed(info);
 
        spin_lock_irqsave(&info->lock, flags);
index 8ea02755b1c9c844c73ab78a185cdd870e3d64b1..8facf3e25c490f75773a857a012e66a968469654 100644 (file)
@@ -43,16 +43,6 @@ static int gs_debug;
 
 #define func_enter() gs_dprintk (GS_DEBUG_FLOW, "gs: enter %s\n", __FUNCTION__)
 #define func_exit()  gs_dprintk (GS_DEBUG_FLOW, "gs: exit  %s\n", __FUNCTION__)
-#define NEW_WRITE_LOCKING 1
-#if NEW_WRITE_LOCKING
-#define DECL      /* Nothing */
-#define LOCKIT    mutex_lock(& port->port_write_mutex);
-#define RELEASEIT mutex_unlock(&port->port_write_mutex);
-#else
-#define DECL      unsigned long flags;
-#define LOCKIT    save_flags (flags);cli ()
-#define RELEASEIT restore_flags (flags)
-#endif
 
 #define RS_EVENT_WRITE_WAKEUP  1
 
@@ -62,7 +52,6 @@ module_param(gs_debug, int, 0644);
 void gs_put_char(struct tty_struct * tty, unsigned char ch)
 {
        struct gs_port *port;
-       DECL
 
        func_enter (); 
 
@@ -75,11 +64,11 @@ void gs_put_char(struct tty_struct * tty, unsigned char ch)
        if (! (port->flags & ASYNC_INITIALIZED)) return;
 
        /* Take a lock on the serial tranmit buffer! */
-       LOCKIT;
+       mutex_lock(& port->port_write_mutex);
 
        if (port->xmit_cnt >= SERIAL_XMIT_SIZE - 1) {
                /* Sorry, buffer is full, drop character. Update statistics???? -- REW */
-               RELEASEIT;
+               mutex_unlock(&port->port_write_mutex);
                return;
        }
 
@@ -87,13 +76,11 @@ void gs_put_char(struct tty_struct * tty, unsigned char ch)
        port->xmit_head &= SERIAL_XMIT_SIZE - 1;
        port->xmit_cnt++;  /* Characters in buffer */
 
-       RELEASEIT;
+       mutex_unlock(&port->port_write_mutex);
        func_exit ();
 }
 
 
-#ifdef NEW_WRITE_LOCKING
-
 /*
 > Problems to take into account are:
 >       -1- Interrupts that empty part of the buffer.
@@ -166,90 +153,6 @@ int gs_write(struct tty_struct * tty,
        func_exit ();
        return total;
 }
-#else
-/*
-> Problems to take into account are:
->       -1- Interrupts that empty part of the buffer.
->       -2- page faults on the access to userspace. 
->       -3- Other processes that are also trying to do a "write". 
-*/
-
-int gs_write(struct tty_struct * tty,
-                    const unsigned char *buf, int count)
-{
-       struct gs_port *port;
-       int c, total = 0;
-       int t;
-       unsigned long flags;
-
-       func_enter ();
-
-       /* The standard serial driver returns 0 in this case. 
-          That sounds to me as "No error, I just didn't get to writing any
-          bytes. Feel free to try again." 
-          The "official" way to write n bytes from buf is:
-
-                for (nwritten = 0;nwritten < n;nwritten += rv) {
-                        rv = write (fd, buf+nwritten, n-nwritten);
-                        if (rv < 0) break; // Error: bail out. //
-                } 
-
-          which will loop endlessly in this case. The manual page for write
-          agrees with me. In practise almost everybody writes 
-          "write (fd, buf,n);" but some people might have had to deal with 
-          incomplete writes in the past and correctly implemented it by now... 
-        */
-
-       if (!tty) return -EIO;
-
-       port = tty->driver_data;
-       if (!port || !port->xmit_buf)
-               return -EIO;
-
-       local_save_flags(flags);
-       while (1) {
-               cli();
-               c = count;
-
-               /* This is safe because we "OWN" the "head". Noone else can 
-                  change the "head": we own the port_write_mutex. */
-               /* Don't overrun the end of the buffer */
-               t = SERIAL_XMIT_SIZE - port->xmit_head;
-               if (t < c) c = t;
-
-               /* This is safe because the xmit_cnt can only decrease. This 
-                  would increase "t", so we might copy too little chars. */
-               /* Don't copy past the "head" of the buffer */
-               t = SERIAL_XMIT_SIZE - 1 - port->xmit_cnt;
-               if (t < c) c = t;
-
-               /* Can't copy more? break out! */
-               if (c <= 0) {
-                       local_restore_flags(flags);
-                       break;
-               }
-               memcpy(port->xmit_buf + port->xmit_head, buf, c);
-               port->xmit_head = ((port->xmit_head + c) &
-                                  (SERIAL_XMIT_SIZE-1));
-               port->xmit_cnt += c;
-               local_restore_flags(flags);
-               buf += c;
-               count -= c;
-               total += c;
-       }
-
-       if (port->xmit_cnt && 
-           !tty->stopped && 
-           !tty->hw_stopped &&
-           !(port->flags & GS_TX_INTEN)) {
-               port->flags |= GS_TX_INTEN;
-               port->rd->enable_tx_interrupts (port);
-       }
-       func_exit ();
-       return total;
-}
-
-#endif
 
 
 
@@ -737,23 +640,6 @@ void gs_set_termios (struct tty_struct * tty,
                gs_dprintk (GS_DEBUG_TERMIOS, "termios structure (%p):\n", tiosp);
        }
 
-       /* This is an optimization that is only allowed for dumb cards */
-       /* Smart cards require knowledge of iflags and oflags too: that 
-          might change hardware cooking mode.... */
-       if (old_termios) {
-               if(   (tiosp->c_iflag == old_termios->c_iflag)
-                  && (tiosp->c_oflag == old_termios->c_oflag)
-                  && (tiosp->c_cflag == old_termios->c_cflag)
-                  && (tiosp->c_lflag == old_termios->c_lflag)
-                  && (tiosp->c_line  == old_termios->c_line)
-                  && (memcmp(tiosp->c_cc, old_termios->c_cc, NCC) == 0)) {
-                       gs_dprintk(GS_DEBUG_TERMIOS, "gs_set_termios: optimized away\n");
-                       return /* 0 */;
-               }
-       } else 
-               gs_dprintk(GS_DEBUG_TERMIOS, "gs_set_termios: no old_termios: "
-                          "no optimization\n");
-
        if(old_termios && (gs_debug & GS_DEBUG_TERMIOS)) {
                if(tiosp->c_iflag != old_termios->c_iflag)  printk("c_iflag changed\n");
                if(tiosp->c_oflag != old_termios->c_oflag)  printk("c_oflag changed\n");
index 9e1fc02967ffe7c73739dc5634d2e11f73998e50..69f0a2993af0f7456b118bcaa0931e7730751067 100644 (file)
@@ -173,7 +173,6 @@ static void gen_rtc_interrupt(unsigned long arg)
 static ssize_t gen_rtc_read(struct file *file, char __user *buf,
                        size_t count, loff_t *ppos)
 {
-       DECLARE_WAITQUEUE(wait, current);
        unsigned long data;
        ssize_t retval;
 
@@ -183,18 +182,10 @@ static ssize_t gen_rtc_read(struct file *file, char __user *buf,
        if (file->f_flags & O_NONBLOCK && !gen_rtc_irq_data)
                return -EAGAIN;
 
-       add_wait_queue(&gen_rtc_wait, &wait);
-       retval = -ERESTARTSYS;
-
-       while (1) {
-               set_current_state(TASK_INTERRUPTIBLE);
-               data = xchg(&gen_rtc_irq_data, 0);
-               if (data)
-                       break;
-               if (signal_pending(current))
-                       goto out;
-               schedule();
-       }
+       retval = wait_event_interruptible(gen_rtc_wait,
+                       (data = xchg(&gen_rtc_irq_data, 0)));
+       if (retval)
+               goto out;
 
        /* first test allows optimizer to nuke this case for 32-bit machines */
        if (sizeof (int) != sizeof (long) && count == sizeof (unsigned int)) {
@@ -206,10 +197,7 @@ static ssize_t gen_rtc_read(struct file *file, char __user *buf,
                retval = put_user(data, (unsigned long __user *)buf) ?:
                        sizeof(unsigned long);
        }
- out:
-       __set_current_state(TASK_RUNNING);
-       remove_wait_queue(&gen_rtc_wait, &wait);
-
+out:
        return retval;
 }
 
index 4ae9811d1a6c20a2f8f6a61b5affdaf0a5b15aa5..753f46052b874abdaa4f56ee55dd4dd2c542f3f5 100644 (file)
@@ -296,12 +296,10 @@ static int __init intel_init_hw_struct(struct intel_rng_hw *intel_rng_hw,
             (BIOS_CNTL_LOCK_ENABLE_MASK|BIOS_CNTL_WRITE_ENABLE_MASK))
            == BIOS_CNTL_LOCK_ENABLE_MASK) {
                static __initdata /*const*/ char warning[] =
-                       KERN_WARNING PFX "Firmware space is locked read-only. "
-                       KERN_WARNING PFX "If you can't or\n don't want to "
-                       KERN_WARNING PFX "disable this in firmware setup, and "
-                       KERN_WARNING PFX "if\n you are certain that your "
-                       KERN_WARNING PFX "system has a functional\n RNG, try"
-                       KERN_WARNING PFX "using the 'no_fwh_detect' option.\n";
+                       KERN_WARNING PFX "Firmware space is locked read-only. If you can't or\n"
+                       KERN_WARNING PFX "don't want to disable this in firmware setup, and if\n"
+                       KERN_WARNING PFX "you are certain that your system has a functional\n"
+                       KERN_WARNING PFX "RNG, try using the 'no_fwh_detect' option.\n";
 
                if (no_fwh_detect)
                        return -ENODEV;
index dd761a1e4f084709bd1e5c3dfac6ccbab5878826..61ef013b84457887fdf803c0e70fe75b713ff6fb 100644 (file)
@@ -43,8 +43,6 @@ static void iiEnableMailIrqIIEX(i2eBordStrPtr);
 static void iiWriteMaskII(i2eBordStrPtr, unsigned char);
 static void iiWriteMaskIIEX(i2eBordStrPtr, unsigned char);
 
-static void ii2DelayTimer(unsigned int);
-static void ii2DelayWakeup(unsigned long id);
 static void ii2Nop(void);
 
 //***************
@@ -55,8 +53,6 @@ static int ii2Safe;         // Safe I/O address for delay routine
 
 static int iiDelayed;  // Set when the iiResetDelay function is
                                                        // called. Cleared when ANY board is reset.
-static struct timer_list * pDelayTimer;   // Used by iiDelayTimer
-static wait_queue_head_t pDelayWait;    // Used by iiDelayTimer
 static rwlock_t Dl_spinlock;
 
 //********
@@ -86,9 +82,6 @@ static rwlock_t Dl_spinlock;
 static void
 iiEllisInit(void)
 {
-       pDelayTimer = kmalloc ( sizeof (struct timer_list), GFP_KERNEL );
-       init_timer(pDelayTimer);
-       init_waitqueue_head(&pDelayWait);
        LOCK_INIT(&Dl_spinlock);
 }
 
@@ -106,7 +99,6 @@ iiEllisInit(void)
 static void
 iiEllisCleanup(void)
 {
-       kfree(pDelayTimer);
 }
 
 //******************************************************************************
@@ -560,19 +552,6 @@ iiInitialize(i2eBordStrPtr pB)
        COMPLETE(pB, I2EE_GOOD);
 }
 
-//=======================================================
-// Delay Routines
-//
-// iiDelayIO
-// iiNop
-//=======================================================
-
-static void
-ii2DelayWakeup(unsigned long id)
-{
-       wake_up_interruptible ( &pDelayWait );
-}
-
 //******************************************************************************
 // Function:   ii2DelayTimer(mseconds)
 // Parameters: mseconds - number of milliseconds to delay
@@ -594,28 +573,7 @@ ii2DelayWakeup(unsigned long id)
 static void
 ii2DelayTimer(unsigned int mseconds)
 {
-       wait_queue_t wait;
-
-       init_waitqueue_entry(&wait, current);
-
-       init_timer ( pDelayTimer );
-
-       add_wait_queue(&pDelayWait, &wait);
-
-       set_current_state( TASK_INTERRUPTIBLE );
-
-       pDelayTimer->expires  = jiffies + ( mseconds + 9 ) / 10;
-       pDelayTimer->function = ii2DelayWakeup;
-       pDelayTimer->data     = 0;
-
-       add_timer ( pDelayTimer );
-
-       schedule();
-
-       set_current_state( TASK_RUNNING );
-       remove_wait_queue(&pDelayWait, &wait);
-
-       del_timer ( pDelayTimer );
+       msleep_interruptible(mseconds);
 }
 
 #if 0
index b894f67fdf14194fcef98d13b24af52031f7b9a6..0baa8fab4ea7af195589b73319c5712771a9821a 100644 (file)
@@ -2,11 +2,9 @@
 # IPMI device configuration
 #
 
-menu "IPMI"
-       depends on HAS_IOMEM
-
-config IPMI_HANDLER
+menuconfig IPMI_HANDLER
        tristate 'IPMI top-level message handler'
+       depends on HAS_IOMEM
        help
          This enables the central IPMI message handler, required for IPMI
         to work.
@@ -18,9 +16,10 @@ config IPMI_HANDLER
 
         If unsure, say N.
 
+if IPMI_HANDLER
+
 config IPMI_PANIC_EVENT
        bool 'Generate a panic event to all BMCs on a panic'
-       depends on IPMI_HANDLER
        help
          When a panic occurs, this will cause the IPMI message handler to
         generate an IPMI event describing the panic to each interface
@@ -40,14 +39,12 @@ config IPMI_PANIC_STRING
 
 config IPMI_DEVICE_INTERFACE
        tristate 'Device interface for IPMI'
-       depends on IPMI_HANDLER
        help
          This provides an IOCTL interface to the IPMI message handler so
         userland processes may use IPMI.  It supports poll() and select().
 
 config IPMI_SI
        tristate 'IPMI System Interface handler'
-       depends on IPMI_HANDLER
        help
          Provides a driver for System Interfaces (KCS, SMIC, BT).
         Currently, only KCS and SMIC are supported.  If
@@ -55,15 +52,13 @@ config IPMI_SI
 
 config IPMI_WATCHDOG
        tristate 'IPMI Watchdog Timer'
-       depends on IPMI_HANDLER
        help
          This enables the IPMI watchdog timer.
 
 config IPMI_POWEROFF
        tristate 'IPMI Poweroff'
-       depends on IPMI_HANDLER
        help
          This enables a function to power off the system with IPMI if
         the IPMI management controller is capable of this.
 
-endmenu
+endif # IPMI_HANDLER
index e02893b7b300907e8a1d18555c155c3b7283c8dc..b86186de7f07ea8486602cfb7b70b6a450bb21a1 100644 (file)
@@ -679,7 +679,7 @@ static int ipmi_poweroff_init (void)
 {
        int rv;
 
-       printk ("Copyright (C) 2004 MontaVista Software -"
+       printk (KERN_INFO "Copyright (C) 2004 MontaVista Software -"
                " IPMI Powerdown via sys_reboot.\n");
 
        if (poweroff_powercycle)
index 78e1b962fe35e4c83f6a0516709008d66fd40db5..4edfdda0cf99e0fa8bbc1933564550f3cdaac61b 100644 (file)
@@ -2857,7 +2857,7 @@ static int try_smi_init(struct smi_info *new_smi)
 
        mutex_unlock(&smi_infos_lock);
 
-       printk(IPMI %s interface initialized\n",si_to_str[new_smi->si_type]);
+       printk(KERN_INFO "IPMI %s interface initialized\n",si_to_str[new_smi->si_type]);
 
        return 0;
 
index 7b279d1de4a2eac8d6781269eb4b52f738d5cc5a..809409922996413f5668581cf9033ffd62a155c0 100644 (file)
@@ -1753,9 +1753,6 @@ static void stli_settermios(struct tty_struct *tty, struct ktermios *old)
                return;
 
        tiosp = tty->termios;
-       if ((tiosp->c_cflag == old->c_cflag) &&
-           (tiosp->c_iflag == old->c_iflag))
-               return;
 
        stli_mkasyport(portp, &aport, tiosp);
        stli_cmdwait(brdp, portp, A_SETPORT, &aport, sizeof(asyport_t), 0);
index 90965b4def5cda2e90f6d5def2f3e879bee14035..2ce0af1bd588a0c103cc39b6f25a95a8b734b74e 100644 (file)
@@ -24,6 +24,7 @@
  * 21-08-02: Converted to input API, major cleanup. (Vojtech Pavlik)
  */
 
+#include <linux/consolemap.h>
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/tty.h>
@@ -308,10 +309,9 @@ static void applkey(struct vc_data *vc, int key, char mode)
  * Many other routines do put_queue, but I think either
  * they produce ASCII, or they produce some user-assigned
  * string, and in both cases we might assume that it is
- * in utf-8 already. UTF-8 is defined for words of up to 31 bits,
- * but we need only 16 bits here
+ * in utf-8 already.
  */
-static void to_utf8(struct vc_data *vc, ushort c)
+static void to_utf8(struct vc_data *vc, uint c)
 {
        if (c < 0x80)
                /*  0******* */
@@ -320,11 +320,21 @@ static void to_utf8(struct vc_data *vc, ushort c)
                /* 110***** 10****** */
                put_queue(vc, 0xc0 | (c >> 6));
                put_queue(vc, 0x80 | (c & 0x3f));
-       } else {
+       } else if (c < 0x10000) {
+               if (c >= 0xD800 && c < 0xE000)
+                       return;
+               if (c == 0xFFFF)
+                       return;
                /* 1110**** 10****** 10****** */
                put_queue(vc, 0xe0 | (c >> 12));
                put_queue(vc, 0x80 | ((c >> 6) & 0x3f));
                put_queue(vc, 0x80 | (c & 0x3f));
+       } else if (c < 0x110000) {
+               /* 11110*** 10****** 10****** 10****** */
+               put_queue(vc, 0xf0 | (c >> 18));
+               put_queue(vc, 0x80 | ((c >> 12) & 0x3f));
+               put_queue(vc, 0x80 | ((c >> 6) & 0x3f));
+               put_queue(vc, 0x80 | (c & 0x3f));
        }
 }
 
@@ -393,7 +403,7 @@ static unsigned int handle_diacr(struct vc_data *vc, unsigned int ch)
                return d;
 
        if (kbd->kbdmode == VC_UNICODE)
-               to_utf8(vc, d);
+               to_utf8(vc, conv_8bit_to_uni(d));
        else if (d < 0x100)
                put_queue(vc, d);
 
@@ -407,7 +417,7 @@ static void fn_enter(struct vc_data *vc)
 {
        if (diacr) {
                if (kbd->kbdmode == VC_UNICODE)
-                       to_utf8(vc, diacr);
+                       to_utf8(vc, conv_8bit_to_uni(diacr));
                else if (diacr < 0x100)
                        put_queue(vc, diacr);
                diacr = 0;
@@ -617,7 +627,7 @@ static void k_unicode(struct vc_data *vc, unsigned int value, char up_flag)
                return;
        }
        if (kbd->kbdmode == VC_UNICODE)
-               to_utf8(vc, value);
+               to_utf8(vc, conv_8bit_to_uni(value));
        else if (value < 0x100)
                put_queue(vc, value);
 }
@@ -775,7 +785,7 @@ static void k_shift(struct vc_data *vc, unsigned char value, char up_flag)
        /* kludge */
        if (up_flag && shift_state != old_state && npadch != -1) {
                if (kbd->kbdmode == VC_UNICODE)
-                       to_utf8(vc, npadch & 0xffff);
+                       to_utf8(vc, npadch);
                else
                        put_queue(vc, npadch & 0xff);
                npadch = -1;
index 4e6fb9651a16435e5a4e3a9fd829ac14d4b5058d..71c8cd7fa15f8d5c32574ce95016f980e6830c41 100644 (file)
@@ -67,25 +67,13 @@ extern int pmu_device_init(void);
 #ifdef CONFIG_PROC_FS
 static void *misc_seq_start(struct seq_file *seq, loff_t *pos)
 {
-       struct miscdevice *p;
-       loff_t off = 0;
-
        mutex_lock(&misc_mtx);
-       list_for_each_entry(p, &misc_list, list) {
-               if (*pos == off++) 
-                       return p;
-       }
-       return NULL;
+       return seq_list_start(&misc_list, *pos);
 }
 
 static void *misc_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
-       struct list_head *n = ((struct miscdevice *)v)->list.next;
-
-       ++*pos;
-
-       return (n != &misc_list) ? list_entry(n, struct miscdevice, list)
-                : NULL;
+       return seq_list_next(v, &misc_list, pos);
 }
 
 static void misc_seq_stop(struct seq_file *seq, void *v)
@@ -95,7 +83,7 @@ static void misc_seq_stop(struct seq_file *seq, void *v)
 
 static int misc_seq_show(struct seq_file *seq, void *v)
 {
-       const struct miscdevice *p = v;
+       const struct miscdevice *p = list_entry(v, struct miscdevice, list);
 
        seq_printf(seq, "%3i %s\n", p->minor, p->name ? p->name : "");
        return 0;
index 7ac30612068b674e742fb5577ed169148347f03f..c716ef0dd370af5043590d12d314e8981daac754 100644 (file)
@@ -265,7 +265,7 @@ mspec_mmap(struct file *file, struct vm_area_struct *vma, int type)
        vdata->refcnt = ATOMIC_INIT(1);
        vma->vm_private_data = vdata;
 
-       vma->vm_flags |= (VM_IO | VM_LOCKED | VM_RESERVED | VM_PFNMAP);
+       vma->vm_flags |= (VM_IO | VM_RESERVED | VM_PFNMAP);
        if (vdata->type == MSPEC_FETCHOP || vdata->type == MSPEC_UNCACHED)
                vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
        vma->vm_ops = &mspec_vm_ops;
index 5953a45d7e96026340a120721e426ba9605c0258..2aee3fef0416cc6d689b428371761d12504afd01 100644 (file)
@@ -90,8 +90,6 @@
 #define UART_MCR_AFE           0x20
 #define UART_LSR_SPECIAL       0x1E
 
-#define RELEVANT_IFLAG(iflag)  (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK|\
-                                         IXON|IXOFF))
 
 #define IRQ_T(info) ((info->flags & ASYNC_SHARE_IRQ) ? IRQF_SHARED : IRQF_DISABLED)
 
@@ -1729,16 +1727,12 @@ static void mxser_set_termios(struct tty_struct *tty, struct ktermios *old_termi
        struct mxser_struct *info = tty->driver_data;
        unsigned long flags;
 
-       if ((tty->termios->c_cflag != old_termios->c_cflag) ||
-                       (RELEVANT_IFLAG(tty->termios->c_iflag) != RELEVANT_IFLAG(old_termios->c_iflag))) {
+       mxser_change_speed(info, old_termios);
 
-               mxser_change_speed(info, old_termios);
-
-               if ((old_termios->c_cflag & CRTSCTS) &&
-                               !(tty->termios->c_cflag & CRTSCTS)) {
-                       tty->hw_stopped = 0;
-                       mxser_start(tty);
-               }
+       if ((old_termios->c_cflag & CRTSCTS) &&
+                       !(tty->termios->c_cflag & CRTSCTS)) {
+               tty->hw_stopped = 0;
+               mxser_start(tty);
        }
 
 /* Handle sw stopped */
index 6cde448cd5b2177479e46ccd634e1a8335fb720a..6a563932ba191f31efbec7e1f4d088dc1ef44fb3 100644 (file)
@@ -72,8 +72,6 @@
 #define UART_MCR_AFE           0x20
 #define UART_LSR_SPECIAL       0x1E
 
-#define RELEVANT_IFLAG(iflag)  (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK|\
-                                         IXON|IXOFF))
 
 #define C168_ASIC_ID    1
 #define C104_ASIC_ID    2
@@ -1560,7 +1558,7 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp)
                        return -EFAULT;
                return 0;
        case MOXA_ASPP_MON_EXT: {
-               int status, p, shiftbit;
+               int p, shiftbit;
                unsigned long opmode;
                unsigned cflag, iflag;
 
@@ -1990,18 +1988,14 @@ static void mxser_set_termios(struct tty_struct *tty, struct ktermios *old_termi
        struct mxser_port *info = tty->driver_data;
        unsigned long flags;
 
-       if ((tty->termios->c_cflag != old_termios->c_cflag) ||
-                       (RELEVANT_IFLAG(tty->termios->c_iflag) != RELEVANT_IFLAG(old_termios->c_iflag))) {
-
-               spin_lock_irqsave(&info->slock, flags);
-               mxser_change_speed(info, old_termios);
-               spin_unlock_irqrestore(&info->slock, flags);
+       spin_lock_irqsave(&info->slock, flags);
+       mxser_change_speed(info, old_termios);
+       spin_unlock_irqrestore(&info->slock, flags);
 
-               if ((old_termios->c_cflag & CRTSCTS) &&
-                               !(tty->termios->c_cflag & CRTSCTS)) {
-                       tty->hw_stopped = 0;
-                       mxser_start(tty);
-               }
+       if ((old_termios->c_cflag & CRTSCTS) &&
+                       !(tty->termios->c_cflag & CRTSCTS)) {
+               tty->hw_stopped = 0;
+               mxser_start(tty);
        }
 
        /* Handle sw stopped */
index 337a87f86a3bff05dc22eb296591ac1c5ae5e03d..e8332f305d72a77b9e8d0579b8b222d5e66ea0ea 100644 (file)
@@ -400,7 +400,12 @@ static void n_hdlc_send_frames(struct n_hdlc *n_hdlc, struct tty_struct *tty)
                /* Send the next block of data to device */
                tty->flags |= (1 << TTY_DO_WRITE_WAKEUP);
                actual = tty->driver->write(tty, tbuf->buf, tbuf->count);
-                   
+
+               /* rollback was possible and has been done */
+               if (actual == -ERESTARTSYS) {
+                       n_hdlc->tbuf = tbuf;
+                       break;
+               }
                /* if transmit error, throw frame away by */
                /* pretending it was accepted by driver */
                if (actual < 0)
@@ -780,13 +785,14 @@ static unsigned int n_hdlc_tty_poll(struct tty_struct *tty, struct file *filp,
                poll_wait(filp, &tty->write_wait, wait);
 
                /* set bits for operations that won't block */
-               if(n_hdlc->rx_buf_list.head)
+               if (n_hdlc->rx_buf_list.head)
                        mask |= POLLIN | POLLRDNORM;    /* readable */
                if (test_bit(TTY_OTHER_CLOSED, &tty->flags))
                        mask |= POLLHUP;
-               if(tty_hung_up_p(filp))
+               if (tty_hung_up_p(filp))
                        mask |= POLLHUP;
-               if(n_hdlc->tx_free_buf_list.head)
+               if (!tty_is_writelocked(tty) &&
+                               n_hdlc->tx_free_buf_list.head)
                        mask |= POLLOUT | POLLWRNORM;   /* writable */
        }
        return mask;
@@ -861,7 +867,7 @@ static void n_hdlc_buf_put(struct n_hdlc_buf_list *list,
        spin_lock_irqsave(&list->spinlock,flags);
        
        buf->link=NULL;
-       if(list->tail)
+       if (list->tail)
                list->tail->link = buf;
        else
                list->head = buf;
index 14557a4822c0354047b804a2287846a725297955..6b918b80f73e6af785eeb34fdefa27e75ca32780 100644 (file)
@@ -1071,8 +1071,6 @@ static ssize_t r3964_read(struct tty_struct *tty, struct file *file,
        struct r3964_client_info *pClient;
        struct r3964_message *pMsg;
        struct r3964_client_message theMsg;
-       DECLARE_WAITQUEUE(wait, current);
-
        int count;
 
        TRACE_L("read()");
@@ -1086,16 +1084,8 @@ static ssize_t r3964_read(struct tty_struct *tty, struct file *file,
                                return -EAGAIN;
                        }
                        /* block until there is a message: */
-                       add_wait_queue(&pInfo->read_wait, &wait);
-repeat:
-                       __set_current_state(TASK_INTERRUPTIBLE);
-                       pMsg = remove_msg(pInfo, pClient);
-                       if (!pMsg && !signal_pending(current)) {
-                               schedule();
-                               goto repeat;
-                       }
-                       __set_current_state(TASK_RUNNING);
-                       remove_wait_queue(&pInfo->read_wait, &wait);
+                       wait_event_interruptible(pInfo->read_wait,
+                                       (pMsg = remove_msg(pInfo, pClient)));
                }
 
                /* If we still haven't got a message, we must have been signalled */
index 154f42203b0569c4f53c306376c6720e73cfa33d..038056911934c3b60a10a70553702ff33cb070b6 100644 (file)
@@ -45,6 +45,8 @@
 #include <linux/slab.h>
 #include <linux/poll.h>
 #include <linux/bitops.h>
+#include <linux/audit.h>
+#include <linux/file.h>
 
 #include <asm/uaccess.h>
 #include <asm/system.h>
@@ -78,6 +80,13 @@ static inline void free_buf(unsigned char *buf)
                free_page((unsigned long) buf);
 }
 
+static inline int tty_put_user(struct tty_struct *tty, unsigned char x,
+                              unsigned char __user *ptr)
+{
+       tty_audit_add_data(tty, &x, 1);
+       return put_user(x, ptr);
+}
+
 /**
  *     n_tty_set__room -       receive space
  *     @tty: terminal
@@ -1153,6 +1162,7 @@ static int copy_from_read_buf(struct tty_struct *tty,
        if (n) {
                retval = copy_to_user(*b, &tty->read_buf[tty->read_tail], n);
                n -= retval;
+               tty_audit_add_data(tty, &tty->read_buf[tty->read_tail], n);
                spin_lock_irqsave(&tty->read_lock, flags);
                tty->read_tail = (tty->read_tail + n) & (N_TTY_BUF_SIZE-1);
                tty->read_cnt -= n;
@@ -1279,7 +1289,7 @@ do_it_again:
                                break;
                        cs = tty->link->ctrl_status;
                        tty->link->ctrl_status = 0;
-                       if (put_user(cs, b++)) {
+                       if (tty_put_user(tty, cs, b++)) {
                                retval = -EFAULT;
                                b--;
                                break;
@@ -1321,7 +1331,7 @@ do_it_again:
 
                /* Deal with packet mode. */
                if (tty->packet && b == buf) {
-                       if (put_user(TIOCPKT_DATA, b++)) {
+                       if (tty_put_user(tty, TIOCPKT_DATA, b++)) {
                                retval = -EFAULT;
                                b--;
                                break;
@@ -1352,15 +1362,17 @@ do_it_again:
                                spin_unlock_irqrestore(&tty->read_lock, flags);
 
                                if (!eol || (c != __DISABLED_CHAR)) {
-                                       if (put_user(c, b++)) {
+                                       if (tty_put_user(tty, c, b++)) {
                                                retval = -EFAULT;
                                                b--;
                                                break;
                                        }
                                        nr--;
                                }
-                               if (eol)
+                               if (eol) {
+                                       tty_audit_push(tty);
                                        break;
+                               }
                        }
                        if (retval)
                                break;
@@ -1538,7 +1550,8 @@ static unsigned int normal_poll(struct tty_struct * tty, struct file * file, pol
                else
                        tty->minimum_to_wake = 1;
        }
-       if (tty->driver->chars_in_buffer(tty) < WAKEUP_CHARS &&
+       if (!tty_is_writelocked(tty) &&
+                       tty->driver->chars_in_buffer(tty) < WAKEUP_CHARS &&
                        tty->driver->write_room(tty) > 0)
                mask |= POLLOUT | POLLWRNORM;
        return mask;
index 204deaa0de80edb9f16ca0fd55923b13950924e0..98dec380af495607a0ce360720134234671347e4 100644 (file)
 
 #define PC             1
 #define ATARI          2
-#define COBALT         3
 
 /* select machine configuration */
 #if defined(CONFIG_ATARI)
 #  define MACH ATARI
 #elif defined(__i386__) || defined(__x86_64__) || defined(__arm__)  /* and others?? */
-#define MACH PC
-#  if defined(CONFIG_COBALT)
-#    include <linux/cobalt-nvram.h>
-#    define MACH COBALT
-#  else
-#    define MACH PC
-#  endif
+#  define MACH PC
 #else
 #  error Cannot build nvram driver for this machine configuration.
 #endif
 
 #endif
 
-#if MACH == COBALT
-
-#define CHECK_DRIVER_INIT()     1
-
-#define NVRAM_BYTES            (128-NVRAM_FIRST_BYTE)
-
-#define mach_check_checksum    cobalt_check_checksum
-#define mach_set_checksum      cobalt_set_checksum
-#define mach_proc_infos                cobalt_proc_infos
-
-#endif
-
 #if MACH == ATARI
 
 /* Special parameters for RTC in Atari machines */
@@ -604,177 +585,6 @@ pc_proc_infos(unsigned char *nvram, char *buffer, int *len,
 
 #endif /* MACH == PC */
 
-#if MACH == COBALT
-
-/* the cobalt CMOS has a wider range of its checksum */
-static int cobalt_check_checksum(void)
-{
-       int i;
-       unsigned short sum = 0;
-       unsigned short expect;
-
-       for (i = COBT_CMOS_CKS_START; i <= COBT_CMOS_CKS_END; ++i) {
-               if ((i == COBT_CMOS_CHECKSUM) || (i == (COBT_CMOS_CHECKSUM+1)))
-                       continue;
-
-               sum += __nvram_read_byte(i);
-       }
-       expect = __nvram_read_byte(COBT_CMOS_CHECKSUM) << 8 |
-           __nvram_read_byte(COBT_CMOS_CHECKSUM+1);
-       return ((sum & 0xffff) == expect);
-}
-
-static void cobalt_set_checksum(void)
-{
-       int i;
-       unsigned short sum = 0;
-
-       for (i = COBT_CMOS_CKS_START; i <= COBT_CMOS_CKS_END; ++i) {
-               if ((i == COBT_CMOS_CHECKSUM) || (i == (COBT_CMOS_CHECKSUM+1)))
-                       continue;
-
-               sum += __nvram_read_byte(i);
-       }
-
-       __nvram_write_byte(sum >> 8, COBT_CMOS_CHECKSUM);
-       __nvram_write_byte(sum & 0xff, COBT_CMOS_CHECKSUM+1);
-}
-
-#ifdef CONFIG_PROC_FS
-
-static int cobalt_proc_infos(unsigned char *nvram, char *buffer, int *len,
-       off_t *begin, off_t offset, int size)
-{
-       int i;
-       unsigned int checksum;
-       unsigned int flags;
-       char sernum[14];
-       char *key = "cNoEbTaWlOtR!";
-       unsigned char bto_csum;
-
-       spin_lock_irq(&rtc_lock);
-       checksum = __nvram_check_checksum();
-       spin_unlock_irq(&rtc_lock);
-
-       PRINT_PROC("Checksum status: %svalid\n", checksum ? "" : "not ");
-
-       flags = nvram[COBT_CMOS_FLAG_BYTE_0] << 8 
-           | nvram[COBT_CMOS_FLAG_BYTE_1];
-
-       PRINT_PROC("Console: %s\n",
-               flags & COBT_CMOS_CONSOLE_FLAG ?  "on": "off");
-
-       PRINT_PROC("Firmware Debug Messages: %s\n",
-               flags & COBT_CMOS_DEBUG_FLAG ? "on": "off");
-
-       PRINT_PROC("Auto Prompt: %s\n",
-               flags & COBT_CMOS_AUTO_PROMPT_FLAG ? "on": "off");
-
-       PRINT_PROC("Shutdown Status: %s\n",
-               flags & COBT_CMOS_CLEAN_BOOT_FLAG ? "clean": "dirty");
-
-       PRINT_PROC("Hardware Probe: %s\n",
-               flags & COBT_CMOS_HW_NOPROBE_FLAG ? "partial": "full");
-
-       PRINT_PROC("System Fault: %sdetected\n",
-               flags & COBT_CMOS_SYSFAULT_FLAG ? "": "not ");
-
-       PRINT_PROC("Panic on OOPS: %s\n",
-               flags & COBT_CMOS_OOPSPANIC_FLAG ? "yes": "no");
-
-       PRINT_PROC("Delayed Cache Initialization: %s\n",
-               flags & COBT_CMOS_DELAY_CACHE_FLAG ? "yes": "no");
-
-       PRINT_PROC("Show Logo at Boot: %s\n",
-               flags & COBT_CMOS_NOLOGO_FLAG ? "no": "yes");
-
-       PRINT_PROC("Boot Method: ");
-       switch (nvram[COBT_CMOS_BOOT_METHOD]) {
-       case COBT_CMOS_BOOT_METHOD_DISK:
-               PRINT_PROC("disk\n");
-               break;
-
-       case COBT_CMOS_BOOT_METHOD_ROM:
-               PRINT_PROC("rom\n");
-               break;
-
-       case COBT_CMOS_BOOT_METHOD_NET:
-               PRINT_PROC("net\n");
-               break;
-
-       default:
-               PRINT_PROC("unknown\n");
-               break;
-       }
-
-       PRINT_PROC("Primary Boot Device: %d:%d\n",
-               nvram[COBT_CMOS_BOOT_DEV0_MAJ],
-               nvram[COBT_CMOS_BOOT_DEV0_MIN] );
-       PRINT_PROC("Secondary Boot Device: %d:%d\n",
-               nvram[COBT_CMOS_BOOT_DEV1_MAJ],
-               nvram[COBT_CMOS_BOOT_DEV1_MIN] );
-       PRINT_PROC("Tertiary Boot Device: %d:%d\n",
-               nvram[COBT_CMOS_BOOT_DEV2_MAJ],
-               nvram[COBT_CMOS_BOOT_DEV2_MIN] );
-
-       PRINT_PROC("Uptime: %d\n",
-               nvram[COBT_CMOS_UPTIME_0] << 24 |
-               nvram[COBT_CMOS_UPTIME_1] << 16 |
-               nvram[COBT_CMOS_UPTIME_2] << 8  |
-               nvram[COBT_CMOS_UPTIME_3]);
-
-       PRINT_PROC("Boot Count: %d\n",
-               nvram[COBT_CMOS_BOOTCOUNT_0] << 24 |
-               nvram[COBT_CMOS_BOOTCOUNT_1] << 16 |
-               nvram[COBT_CMOS_BOOTCOUNT_2] << 8  |
-               nvram[COBT_CMOS_BOOTCOUNT_3]);
-
-       /* 13 bytes of serial num */
-       for (i=0 ; i<13 ; i++) {
-               sernum[i] = nvram[COBT_CMOS_SYS_SERNUM_0 + i];
-       }
-       sernum[13] = '\0';
-
-       checksum = 0;
-       for (i=0 ; i<13 ; i++) {
-               checksum += sernum[i] ^ key[i];
-       }
-       checksum = ((checksum & 0x7f) ^ (0xd6)) & 0xff;
-
-       PRINT_PROC("Serial Number: %s", sernum);
-       if (checksum != nvram[COBT_CMOS_SYS_SERNUM_CSUM]) {
-               PRINT_PROC(" (invalid checksum)");
-       }
-       PRINT_PROC("\n");
-
-       PRINT_PROC("Rom Revison: %d.%d.%d\n", nvram[COBT_CMOS_ROM_REV_MAJ],
-               nvram[COBT_CMOS_ROM_REV_MIN], nvram[COBT_CMOS_ROM_REV_REV]);
-
-       PRINT_PROC("BTO Server: %d.%d.%d.%d", nvram[COBT_CMOS_BTO_IP_0],
-               nvram[COBT_CMOS_BTO_IP_1], nvram[COBT_CMOS_BTO_IP_2],
-               nvram[COBT_CMOS_BTO_IP_3]);
-       bto_csum = nvram[COBT_CMOS_BTO_IP_0] + nvram[COBT_CMOS_BTO_IP_1]
-               + nvram[COBT_CMOS_BTO_IP_2] + nvram[COBT_CMOS_BTO_IP_3];
-       if (bto_csum != nvram[COBT_CMOS_BTO_IP_CSUM]) {
-               PRINT_PROC(" (invalid checksum)");
-       }
-       PRINT_PROC("\n");
-
-       if (flags & COBT_CMOS_VERSION_FLAG
-        && nvram[COBT_CMOS_VERSION] >= COBT_CMOS_VER_BTOCODE) {
-               PRINT_PROC("BTO Code: 0x%x\n",
-                       nvram[COBT_CMOS_BTO_CODE_0] << 24 |
-                       nvram[COBT_CMOS_BTO_CODE_1] << 16 |
-                       nvram[COBT_CMOS_BTO_CODE_2] << 8 |
-                       nvram[COBT_CMOS_BTO_CODE_3]);
-       }
-
-       return 1;
-}
-#endif /* CONFIG_PROC_FS */
-
-#endif /* MACH == COBALT */
-
 #if MACH == ATARI
 
 static int
index a3fd7e7ba5a977556ccae27fcb4ca2bffa0c4eee..0270080ff0c01bedf874624febcc3a245a995d02 100644 (file)
@@ -1702,7 +1702,8 @@ static int rp_write(struct tty_struct *tty,
        if (count <= 0 || rocket_paranoia_check(info, "rp_write"))
                return 0;
 
-       mutex_lock_interruptible(&info->write_mtx);
+       if (mutex_lock_interruptible(&info->write_mtx))
+               return -ERESTARTSYS;
 
 #ifdef ROCKET_DEBUG_WRITE
        printk(KERN_INFO "rp_write %d chars...", count);
index 20380a2c4dee400c877a44bdc92010b467130c7d..22cf7aa56cc470f6b04d464547c0cfc8a716efdf 100644 (file)
@@ -1159,7 +1159,8 @@ static void rtc_dropped_irq(unsigned long data)
 
        spin_unlock_irq(&rtc_lock);
 
-       printk(KERN_WARNING "rtc: lost some interrupts at %ldHz.\n", freq);
+       if (printk_ratelimit())
+               printk(KERN_WARNING "rtc: lost some interrupts at %ldHz.\n", freq);
 
        /* Now we have new data */
        wake_up_interruptible(&rtc_wait);
index a69f094d1ed3d8778d6c05506a346e1a56280f04..d63f5ccc29e6de95f3141bc9a8df5444e6d94b19 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <asm/uaccess.h>
 
+#include <linux/kbd_kern.h>
 #include <linux/vt_kern.h>
 #include <linux/consolemap.h>
 #include <linux/selection.h>
@@ -34,6 +35,7 @@ extern void poke_blanked_console(void);
 /* Variables for selection control. */
 /* Use a dynamic buffer, instead of static (Dec 1994) */
 struct vc_data *sel_cons;              /* must not be deallocated */
+static int use_unicode;
 static volatile int sel_start = -1;    /* cleared by clear_selection */
 static int sel_end;
 static int sel_buffer_lth;
@@ -54,10 +56,11 @@ static inline void highlight_pointer(const int where)
        complement_pos(sel_cons, where);
 }
 
-static unsigned char
+static u16
 sel_pos(int n)
 {
-       return inverse_translate(sel_cons, screen_glyph(sel_cons, n));
+       return inverse_translate(sel_cons, screen_glyph(sel_cons, n),
+                               use_unicode);
 }
 
 /* remove the current selection highlight, if any,
@@ -86,8 +89,8 @@ static u32 inwordLut[8]={
   0xFF7FFFFF  /* latin-1 accented letters, not division sign */
 };
 
-static inline int inword(const unsigned char c) {
-       return ( inwordLut[c>>5] >> (c & 0x1F) ) & 1;
+static inline int inword(const u16 c) {
+       return c > 0xff || (( inwordLut[c>>5] >> (c & 0x1F) ) & 1);
 }
 
 /* set inwordLut contents. Invoked by ioctl(). */
@@ -108,13 +111,36 @@ static inline unsigned short limit(const unsigned short v, const unsigned short
        return (v > u) ? u : v;
 }
 
+/* stores the char in UTF8 and returns the number of bytes used (1-3) */
+static int store_utf8(u16 c, char *p)
+{
+       if (c < 0x80) {
+               /*  0******* */
+               p[0] = c;
+               return 1;
+       } else if (c < 0x800) {
+               /* 110***** 10****** */
+               p[0] = 0xc0 | (c >> 6);
+               p[1] = 0x80 | (c & 0x3f);
+               return 2;
+       } else {
+               /* 1110**** 10****** 10****** */
+               p[0] = 0xe0 | (c >> 12);
+               p[1] = 0x80 | ((c >> 6) & 0x3f);
+               p[2] = 0x80 | (c & 0x3f);
+               return 3;
+       }
+}
+
 /* set the current selection. Invoked by ioctl() or by kernel code. */
 int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *tty)
 {
        struct vc_data *vc = vc_cons[fg_console].d;
        int sel_mode, new_sel_start, new_sel_end, spc;
        char *bp, *obp;
-       int i, ps, pe;
+       int i, ps, pe, multiplier;
+       u16 c;
+       struct kbd_struct *kbd = kbd_table + fg_console;
 
        poke_blanked_console();
 
@@ -158,6 +184,7 @@ int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *t
                clear_selection();
                sel_cons = vc_cons[fg_console].d;
        }
+       use_unicode = kbd && kbd->kbdmode == VC_UNICODE;
 
        switch (sel_mode)
        {
@@ -240,7 +267,8 @@ int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *t
        sel_end = new_sel_end;
 
        /* Allocate a new buffer before freeing the old one ... */
-       bp = kmalloc((sel_end-sel_start)/2+1, GFP_KERNEL);
+       multiplier = use_unicode ? 3 : 1;  /* chars can take up to 3 bytes */
+       bp = kmalloc((sel_end-sel_start)/2*multiplier+1, GFP_KERNEL);
        if (!bp) {
                printk(KERN_WARNING "selection: kmalloc() failed\n");
                clear_selection();
@@ -251,8 +279,12 @@ int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *t
 
        obp = bp;
        for (i = sel_start; i <= sel_end; i += 2) {
-               *bp = sel_pos(i);
-               if (!isspace(*bp++))
+               c = sel_pos(i);
+               if (use_unicode)
+                       bp += store_utf8(c, bp);
+               else
+                       *bp++ = c;
+               if (!isspace(c))
                        obp = bp;
                if (! ((i + 2) % vc->vc_size_row)) {
                        /* strip trailing blanks from line and add newline,
index 3ef593a9015f1d298348cc44040000182ef7b63e..73037a4d3c5023f2e7b31fccf804f61a8ece0b08 100644 (file)
@@ -885,53 +885,6 @@ found:
        return IRQ_HANDLED;
 }
 
-/* External camera command (exported to the motion eye v4l driver) */
-int sonypi_camera_command(int command, u8 value)
-{
-       if (!camera)
-               return -EIO;
-
-       mutex_lock(&sonypi_device.lock);
-
-       switch (command) {
-       case SONYPI_COMMAND_SETCAMERA:
-               if (value)
-                       sonypi_camera_on();
-               else
-                       sonypi_camera_off();
-               break;
-       case SONYPI_COMMAND_SETCAMERABRIGHTNESS:
-               sonypi_set(SONYPI_CAMERA_BRIGHTNESS, value);
-               break;
-       case SONYPI_COMMAND_SETCAMERACONTRAST:
-               sonypi_set(SONYPI_CAMERA_CONTRAST, value);
-               break;
-       case SONYPI_COMMAND_SETCAMERAHUE:
-               sonypi_set(SONYPI_CAMERA_HUE, value);
-               break;
-       case SONYPI_COMMAND_SETCAMERACOLOR:
-               sonypi_set(SONYPI_CAMERA_COLOR, value);
-               break;
-       case SONYPI_COMMAND_SETCAMERASHARPNESS:
-               sonypi_set(SONYPI_CAMERA_SHARPNESS, value);
-               break;
-       case SONYPI_COMMAND_SETCAMERAPICTURE:
-               sonypi_set(SONYPI_CAMERA_PICTURE, value);
-               break;
-       case SONYPI_COMMAND_SETCAMERAAGC:
-               sonypi_set(SONYPI_CAMERA_AGC, value);
-               break;
-       default:
-               printk(KERN_ERR "sonypi: sonypi_camera_command invalid: %d\n",
-                      command);
-               break;
-       }
-       mutex_unlock(&sonypi_device.lock);
-       return 0;
-}
-
-EXPORT_SYMBOL(sonypi_camera_command);
-
 static int sonypi_misc_fasync(int fd, struct file *filp, int on)
 {
        int retval;
index f02a0795983ffc70d945aaa070234f5a4b3da96b..f53e51ddb9d7582a11056a9f475347c5f53afe34 100644 (file)
@@ -160,8 +160,6 @@ typedef struct _DMABUFFERENTRY
 
 #define IO_PIN_SHUTDOWN_LIMIT 100
 
-#define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
-
 struct _input_signal_events {
        int     ri_up;  
        int     ri_down;
@@ -3064,12 +3062,6 @@ static void mgsl_set_termios(struct tty_struct *tty, struct ktermios *old_termio
                printk("%s(%d):mgsl_set_termios %s\n", __FILE__,__LINE__,
                        tty->driver->name );
        
-       /* just return if nothing has changed */
-       if ((tty->termios->c_cflag == old_termios->c_cflag)
-           && (RELEVANT_IFLAG(tty->termios->c_iflag) 
-               == RELEVANT_IFLAG(old_termios->c_iflag)))
-         return;
-
        mgsl_change_params(info);
 
        /* Handle transition to B0 status */
index 02b49bc000284028377f915dc39248ef71445d58..428b514201f4654bfbb97beddaeef00b85bb6e9c 100644 (file)
@@ -144,8 +144,6 @@ MODULE_PARM_DESC(dosyncppp, "Enable synchronous net device, 0=disable 1=enable")
 /*
  * tty support and callbacks
  */
-#define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
-
 static struct tty_driver *serial_driver;
 
 static int  open(struct tty_struct *tty, struct file * filp);
@@ -823,12 +821,6 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
 
        DBGINFO(("%s set_termios\n", tty->driver->name));
 
-       /* just return if nothing has changed */
-       if ((tty->termios->c_cflag == old_termios->c_cflag)
-           && (RELEVANT_IFLAG(tty->termios->c_iflag)
-               == RELEVANT_IFLAG(old_termios->c_iflag)))
-               return;
-
        change_params(info);
 
        /* Handle transition to B0 status */
index ef93d055bdd79dc64ba7889b64e87e2a67f3c597..a65407b32079808e16d211e7d75ed920f7eff995 100644 (file)
@@ -135,8 +135,6 @@ typedef struct _SCADESC_EX
 
 #define IO_PIN_SHUTDOWN_LIMIT 100
 
-#define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
-
 struct _input_signal_events {
        int     ri_up;
        int     ri_down;
@@ -927,12 +925,6 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
                printk("%s(%d):%s set_termios()\n", __FILE__,__LINE__,
                        tty->driver->name );
 
-       /* just return if nothing has changed */
-       if ((tty->termios->c_cflag == old_termios->c_cflag)
-           && (RELEVANT_IFLAG(tty->termios->c_iflag)
-               == RELEVANT_IFLAG(old_termios->c_iflag)))
-         return;
-
        change_params(info);
 
        /* Handle transition to B0 status */
index dc4e1ff7f56fae2567a6deb3bb19a213a71c90c2..8f3f7620f95a13afcc72b2fa36d142b1e5167303 100644 (file)
@@ -2,11 +2,9 @@
 # TPM device configuration
 #
 
-menu "TPM devices"
-       depends on HAS_IOMEM
-
-config TCG_TPM
+menuconfig TCG_TPM
        tristate "TPM Hardware Support"
+       depends on HAS_IOMEM
        depends on EXPERIMENTAL
        ---help---
          If you have a TPM security chip in your system, which
@@ -21,9 +19,11 @@ config TCG_TPM
          Note: For more TPM drivers enable CONFIG_PNP, CONFIG_ACPI
          and CONFIG_PNPACPI.
 
+if TCG_TPM
+
 config TCG_TIS
        tristate "TPM Interface Specification 1.2 Interface"
-       depends on TCG_TPM && PNPACPI
+       depends on PNPACPI
        ---help---
          If you have a TPM security chip that is compliant with the
          TCG TIS 1.2 TPM specification say Yes and it will be accessible
@@ -32,7 +32,7 @@ config TCG_TIS
 
 config TCG_NSC
        tristate "National Semiconductor TPM Interface"
-       depends on TCG_TPM && PNPACPI
+       depends on PNPACPI
        ---help---
          If you have a TPM security chip from National Semiconductor 
          say Yes and it will be accessible from within Linux.  To 
@@ -41,7 +41,6 @@ config TCG_NSC
 
 config TCG_ATMEL
        tristate "Atmel TPM Interface"
-       depends on TCG_TPM
        ---help---
          If you have a TPM security chip from Atmel say Yes and it 
          will be accessible from within Linux.  To compile this driver 
@@ -49,7 +48,7 @@ config TCG_ATMEL
 
 config TCG_INFINEON
        tristate "Infineon Technologies TPM Interface"
-       depends on TCG_TPM && PNPACPI
+       depends on PNPACPI
        ---help---
          If you have a TPM security chip from Infineon Technologies
          (either SLD 9630 TT 1.1 or SLB 9635 TT 1.2) say Yes and it
@@ -59,5 +58,4 @@ config TCG_INFINEON
          Further information on this driver and the supported hardware
          can be found at http://www.prosec.rub.de/tpm
 
-endmenu
-
+endif # TCG_TPM
diff --git a/drivers/char/tty_audit.c b/drivers/char/tty_audit.c
new file mode 100644 (file)
index 0000000..d222012
--- /dev/null
@@ -0,0 +1,345 @@
+/*
+ * Creating audit events from TTY input.
+ *
+ * Copyright (C) 2007 Red Hat, Inc.  All rights reserved.  This copyrighted
+ * material is made available to anyone wishing to use, modify, copy, or
+ * redistribute it subject to the terms and conditions of the GNU General
+ * Public License v.2.
+ *
+ * Authors: Miloslav Trmac <mitr@redhat.com>
+ */
+
+#include <linux/audit.h>
+#include <linux/file.h>
+#include <linux/tty.h>
+
+struct tty_audit_buf {
+       atomic_t count;
+       struct mutex mutex;     /* Protects all data below */
+       int major, minor;       /* The TTY which the data is from */
+       unsigned icanon:1;
+       size_t valid;
+       unsigned char *data;    /* Allocated size N_TTY_BUF_SIZE */
+};
+
+static struct tty_audit_buf *tty_audit_buf_alloc(int major, int minor,
+                                                int icanon)
+{
+       struct tty_audit_buf *buf;
+
+       buf = kmalloc(sizeof (*buf), GFP_KERNEL);
+       if (!buf)
+               goto err;
+       if (PAGE_SIZE != N_TTY_BUF_SIZE)
+               buf->data = kmalloc(N_TTY_BUF_SIZE, GFP_KERNEL);
+       else
+               buf->data = (unsigned char *)__get_free_page(GFP_KERNEL);
+       if (!buf->data)
+               goto err_buf;
+       atomic_set(&buf->count, 1);
+       mutex_init(&buf->mutex);
+       buf->major = major;
+       buf->minor = minor;
+       buf->icanon = icanon;
+       buf->valid = 0;
+       return buf;
+
+err_buf:
+       kfree(buf);
+err:
+       return NULL;
+}
+
+static void tty_audit_buf_free(struct tty_audit_buf *buf)
+{
+       WARN_ON(buf->valid != 0);
+       if (PAGE_SIZE != N_TTY_BUF_SIZE)
+               kfree(buf->data);
+       else
+               free_page((unsigned long)buf->data);
+       kfree(buf);
+}
+
+static void tty_audit_buf_put(struct tty_audit_buf *buf)
+{
+       if (atomic_dec_and_test(&buf->count))
+               tty_audit_buf_free(buf);
+}
+
+/**
+ *     tty_audit_buf_push      -       Push buffered data out
+ *
+ *     Generate an audit message from the contents of @buf, which is owned by
+ *     @tsk with @loginuid.  @buf->mutex must be locked.
+ */
+static void tty_audit_buf_push(struct task_struct *tsk, uid_t loginuid,
+                              struct tty_audit_buf *buf)
+{
+       struct audit_buffer *ab;
+
+       if (buf->valid == 0)
+               return;
+       if (audit_enabled == 0)
+               return;
+       ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_TTY);
+       if (ab) {
+               char name[sizeof(tsk->comm)];
+
+               audit_log_format(ab, "tty pid=%u uid=%u auid=%u major=%d "
+                                "minor=%d comm=", tsk->pid, tsk->uid,
+                                loginuid, buf->major, buf->minor);
+               get_task_comm(name, tsk);
+               audit_log_untrustedstring(ab, name);
+               audit_log_format(ab, " data=");
+               audit_log_n_untrustedstring(ab, buf->valid, buf->data);
+               audit_log_end(ab);
+       }
+       buf->valid = 0;
+}
+
+/**
+ *     tty_audit_buf_push_current      -       Push buffered data out
+ *
+ *     Generate an audit message from the contents of @buf, which is owned by
+ *     the current task.  @buf->mutex must be locked.
+ */
+static void tty_audit_buf_push_current(struct tty_audit_buf *buf)
+{
+       tty_audit_buf_push(current, audit_get_loginuid(current->audit_context),
+                          buf);
+}
+
+/**
+ *     tty_audit_exit  -       Handle a task exit
+ *
+ *     Make sure all buffered data is written out and deallocate the buffer.
+ *     Only needs to be called if current->signal->tty_audit_buf != %NULL.
+ */
+void tty_audit_exit(void)
+{
+       struct tty_audit_buf *buf;
+
+       spin_lock_irq(&current->sighand->siglock);
+       buf = current->signal->tty_audit_buf;
+       current->signal->tty_audit_buf = NULL;
+       spin_unlock_irq(&current->sighand->siglock);
+       if (!buf)
+               return;
+
+       mutex_lock(&buf->mutex);
+       tty_audit_buf_push_current(buf);
+       mutex_unlock(&buf->mutex);
+
+       tty_audit_buf_put(buf);
+}
+
+/**
+ *     tty_audit_fork  -       Copy TTY audit state for a new task
+ *
+ *     Set up TTY audit state in @sig from current.  @sig needs no locking.
+ */
+void tty_audit_fork(struct signal_struct *sig)
+{
+       spin_lock_irq(&current->sighand->siglock);
+       sig->audit_tty = current->signal->audit_tty;
+       spin_unlock_irq(&current->sighand->siglock);
+       sig->tty_audit_buf = NULL;
+}
+
+/**
+ *     tty_audit_push_task     -       Flush task's pending audit data
+ */
+void tty_audit_push_task(struct task_struct *tsk, uid_t loginuid)
+{
+       struct tty_audit_buf *buf;
+
+       spin_lock_irq(&tsk->sighand->siglock);
+       buf = tsk->signal->tty_audit_buf;
+       if (buf)
+               atomic_inc(&buf->count);
+       spin_unlock_irq(&tsk->sighand->siglock);
+       if (!buf)
+               return;
+
+       mutex_lock(&buf->mutex);
+       tty_audit_buf_push(tsk, loginuid, buf);
+       mutex_unlock(&buf->mutex);
+
+       tty_audit_buf_put(buf);
+}
+
+/**
+ *     tty_audit_buf_get       -       Get an audit buffer.
+ *
+ *     Get an audit buffer for @tty, allocate it if necessary.  Return %NULL
+ *     if TTY auditing is disabled or out of memory.  Otherwise, return a new
+ *     reference to the buffer.
+ */
+static struct tty_audit_buf *tty_audit_buf_get(struct tty_struct *tty)
+{
+       struct tty_audit_buf *buf, *buf2;
+
+       buf = NULL;
+       buf2 = NULL;
+       spin_lock_irq(&current->sighand->siglock);
+       if (likely(!current->signal->audit_tty))
+               goto out;
+       buf = current->signal->tty_audit_buf;
+       if (buf) {
+               atomic_inc(&buf->count);
+               goto out;
+       }
+       spin_unlock_irq(&current->sighand->siglock);
+
+       buf2 = tty_audit_buf_alloc(tty->driver->major,
+                                  tty->driver->minor_start + tty->index,
+                                  tty->icanon);
+       if (buf2 == NULL) {
+               audit_log_lost("out of memory in TTY auditing");
+               return NULL;
+       }
+
+       spin_lock_irq(&current->sighand->siglock);
+       if (!current->signal->audit_tty)
+               goto out;
+       buf = current->signal->tty_audit_buf;
+       if (!buf) {
+               current->signal->tty_audit_buf = buf2;
+               buf = buf2;
+               buf2 = NULL;
+       }
+       atomic_inc(&buf->count);
+       /* Fall through */
+ out:
+       spin_unlock_irq(&current->sighand->siglock);
+       if (buf2)
+               tty_audit_buf_free(buf2);
+       return buf;
+}
+
+/**
+ *     tty_audit_add_data      -       Add data for TTY auditing.
+ *
+ *     Audit @data of @size from @tty, if necessary.
+ */
+void tty_audit_add_data(struct tty_struct *tty, unsigned char *data,
+                       size_t size)
+{
+       struct tty_audit_buf *buf;
+       int major, minor;
+
+       if (unlikely(size == 0))
+               return;
+
+       buf = tty_audit_buf_get(tty);
+       if (!buf)
+               return;
+
+       mutex_lock(&buf->mutex);
+       major = tty->driver->major;
+       minor = tty->driver->minor_start + tty->index;
+       if (buf->major != major || buf->minor != minor
+           || buf->icanon != tty->icanon) {
+               tty_audit_buf_push_current(buf);
+               buf->major = major;
+               buf->minor = minor;
+               buf->icanon = tty->icanon;
+       }
+       do {
+               size_t run;
+
+               run = N_TTY_BUF_SIZE - buf->valid;
+               if (run > size)
+                       run = size;
+               memcpy(buf->data + buf->valid, data, run);
+               buf->valid += run;
+               data += run;
+               size -= run;
+               if (buf->valid == N_TTY_BUF_SIZE)
+                       tty_audit_buf_push_current(buf);
+       } while (size != 0);
+       mutex_unlock(&buf->mutex);
+       tty_audit_buf_put(buf);
+}
+
+/**
+ *     tty_audit_push  -       Push buffered data out
+ *
+ *     Make sure no audit data is pending for @tty on the current process.
+ */
+void tty_audit_push(struct tty_struct *tty)
+{
+       struct tty_audit_buf *buf;
+
+       spin_lock_irq(&current->sighand->siglock);
+       if (likely(!current->signal->audit_tty)) {
+               spin_unlock_irq(&current->sighand->siglock);
+               return;
+       }
+       buf = current->signal->tty_audit_buf;
+       if (buf)
+               atomic_inc(&buf->count);
+       spin_unlock_irq(&current->sighand->siglock);
+
+       if (buf) {
+               int major, minor;
+
+               major = tty->driver->major;
+               minor = tty->driver->minor_start + tty->index;
+               mutex_lock(&buf->mutex);
+               if (buf->major == major && buf->minor == minor)
+                       tty_audit_buf_push_current(buf);
+               mutex_unlock(&buf->mutex);
+               tty_audit_buf_put(buf);
+       }
+}
+
+/**
+ *     tty_audit_opening       -       A TTY is being opened.
+ *
+ *     As a special hack, tasks that close all their TTYs and open new ones
+ *     are assumed to be system daemons (e.g. getty) and auditing is
+ *     automatically disabled for them.
+ */
+void tty_audit_opening(void)
+{
+       int disable;
+
+       disable = 1;
+       spin_lock_irq(&current->sighand->siglock);
+       if (current->signal->audit_tty == 0)
+               disable = 0;
+       spin_unlock_irq(&current->sighand->siglock);
+       if (!disable)
+               return;
+
+       task_lock(current);
+       if (current->files) {
+               struct fdtable *fdt;
+               unsigned i;
+
+               /*
+                * We don't take a ref to the file, so we must hold ->file_lock
+                * instead.
+                */
+               spin_lock(&current->files->file_lock);
+               fdt = files_fdtable(current->files);
+               for (i = 0; i < fdt->max_fds; i++) {
+                       struct file *filp;
+
+                       filp = fcheck_files(current->files, i);
+                       if (filp && is_tty(filp)) {
+                               disable = 0;
+                               break;
+                       }
+               }
+               spin_unlock(&current->files->file_lock);
+       }
+       task_unlock(current);
+       if (!disable)
+               return;
+
+       spin_lock_irq(&current->sighand->siglock);
+       current->signal->audit_tty = 0;
+       spin_unlock_irq(&current->sighand->siglock);
+}
index a96f26a63fa2e6e54b98ed898dcda2488ac64d25..de37ebc3a4cf03fa9e94d68fbf7e0f70b9293337 100644 (file)
@@ -1503,6 +1503,15 @@ int tty_hung_up_p(struct file * filp)
 
 EXPORT_SYMBOL(tty_hung_up_p);
 
+/**
+ * is_tty      -       checker whether file is a TTY
+ */
+int is_tty(struct file *filp)
+{
+       return filp->f_op->read == tty_read
+               || filp->f_op->read == hung_up_tty_read;
+}
+
 static void session_clear_tty(struct pid *session)
 {
        struct task_struct *p;
@@ -1726,6 +1735,23 @@ static ssize_t tty_read(struct file * file, char __user * buf, size_t count,
        return i;
 }
 
+void tty_write_unlock(struct tty_struct *tty)
+{
+       mutex_unlock(&tty->atomic_write_lock);
+       wake_up_interruptible(&tty->write_wait);
+}
+
+int tty_write_lock(struct tty_struct *tty, int ndelay)
+{
+       if (!mutex_trylock(&tty->atomic_write_lock)) {
+               if (ndelay)
+                       return -EAGAIN;
+               if (mutex_lock_interruptible(&tty->atomic_write_lock))
+                       return -ERESTARTSYS;
+       }
+       return 0;
+}
+
 /*
  * Split writes up in sane blocksizes to avoid
  * denial-of-service type attacks
@@ -1737,13 +1763,12 @@ static inline ssize_t do_tty_write(
        const char __user *buf,
        size_t count)
 {
-       ssize_t ret = 0, written = 0;
+       ssize_t ret, written = 0;
        unsigned int chunk;
        
-       /* FIXME: O_NDELAY ... */
-       if (mutex_lock_interruptible(&tty->atomic_write_lock)) {
-               return -ERESTARTSYS;
-       }
+       ret = tty_write_lock(tty, file->f_flags & O_NDELAY);
+       if (ret < 0)
+               return ret;
 
        /*
         * We chunk up writes into a temporary buffer. This
@@ -1776,8 +1801,8 @@ static inline ssize_t do_tty_write(
 
                buf = kmalloc(chunk, GFP_KERNEL);
                if (!buf) {
-                       mutex_unlock(&tty->atomic_write_lock);
-                       return -ENOMEM;
+                       ret = -ENOMEM;
+                       goto out;
                }
                kfree(tty->write_buf);
                tty->write_cnt = chunk;
@@ -1812,7 +1837,8 @@ static inline ssize_t do_tty_write(
                inode->i_mtime = current_fs_time(inode->i_sb);
                ret = written;
        }
-       mutex_unlock(&tty->atomic_write_lock);
+out:
+       tty_write_unlock(tty);
        return ret;
 }
 
@@ -2016,11 +2042,9 @@ static int init_dev(struct tty_driver *driver, int idx,
        }
 
        if (!*ltp_loc) {
-               ltp = (struct ktermios *) kmalloc(sizeof(struct ktermios),
-                                                GFP_KERNEL);
+               ltp = kzalloc(sizeof(struct ktermios), GFP_KERNEL);
                if (!ltp)
                        goto free_mem_out;
-               memset(ltp, 0, sizeof(struct ktermios));
        }
 
        if (driver->type == TTY_DRIVER_TYPE_PTY) {
@@ -2049,11 +2073,9 @@ static int init_dev(struct tty_driver *driver, int idx,
                }
 
                if (!*o_ltp_loc) {
-                       o_ltp = (struct ktermios *)
-                               kmalloc(sizeof(struct ktermios), GFP_KERNEL);
+                       o_ltp = kzalloc(sizeof(struct ktermios), GFP_KERNEL);
                        if (!o_ltp)
                                goto free_mem_out;
-                       memset(o_ltp, 0, sizeof(struct ktermios));
                }
 
                /*
@@ -2660,6 +2682,7 @@ got_driver:
                __proc_set_tty(current, tty);
        spin_unlock_irq(&current->sighand->siglock);
        mutex_unlock(&tty_mutex);
+       tty_audit_opening();
        return 0;
 }
 
@@ -2722,8 +2745,10 @@ static int ptmx_open(struct inode * inode, struct file * filp)
 
        check_tty_count(tty, "tty_open");
        retval = ptm_driver->open(tty, filp);
-       if (!retval)
+       if (!retval) {
+               tty_audit_opening();
                return 0;
+       }
 out1:
        release_dev(filp);
        return retval;
@@ -3163,14 +3188,13 @@ static int tiocsetd(struct tty_struct *tty, int __user *p)
 
 static int send_break(struct tty_struct *tty, unsigned int duration)
 {
-       if (mutex_lock_interruptible(&tty->atomic_write_lock))
+       if (tty_write_lock(tty, 0) < 0)
                return -EINTR;
        tty->driver->break_ctl(tty, -1);
-       if (!signal_pending(current)) {
+       if (!signal_pending(current))
                msleep_interruptible(duration);
-       }
        tty->driver->break_ctl(tty, 0);
-       mutex_unlock(&tty->atomic_write_lock);
+       tty_write_unlock(tty);
        if (signal_pending(current))
                return -EINTR;
        return 0;
@@ -3739,9 +3763,8 @@ struct tty_driver *alloc_tty_driver(int lines)
 {
        struct tty_driver *driver;
 
-       driver = kmalloc(sizeof(struct tty_driver), GFP_KERNEL);
+       driver = kzalloc(sizeof(struct tty_driver), GFP_KERNEL);
        if (driver) {
-               memset(driver, 0, sizeof(struct tty_driver));
                driver->magic = TTY_DRIVER_MAGIC;
                driver->num = lines;
                /* later we'll move allocation of tables here */
index fd471cb3338fbd1d008c936f5d44cfe5691a952b..3423e9ee6481c1874898e448dc7e9712b3b33195 100644 (file)
@@ -52,8 +52,6 @@
 
 void tty_wait_until_sent(struct tty_struct * tty, long timeout)
 {
-       DECLARE_WAITQUEUE(wait, current);
-
 #ifdef TTY_DEBUG_WAIT_UNTIL_SENT
        char buf[64];
        
@@ -61,26 +59,13 @@ void tty_wait_until_sent(struct tty_struct * tty, long timeout)
 #endif
        if (!tty->driver->chars_in_buffer)
                return;
-       add_wait_queue(&tty->write_wait, &wait);
        if (!timeout)
                timeout = MAX_SCHEDULE_TIMEOUT;
-       do {
-#ifdef TTY_DEBUG_WAIT_UNTIL_SENT
-               printk(KERN_DEBUG "waiting %s...(%d)\n", tty_name(tty, buf),
-                      tty->driver->chars_in_buffer(tty));
-#endif
-               set_current_state(TASK_INTERRUPTIBLE);
-               if (signal_pending(current))
-                       goto stop_waiting;
-               if (!tty->driver->chars_in_buffer(tty))
-                       break;
-               timeout = schedule_timeout(timeout);
-       } while (timeout);
+       if (wait_event_interruptible_timeout(tty->write_wait,
+                       !tty->driver->chars_in_buffer(tty), timeout))
+               return;
        if (tty->driver->wait_until_sent)
                tty->driver->wait_until_sent(tty, timeout);
-stop_waiting:
-       set_current_state(TASK_RUNNING);
-       remove_wait_queue(&tty->write_wait, &wait);
 }
 
 EXPORT_SYMBOL(tty_wait_until_sent);
@@ -276,13 +261,12 @@ void tty_termios_encode_baud_rate(struct ktermios *termios, speed_t ibaud, speed
                                termios->c_cflag |= (baud_bits[i] << IBSHIFT);
                        ifound = i;
                }
-       }
-       while(++i < n_baud_table);
+       } while (++i < n_baud_table);
        if (ofound == -1)
                termios->c_cflag |= BOTHER;
        /* Set exact input bits only if the input and output differ or the
           user already did */
-       if (ifound == -1 && (ibaud != obaud  || ibinput))
+       if (ifound == -1 && (ibaud != obaud || ibinput))
                termios->c_cflag |= (BOTHER << IBSHIFT);
 }
 
@@ -575,7 +559,7 @@ static int set_sgttyb(struct tty_struct * tty, struct sgttyb __user * sgttyb)
                return -EFAULT;
 
        mutex_lock(&tty->termios_mutex);
-       termios =  *tty->termios;
+       termios = *tty->termios;
        termios.c_cc[VERASE] = tmp.sg_erase;
        termios.c_cc[VKILL] = tmp.sg_kill;
        set_sgflags(&termios, tmp.sg_flags);
@@ -667,7 +651,7 @@ static int send_prio_char(struct tty_struct *tty, char ch)
                return 0;
        }
 
-       if (mutex_lock_interruptible(&tty->atomic_write_lock))
+       if (tty_write_lock(tty, 0) < 0)
                return -ERESTARTSYS;
 
        if (was_stopped)
@@ -675,7 +659,7 @@ static int send_prio_char(struct tty_struct *tty, char ch)
        tty->driver->write(tty, &ch, 1);
        if (was_stopped)
                stop_tty(tty);
-       mutex_unlock(&tty->atomic_write_lock);
+       tty_write_unlock(tty);
        return 0;
 }
 
index e0bdc0db9640e51647dda54472a5919eb3b0ec45..100bfd42206673e0345974a611f65b9f9b6c7352 100644 (file)
@@ -1,6 +1,5 @@
-menu "Connector - unified userspace <-> kernelspace linker"
 
-config CONNECTOR
+menuconfig CONNECTOR
        tristate "Connector - unified userspace <-> kernelspace linker"
        depends on NET
        ---help---
@@ -10,6 +9,8 @@ config CONNECTOR
          Connector support can also be built as a module.  If so, the module
          will be called cn.ko.
 
+if CONNECTOR
+
 config PROC_EVENTS
        boolean "Report process events to userspace"
        depends on CONNECTOR=y
@@ -18,4 +19,4 @@ config PROC_EVENTS
          Provide a connector that reports process events to userspace. Send
          events such as fork, exec, id change (uid, gid, suid, etc), and exit.
 
-endmenu
+endif # CONNECTOR
index bb90cbd7ca51ce87d9d979993d1ae5ce6c0bda61..84ebfcc1ffb45ef8b89550dd05146975753d97ad 100644 (file)
@@ -1,4 +1,9 @@
-menu "Hardware crypto devices"
+
+menuconfig CRYPTO_HW
+       bool "Hardware crypto devices"
+       default y
+
+if CRYPTO_HW
 
 config CRYPTO_DEV_PADLOCK
        tristate "Support for VIA PadLock ACE"
@@ -78,4 +83,4 @@ config ZCRYPT_MONOLITHIC
          that contains all parts of the crypto device driver (ap bus,
          request router and all the card drivers).
 
-endmenu
+endif # CRYPTO_HW
index b31756d599787b6872077f1829c506574a8f6a24..8f670dae53bb31ea3d520f3f73d8ef0f98483b7c 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 menu "DMA Engine support"
-       depends on !S390
+       depends on HAS_DMA
 
 config DMA_ENGINE
        bool "Support for DMA engines"
index 807c402df0495801fc98a53f2a1ff824cc595c4b..debf1d8e8b417ba6e2f92df7f64f376ffc299bd7 100644 (file)
@@ -6,11 +6,9 @@
 # $Id: Kconfig,v 1.4.2.7 2005/07/08 22:05:38 dsp_llnl Exp $
 #
 
-menu 'EDAC - error detection and reporting (RAS) (EXPERIMENTAL)'
+menuconfig EDAC
+       tristate "EDAC - error detection and reporting (EXPERIMENTAL)"
        depends on HAS_IOMEM
-
-config EDAC
-       tristate "EDAC core system error reporting (EXPERIMENTAL)"
        depends on X86 && EXPERIMENTAL
        help
          EDAC is designed to report errors in the core system.
@@ -30,13 +28,12 @@ config EDAC
          There is also a mailing list for the EDAC project, which can
          be found via the sourceforge page.
 
+if EDAC
 
 comment "Reporting subsystems"
-       depends on EDAC
 
 config EDAC_DEBUG
        bool "Debugging"
-       depends on EDAC
        help
          This turns on debugging information for the entire EDAC
          sub-system. You can insert module with "debug_level=x", current
@@ -45,7 +42,6 @@ config EDAC_DEBUG
 
 config EDAC_MM_EDAC
        tristate "Main Memory EDAC (Error Detection And Correction) reporting"
-       depends on EDAC
        default y
        help
          Some systems are able to detect and correct errors in main
@@ -100,15 +96,13 @@ config EDAC_R82600
 
 choice
        prompt "Error detecting method"
-       depends on EDAC
        default EDAC_POLL
 
 config EDAC_POLL
        bool "Poll for errors"
-       depends on EDAC
        help
          Poll the chipset periodically to detect errors.
 
 endchoice
 
-endmenu
+endif # EDAC
index 15232271d848c225364df28d17b10dc7d60217be..0fb730ee1da845f75af2e19ba28b5eba34386301 100644 (file)
@@ -669,7 +669,7 @@ edd_get_pci_dev(struct edd_device *edev)
        struct edd_info *info = edd_dev_get_info(edev);
 
        if (edd_dev_is_type(edev, "PCI")) {
-               return pci_find_slot(info->params.interface_path.pci.bus,
+               return pci_get_bus_and_slot(info->params.interface_path.pci.bus,
                                     PCI_DEVFN(info->params.interface_path.pci.slot,
                                               info->params.interface_path.pci.
                                               function));
@@ -682,9 +682,12 @@ edd_create_symlink_to_pcidev(struct edd_device *edev)
 {
 
        struct pci_dev *pci_dev = edd_get_pci_dev(edev);
+       int ret;
        if (!pci_dev)
                return 1;
-       return sysfs_create_link(&edev->kobj,&pci_dev->dev.kobj,"pci_dev");
+       ret = sysfs_create_link(&edev->kobj,&pci_dev->dev.kobj,"pci_dev");
+       pci_dev_put(pci_dev);
+       return ret;
 }
 
 static inline void
index 2b4b76e8bd723ac25b6aa57b55cf57e23736297a..58e9f8e457f833671813c4b71a20b252775efb4d 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/console.h>
 #include <linux/efi.h>
 #include <linux/serial.h>
+#include <linux/serial_8250.h>
 #include <asm/vga.h>
 #include "pcdp.h"
 
@@ -27,7 +28,7 @@ setup_serial_console(struct pcdp_uart *uart)
        char parity;
 
        mmio = (uart->addr.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY);
-       p += sprintf(p, "console=uart,%s,0x%lx",
+       p += sprintf(p, "uart8250,%s,0x%lx",
                mmio ? "mmio" : "io", uart->addr.address);
        if (uart->baud) {
                p += sprintf(p, ",%lu", uart->baud);
@@ -41,7 +42,8 @@ setup_serial_console(struct pcdp_uart *uart)
                }
        }
 
-       return early_serial_console_init(options);
+       add_preferred_console("uart", 8250, &options[9]);
+       return setup_early_serial8250_console(options);
 #else
        return -ENODEV;
 #endif
index adfea3c7c62af3a2a8dca67a4b14a5eefa8e32e3..bc77c5e2ca9f49b799b5929fce616eaf75d25847 100644 (file)
@@ -248,21 +248,15 @@ static int adb_scan_bus(void)
 static int
 adb_probe_task(void *x)
 {
-       sigset_t blocked;
-
        strcpy(current->comm, "kadbprobe");
 
-       sigfillset(&blocked);
-       sigprocmask(SIG_BLOCK, &blocked, NULL);
-       flush_signals(current);
-
        printk(KERN_INFO "adb: starting probe task...\n");
        do_adb_reset_bus();
        printk(KERN_INFO "adb: finished probe task...\n");
-       
+
        adb_probe_task_pid = 0;
        up(&adb_probe_mutex);
-       
+
        return 0;
 }
 
index f4ac21e5771e8da2d9bcb42455407f7c22ddaaf4..5afa0e393ecff9aac86d3806951a0e5127a0d0e8 100644 (file)
@@ -1,9 +1,6 @@
 
-menu "I2O device support"
-       depends on PCI
-
-config I2O
-       tristate "I2O support"
+menuconfig I2O
+       tristate "I2O device support"
        depends on PCI
        ---help---
          The Intelligent Input/Output (I2O) architecture allows hardware
@@ -25,9 +22,10 @@ config I2O
 
          If unsure, say N.
 
+if I2O
+
 config I2O_LCT_NOTIFY_ON_CHANGES
        bool "Enable LCT notification"
-       depends on I2O
        default y
        ---help---
          Only say N here if you have a I2O controller from SUN. The SUN
@@ -39,7 +37,6 @@ config I2O_LCT_NOTIFY_ON_CHANGES
 
 config I2O_EXT_ADAPTEC
        bool "Enable Adaptec extensions"
-       depends on I2O
        default y
        ---help---
          Say Y for support of raidutils for Adaptec I2O controllers. You also
@@ -57,7 +54,7 @@ config I2O_EXT_ADAPTEC_DMA64
 
 config I2O_CONFIG
        tristate "I2O Configuration support"
-       depends on I2O
+       depends on VIRT_TO_BUS
        ---help---
          Say Y for support of the configuration interface for the I2O adapters.
          If you have a RAID controller from Adaptec and you want to use the
@@ -78,7 +75,6 @@ config I2O_CONFIG_OLD_IOCTL
 
 config I2O_BUS
        tristate "I2O Bus Adapter OSM"
-       depends on I2O
        ---help---
          Include support for the I2O Bus Adapter OSM. The Bus Adapter OSM
          provides access to the busses on the I2O controller. The main purpose
@@ -89,7 +85,7 @@ config I2O_BUS
 
 config I2O_BLOCK
        tristate "I2O Block OSM"
-       depends on I2O && BLOCK
+       depends on BLOCK
        ---help---
          Include support for the I2O Block OSM. The Block OSM presents disk
          and other structured block devices to the operating system. If you
@@ -102,7 +98,7 @@ config I2O_BLOCK
 
 config I2O_SCSI
        tristate "I2O SCSI OSM"
-       depends on I2O && SCSI
+       depends on SCSI
        ---help---
          Allows direct SCSI access to SCSI devices on a SCSI or FibreChannel
          I2O controller. You can use both the SCSI and Block OSM together if
@@ -114,7 +110,6 @@ config I2O_SCSI
 
 config I2O_PROC
        tristate "I2O /proc support"
-       depends on I2O
        ---help---
          If you say Y here and to "/proc file system support", you will be
          able to read I2O related information from the virtual directory
@@ -123,5 +118,4 @@ config I2O_PROC
          To compile this support as a module, choose M here: the
          module will be called i2o_proc.
 
-endmenu
-
+endif # I2O
index 611adc3c0f7443ab1043d2b5b812961b932741ff..489d7c5c49656d0c1fce8cdf17ba15a6a0041508 100644 (file)
@@ -62,7 +62,7 @@ int i2o_device_claim(struct i2o_device *dev)
 {
        int rc = 0;
 
-       down(&dev->lock);
+       mutex_lock(&dev->lock);
 
        rc = i2o_device_issue_claim(dev, I2O_CMD_UTIL_CLAIM, I2O_CLAIM_PRIMARY);
        if (!rc)
@@ -72,7 +72,7 @@ int i2o_device_claim(struct i2o_device *dev)
                pr_debug("i2o: claim of device %d failed %d\n",
                         dev->lct_data.tid, rc);
 
-       up(&dev->lock);
+       mutex_unlock(&dev->lock);
 
        return rc;
 }
@@ -96,7 +96,7 @@ int i2o_device_claim_release(struct i2o_device *dev)
        int tries;
        int rc = 0;
 
-       down(&dev->lock);
+       mutex_lock(&dev->lock);
 
        /*
         *      If the controller takes a nonblocking approach to
@@ -118,7 +118,7 @@ int i2o_device_claim_release(struct i2o_device *dev)
                pr_debug("i2o: claim release of device %d failed %d\n",
                         dev->lct_data.tid, rc);
 
-       up(&dev->lock);
+       mutex_unlock(&dev->lock);
 
        return rc;
 }
@@ -198,7 +198,7 @@ static struct i2o_device *i2o_device_alloc(void)
                return ERR_PTR(-ENOMEM);
 
        INIT_LIST_HEAD(&dev->list);
-       init_MUTEX(&dev->lock);
+       mutex_init(&dev->lock);
 
        dev->device.bus = &i2o_bus_type;
        dev->device.release = &i2o_device_release;
@@ -326,7 +326,7 @@ int i2o_device_parse_lct(struct i2o_controller *c)
        u16 table_size;
        u32 buf;
 
-       down(&c->lct_lock);
+       mutex_lock(&c->lct_lock);
 
        kfree(c->lct);
 
@@ -335,7 +335,7 @@ int i2o_device_parse_lct(struct i2o_controller *c)
 
        lct = c->lct = kmalloc(table_size * 4, GFP_KERNEL);
        if (!lct) {
-               up(&c->lct_lock);
+               mutex_unlock(&c->lct_lock);
                return -ENOMEM;
        }
 
@@ -408,7 +408,7 @@ int i2o_device_parse_lct(struct i2o_controller *c)
                        i2o_device_remove(dev);
        }
 
-       up(&c->lct_lock);
+       mutex_unlock(&c->lct_lock);
 
        return 0;
 }
index 5278aad92bc4efeeec20fab11c5c5a603772896d..c13b9321e7ab115a242e22f5c607bc84b715f9d4 100644 (file)
@@ -537,7 +537,7 @@ static int i2o_exec_lct_notify(struct i2o_controller *c, u32 change_ind)
        struct device *dev;
        struct i2o_message *msg;
 
-       down(&c->lct_lock);
+       mutex_lock(&c->lct_lock);
 
        dev = &c->pdev->dev;
 
@@ -561,7 +561,7 @@ static int i2o_exec_lct_notify(struct i2o_controller *c, u32 change_ind)
 
        i2o_msg_post(c, msg);
 
-       up(&c->lct_lock);
+       mutex_unlock(&c->lct_lock);
 
        return 0;
 };
index 3305c12372a2f341c68fbca98f3ab5c58e2f7f9a..a1ec16a075c62a2a585684e6583a35d23589130f 100644 (file)
@@ -1067,7 +1067,7 @@ struct i2o_controller *i2o_iop_alloc(void)
 
        INIT_LIST_HEAD(&c->devices);
        spin_lock_init(&c->lock);
-       init_MUTEX(&c->lct_lock);
+       mutex_init(&c->lct_lock);
 
        device_initialize(&c->device);
 
index bd601efa7bd188b77a3ced5e24a4f7684684a76a..a92b8728b90cca196b106e2406140938c4493445 100644 (file)
@@ -2,7 +2,11 @@
 # Misc strange devices
 #
 
-menu "Misc devices"
+menuconfig MISC_DEVICES
+       bool "Misc devices"
+       default y
+
+if MISC_DEVICES
 
 config IBM_ASM
        tristate "Device driver for IBM RSA service processor"
@@ -192,4 +196,4 @@ config THINKPAD_ACPI_BAY
 
          If you are not sure, say Y here.
 
-endmenu
+endif # MISC_DEVICES
index 8ee0321ef1c8f6226a62ad5a20680a8866b69773..9623eaf4f89fdf7cb479cb0ad0bc06bec915e206 100644 (file)
@@ -1917,7 +1917,8 @@ end:
  */
 static int sony_pic_disable(struct acpi_device *device)
 {
-       if (ACPI_FAILURE(acpi_evaluate_object(device->handle, "_DIS", 0, NULL)))
+       if (ACPI_FAILURE(acpi_evaluate_object(device->handle,
+                       "_DIS", NULL, NULL)))
                return -ENXIO;
 
        dprintk("Device disabled\n");
index 71e7ef2cc99c8596a2b3937a92bf54ac8e09b0a3..713ab05a87c065bc2f46f6aa2be07a6874e93267 100644 (file)
@@ -588,6 +588,12 @@ config CASSINI
          Support for the Sun Cassini chip, aka Sun GigaSwift Ethernet. See also
          <http://www.sun.com/products-n-solutions/hardware/docs/pdf/817-4341-10.pdf>
 
+config SUNVNET
+       tristate "Sun Virtual Network support"
+       depends on SUN_LDOMS
+       help
+         Support for virtual network devices under Sun Logical Domains.
+
 config NET_VENDOR_3COM
        bool "3COM cards"
        depends on ISA || EISA || MCA || PCI
index a21b98ea16ad4670256cbbb3997e563306875dc5..eb4167622a6abdacafaa9a042f2152be9aa36865 100644 (file)
@@ -34,6 +34,7 @@ obj-$(CONFIG_SUNBMAC) += sunbmac.o
 obj-$(CONFIG_MYRI_SBUS) += myri_sbus.o
 obj-$(CONFIG_SUNGEM) += sungem.o sungem_phy.o
 obj-$(CONFIG_CASSINI) += cassini.o
+obj-$(CONFIG_SUNVNET) += sunvnet.o
 
 obj-$(CONFIG_MACE) += mace.o
 obj-$(CONFIG_BMAC) += bmac.o
diff --git a/drivers/net/sunvnet.c b/drivers/net/sunvnet.c
new file mode 100644 (file)
index 0000000..8a667c1
--- /dev/null
@@ -0,0 +1,1164 @@
+/* sunvnet.c: Sun LDOM Virtual Network Driver.
+ *
+ * Copyright (C) 2007 David S. Miller <davem@davemloft.net>
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/slab.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/netdevice.h>
+#include <linux/ethtool.h>
+#include <linux/etherdevice.h>
+
+#include <asm/vio.h>
+#include <asm/ldc.h>
+
+#include "sunvnet.h"
+
+#define DRV_MODULE_NAME                "sunvnet"
+#define PFX DRV_MODULE_NAME    ": "
+#define DRV_MODULE_VERSION     "1.0"
+#define DRV_MODULE_RELDATE     "June 25, 2007"
+
+static char version[] __devinitdata =
+       DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
+MODULE_AUTHOR("David S. Miller (davem@davemloft.net)");
+MODULE_DESCRIPTION("Sun LDOM virtual network driver");
+MODULE_LICENSE("GPL");
+MODULE_VERSION(DRV_MODULE_VERSION);
+
+/* Ordered from largest major to lowest */
+static struct vio_version vnet_versions[] = {
+       { .major = 1, .minor = 0 },
+};
+
+static inline u32 vnet_tx_dring_avail(struct vio_dring_state *dr)
+{
+       return vio_dring_avail(dr, VNET_TX_RING_SIZE);
+}
+
+static int vnet_handle_unknown(struct vnet_port *port, void *arg)
+{
+       struct vio_msg_tag *pkt = arg;
+
+       printk(KERN_ERR PFX "Received unknown msg [%02x:%02x:%04x:%08x]\n",
+              pkt->type, pkt->stype, pkt->stype_env, pkt->sid);
+       printk(KERN_ERR PFX "Resetting connection.\n");
+
+       ldc_disconnect(port->vio.lp);
+
+       return -ECONNRESET;
+}
+
+static int vnet_send_attr(struct vio_driver_state *vio)
+{
+       struct vnet_port *port = to_vnet_port(vio);
+       struct net_device *dev = port->vp->dev;
+       struct vio_net_attr_info pkt;
+       int i;
+
+       memset(&pkt, 0, sizeof(pkt));
+       pkt.tag.type = VIO_TYPE_CTRL;
+       pkt.tag.stype = VIO_SUBTYPE_INFO;
+       pkt.tag.stype_env = VIO_ATTR_INFO;
+       pkt.tag.sid = vio_send_sid(vio);
+       pkt.xfer_mode = VIO_DRING_MODE;
+       pkt.addr_type = VNET_ADDR_ETHERMAC;
+       pkt.ack_freq = 0;
+       for (i = 0; i < 6; i++)
+               pkt.addr |= (u64)dev->dev_addr[i] << ((5 - i) * 8);
+       pkt.mtu = ETH_FRAME_LEN;
+
+       viodbg(HS, "SEND NET ATTR xmode[0x%x] atype[0x%x] addr[%llx] "
+              "ackfreq[%u] mtu[%llu]\n",
+              pkt.xfer_mode, pkt.addr_type,
+              (unsigned long long) pkt.addr,
+              pkt.ack_freq,
+              (unsigned long long) pkt.mtu);
+
+       return vio_ldc_send(vio, &pkt, sizeof(pkt));
+}
+
+static int handle_attr_info(struct vio_driver_state *vio,
+                           struct vio_net_attr_info *pkt)
+{
+       viodbg(HS, "GOT NET ATTR INFO xmode[0x%x] atype[0x%x] addr[%llx] "
+              "ackfreq[%u] mtu[%llu]\n",
+              pkt->xfer_mode, pkt->addr_type,
+              (unsigned long long) pkt->addr,
+              pkt->ack_freq,
+              (unsigned long long) pkt->mtu);
+
+       pkt->tag.sid = vio_send_sid(vio);
+
+       if (pkt->xfer_mode != VIO_DRING_MODE ||
+           pkt->addr_type != VNET_ADDR_ETHERMAC ||
+           pkt->mtu != ETH_FRAME_LEN) {
+               viodbg(HS, "SEND NET ATTR NACK\n");
+
+               pkt->tag.stype = VIO_SUBTYPE_NACK;
+
+               (void) vio_ldc_send(vio, pkt, sizeof(*pkt));
+
+               return -ECONNRESET;
+       } else {
+               viodbg(HS, "SEND NET ATTR ACK\n");
+
+               pkt->tag.stype = VIO_SUBTYPE_ACK;
+
+               return vio_ldc_send(vio, pkt, sizeof(*pkt));
+       }
+
+}
+
+static int handle_attr_ack(struct vio_driver_state *vio,
+                          struct vio_net_attr_info *pkt)
+{
+       viodbg(HS, "GOT NET ATTR ACK\n");
+
+       return 0;
+}
+
+static int handle_attr_nack(struct vio_driver_state *vio,
+                           struct vio_net_attr_info *pkt)
+{
+       viodbg(HS, "GOT NET ATTR NACK\n");
+
+       return -ECONNRESET;
+}
+
+static int vnet_handle_attr(struct vio_driver_state *vio, void *arg)
+{
+       struct vio_net_attr_info *pkt = arg;
+
+       switch (pkt->tag.stype) {
+       case VIO_SUBTYPE_INFO:
+               return handle_attr_info(vio, pkt);
+
+       case VIO_SUBTYPE_ACK:
+               return handle_attr_ack(vio, pkt);
+
+       case VIO_SUBTYPE_NACK:
+               return handle_attr_nack(vio, pkt);
+
+       default:
+               return -ECONNRESET;
+       }
+}
+
+static void vnet_handshake_complete(struct vio_driver_state *vio)
+{
+       struct vio_dring_state *dr;
+
+       dr = &vio->drings[VIO_DRIVER_RX_RING];
+       dr->snd_nxt = dr->rcv_nxt = 1;
+
+       dr = &vio->drings[VIO_DRIVER_TX_RING];
+       dr->snd_nxt = dr->rcv_nxt = 1;
+}
+
+/* The hypervisor interface that implements copying to/from imported
+ * memory from another domain requires that copies are done to 8-byte
+ * aligned buffers, and that the lengths of such copies are also 8-byte
+ * multiples.
+ *
+ * So we align skb->data to an 8-byte multiple and pad-out the data
+ * area so we can round the copy length up to the next multiple of
+ * 8 for the copy.
+ *
+ * The transmitter puts the actual start of the packet 6 bytes into
+ * the buffer it sends over, so that the IP headers after the ethernet
+ * header are aligned properly.  These 6 bytes are not in the descriptor
+ * length, they are simply implied.  This offset is represented using
+ * the VNET_PACKET_SKIP macro.
+ */
+static struct sk_buff *alloc_and_align_skb(struct net_device *dev,
+                                          unsigned int len)
+{
+       struct sk_buff *skb = netdev_alloc_skb(dev, len+VNET_PACKET_SKIP+8+8);
+       unsigned long addr, off;
+
+       if (unlikely(!skb))
+               return NULL;
+
+       addr = (unsigned long) skb->data;
+       off = ((addr + 7UL) & ~7UL) - addr;
+       if (off)
+               skb_reserve(skb, off);
+
+       return skb;
+}
+
+static int vnet_rx_one(struct vnet_port *port, unsigned int len,
+                      struct ldc_trans_cookie *cookies, int ncookies)
+{
+       struct net_device *dev = port->vp->dev;
+       unsigned int copy_len;
+       struct sk_buff *skb;
+       int err;
+
+       err = -EMSGSIZE;
+       if (unlikely(len < ETH_ZLEN || len > ETH_FRAME_LEN)) {
+               dev->stats.rx_length_errors++;
+               goto out_dropped;
+       }
+
+       skb = alloc_and_align_skb(dev, len);
+       err = -ENOMEM;
+       if (unlikely(!skb)) {
+               dev->stats.rx_missed_errors++;
+               goto out_dropped;
+       }
+
+       copy_len = (len + VNET_PACKET_SKIP + 7U) & ~7U;
+       skb_put(skb, copy_len);
+       err = ldc_copy(port->vio.lp, LDC_COPY_IN,
+                      skb->data, copy_len, 0,
+                      cookies, ncookies);
+       if (unlikely(err < 0)) {
+               dev->stats.rx_frame_errors++;
+               goto out_free_skb;
+       }
+
+       skb_pull(skb, VNET_PACKET_SKIP);
+       skb_trim(skb, len);
+       skb->protocol = eth_type_trans(skb, dev);
+
+       dev->stats.rx_packets++;
+       dev->stats.rx_bytes += len;
+
+       netif_rx(skb);
+
+       return 0;
+
+out_free_skb:
+       kfree_skb(skb);
+
+out_dropped:
+       dev->stats.rx_dropped++;
+       return err;
+}
+
+static int vnet_send_ack(struct vnet_port *port, struct vio_dring_state *dr,
+                        u32 start, u32 end, u8 vio_dring_state)
+{
+       struct vio_dring_data hdr = {
+               .tag = {
+                       .type           = VIO_TYPE_DATA,
+                       .stype          = VIO_SUBTYPE_ACK,
+                       .stype_env      = VIO_DRING_DATA,
+                       .sid            = vio_send_sid(&port->vio),
+               },
+               .dring_ident            = dr->ident,
+               .start_idx              = start,
+               .end_idx                = end,
+               .state                  = vio_dring_state,
+       };
+       int err, delay;
+
+       hdr.seq = dr->snd_nxt;
+       delay = 1;
+       do {
+               err = vio_ldc_send(&port->vio, &hdr, sizeof(hdr));
+               if (err > 0) {
+                       dr->snd_nxt++;
+                       break;
+               }
+               udelay(delay);
+               if ((delay <<= 1) > 128)
+                       delay = 128;
+       } while (err == -EAGAIN);
+
+       return err;
+}
+
+static u32 next_idx(u32 idx, struct vio_dring_state *dr)
+{
+       if (++idx == dr->num_entries)
+               idx = 0;
+       return idx;
+}
+
+static u32 prev_idx(u32 idx, struct vio_dring_state *dr)
+{
+       if (idx == 0)
+               idx = dr->num_entries - 1;
+       else
+               idx--;
+
+       return idx;
+}
+
+static struct vio_net_desc *get_rx_desc(struct vnet_port *port,
+                                       struct vio_dring_state *dr,
+                                       u32 index)
+{
+       struct vio_net_desc *desc = port->vio.desc_buf;
+       int err;
+
+       err = ldc_get_dring_entry(port->vio.lp, desc, dr->entry_size,
+                                 (index * dr->entry_size),
+                                 dr->cookies, dr->ncookies);
+       if (err < 0)
+               return ERR_PTR(err);
+
+       return desc;
+}
+
+static int put_rx_desc(struct vnet_port *port,
+                      struct vio_dring_state *dr,
+                      struct vio_net_desc *desc,
+                      u32 index)
+{
+       int err;
+
+       err = ldc_put_dring_entry(port->vio.lp, desc, dr->entry_size,
+                                 (index * dr->entry_size),
+                                 dr->cookies, dr->ncookies);
+       if (err < 0)
+               return err;
+
+       return 0;
+}
+
+static int vnet_walk_rx_one(struct vnet_port *port,
+                           struct vio_dring_state *dr,
+                           u32 index, int *needs_ack)
+{
+       struct vio_net_desc *desc = get_rx_desc(port, dr, index);
+       struct vio_driver_state *vio = &port->vio;
+       int err;
+
+       if (IS_ERR(desc))
+               return PTR_ERR(desc);
+
+       viodbg(DATA, "vio_walk_rx_one desc[%02x:%02x:%08x:%08x:%lx:%lx]\n",
+              desc->hdr.state, desc->hdr.ack,
+              desc->size, desc->ncookies,
+              desc->cookies[0].cookie_addr,
+              desc->cookies[0].cookie_size);
+
+       if (desc->hdr.state != VIO_DESC_READY)
+               return 1;
+       err = vnet_rx_one(port, desc->size, desc->cookies, desc->ncookies);
+       if (err == -ECONNRESET)
+               return err;
+       desc->hdr.state = VIO_DESC_DONE;
+       err = put_rx_desc(port, dr, desc, index);
+       if (err < 0)
+               return err;
+       *needs_ack = desc->hdr.ack;
+       return 0;
+}
+
+static int vnet_walk_rx(struct vnet_port *port, struct vio_dring_state *dr,
+                       u32 start, u32 end)
+{
+       struct vio_driver_state *vio = &port->vio;
+       int ack_start = -1, ack_end = -1;
+
+       end = (end == (u32) -1) ? prev_idx(start, dr) : next_idx(end, dr);
+
+       viodbg(DATA, "vnet_walk_rx start[%08x] end[%08x]\n", start, end);
+
+       while (start != end) {
+               int ack = 0, err = vnet_walk_rx_one(port, dr, start, &ack);
+               if (err == -ECONNRESET)
+                       return err;
+               if (err != 0)
+                       break;
+               if (ack_start == -1)
+                       ack_start = start;
+               ack_end = start;
+               start = next_idx(start, dr);
+               if (ack && start != end) {
+                       err = vnet_send_ack(port, dr, ack_start, ack_end,
+                                           VIO_DRING_ACTIVE);
+                       if (err == -ECONNRESET)
+                               return err;
+                       ack_start = -1;
+               }
+       }
+       if (unlikely(ack_start == -1))
+               ack_start = ack_end = prev_idx(start, dr);
+       return vnet_send_ack(port, dr, ack_start, ack_end, VIO_DRING_STOPPED);
+}
+
+static int vnet_rx(struct vnet_port *port, void *msgbuf)
+{
+       struct vio_dring_data *pkt = msgbuf;
+       struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_RX_RING];
+       struct vio_driver_state *vio = &port->vio;
+
+       viodbg(DATA, "vnet_rx stype_env[%04x] seq[%016lx] rcv_nxt[%016lx]\n",
+              pkt->tag.stype_env, pkt->seq, dr->rcv_nxt);
+
+       if (unlikely(pkt->tag.stype_env != VIO_DRING_DATA))
+               return 0;
+       if (unlikely(pkt->seq != dr->rcv_nxt)) {
+               printk(KERN_ERR PFX "RX out of sequence seq[0x%lx] "
+                      "rcv_nxt[0x%lx]\n", pkt->seq, dr->rcv_nxt);
+               return 0;
+       }
+
+       dr->rcv_nxt++;
+
+       /* XXX Validate pkt->start_idx and pkt->end_idx XXX */
+
+       return vnet_walk_rx(port, dr, pkt->start_idx, pkt->end_idx);
+}
+
+static int idx_is_pending(struct vio_dring_state *dr, u32 end)
+{
+       u32 idx = dr->cons;
+       int found = 0;
+
+       while (idx != dr->prod) {
+               if (idx == end) {
+                       found = 1;
+                       break;
+               }
+               idx = next_idx(idx, dr);
+       }
+       return found;
+}
+
+static int vnet_ack(struct vnet_port *port, void *msgbuf)
+{
+       struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING];
+       struct vio_dring_data *pkt = msgbuf;
+       struct net_device *dev;
+       struct vnet *vp;
+       u32 end;
+
+       if (unlikely(pkt->tag.stype_env != VIO_DRING_DATA))
+               return 0;
+
+       end = pkt->end_idx;
+       if (unlikely(!idx_is_pending(dr, end)))
+               return 0;
+
+       dr->cons = next_idx(end, dr);
+
+       vp = port->vp;
+       dev = vp->dev;
+       if (unlikely(netif_queue_stopped(dev) &&
+                    vnet_tx_dring_avail(dr) >= VNET_TX_WAKEUP_THRESH(dr)))
+               return 1;
+
+       return 0;
+}
+
+static int vnet_nack(struct vnet_port *port, void *msgbuf)
+{
+       /* XXX just reset or similar XXX */
+       return 0;
+}
+
+static void maybe_tx_wakeup(struct vnet *vp)
+{
+       struct net_device *dev = vp->dev;
+
+       netif_tx_lock(dev);
+       if (likely(netif_queue_stopped(dev))) {
+               struct vnet_port *port;
+               int wake = 1;
+
+               list_for_each_entry(port, &vp->port_list, list) {
+                       struct vio_dring_state *dr;
+
+                       dr = &port->vio.drings[VIO_DRIVER_TX_RING];
+                       if (vnet_tx_dring_avail(dr) <
+                           VNET_TX_WAKEUP_THRESH(dr)) {
+                               wake = 0;
+                               break;
+                       }
+               }
+               if (wake)
+                       netif_wake_queue(dev);
+       }
+       netif_tx_unlock(dev);
+}
+
+static void vnet_event(void *arg, int event)
+{
+       struct vnet_port *port = arg;
+       struct vio_driver_state *vio = &port->vio;
+       unsigned long flags;
+       int tx_wakeup, err;
+
+       spin_lock_irqsave(&vio->lock, flags);
+
+       if (unlikely(event == LDC_EVENT_RESET ||
+                    event == LDC_EVENT_UP)) {
+               vio_link_state_change(vio, event);
+               spin_unlock_irqrestore(&vio->lock, flags);
+
+               return;
+       }
+
+       if (unlikely(event != LDC_EVENT_DATA_READY)) {
+               printk(KERN_WARNING PFX "Unexpected LDC event %d\n", event);
+               spin_unlock_irqrestore(&vio->lock, flags);
+               return;
+       }
+
+       tx_wakeup = err = 0;
+       while (1) {
+               union {
+                       struct vio_msg_tag tag;
+                       u64 raw[8];
+               } msgbuf;
+
+               err = ldc_read(vio->lp, &msgbuf, sizeof(msgbuf));
+               if (unlikely(err < 0)) {
+                       if (err == -ECONNRESET)
+                               vio_conn_reset(vio);
+                       break;
+               }
+               if (err == 0)
+                       break;
+               viodbg(DATA, "TAG [%02x:%02x:%04x:%08x]\n",
+                      msgbuf.tag.type,
+                      msgbuf.tag.stype,
+                      msgbuf.tag.stype_env,
+                      msgbuf.tag.sid);
+               err = vio_validate_sid(vio, &msgbuf.tag);
+               if (err < 0)
+                       break;
+
+               if (likely(msgbuf.tag.type == VIO_TYPE_DATA)) {
+                       if (msgbuf.tag.stype == VIO_SUBTYPE_INFO) {
+                               err = vnet_rx(port, &msgbuf);
+                       } else if (msgbuf.tag.stype == VIO_SUBTYPE_ACK) {
+                               err = vnet_ack(port, &msgbuf);
+                               if (err > 0)
+                                       tx_wakeup |= err;
+                       } else if (msgbuf.tag.stype == VIO_SUBTYPE_NACK) {
+                               err = vnet_nack(port, &msgbuf);
+                       }
+               } else if (msgbuf.tag.type == VIO_TYPE_CTRL) {
+                       err = vio_control_pkt_engine(vio, &msgbuf);
+                       if (err)
+                               break;
+               } else {
+                       err = vnet_handle_unknown(port, &msgbuf);
+               }
+               if (err == -ECONNRESET)
+                       break;
+       }
+       spin_unlock(&vio->lock);
+       if (unlikely(tx_wakeup && err != -ECONNRESET))
+               maybe_tx_wakeup(port->vp);
+       local_irq_restore(flags);
+}
+
+static int __vnet_tx_trigger(struct vnet_port *port)
+{
+       struct vio_dring_state *dr = &port->vio.drings[VIO_DRIVER_TX_RING];
+       struct vio_dring_data hdr = {
+               .tag = {
+                       .type           = VIO_TYPE_DATA,
+                       .stype          = VIO_SUBTYPE_INFO,
+                       .stype_env      = VIO_DRING_DATA,
+                       .sid            = vio_send_sid(&port->vio),
+               },
+               .dring_ident            = dr->ident,
+               .start_idx              = dr->prod,
+               .end_idx                = (u32) -1,
+       };
+       int err, delay;
+
+       hdr.seq = dr->snd_nxt;
+       delay = 1;
+       do {
+               err = vio_ldc_send(&port->vio, &hdr, sizeof(hdr));
+               if (err > 0) {
+                       dr->snd_nxt++;
+                       break;
+               }
+               udelay(delay);
+               if ((delay <<= 1) > 128)
+                       delay = 128;
+       } while (err == -EAGAIN);
+
+       return err;
+}
+
+struct vnet_port *__tx_port_find(struct vnet *vp, struct sk_buff *skb)
+{
+       unsigned int hash = vnet_hashfn(skb->data);
+       struct hlist_head *hp = &vp->port_hash[hash];
+       struct hlist_node *n;
+       struct vnet_port *port;
+
+       hlist_for_each_entry(port, n, hp, hash) {
+               if (!compare_ether_addr(port->raddr, skb->data))
+                       return port;
+       }
+       port = NULL;
+       if (!list_empty(&vp->port_list))
+               port = list_entry(vp->port_list.next, struct vnet_port, list);
+
+       return port;
+}
+
+struct vnet_port *tx_port_find(struct vnet *vp, struct sk_buff *skb)
+{
+       struct vnet_port *ret;
+       unsigned long flags;
+
+       spin_lock_irqsave(&vp->lock, flags);
+       ret = __tx_port_find(vp, skb);
+       spin_unlock_irqrestore(&vp->lock, flags);
+
+       return ret;
+}
+
+static int vnet_start_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+       struct vnet *vp = netdev_priv(dev);
+       struct vnet_port *port = tx_port_find(vp, skb);
+       struct vio_dring_state *dr;
+       struct vio_net_desc *d;
+       unsigned long flags;
+       unsigned int len;
+       void *tx_buf;
+       int i, err;
+
+       if (unlikely(!port))
+               goto out_dropped;
+
+       spin_lock_irqsave(&port->vio.lock, flags);
+
+       dr = &port->vio.drings[VIO_DRIVER_TX_RING];
+       if (unlikely(vnet_tx_dring_avail(dr) < 2)) {
+               if (!netif_queue_stopped(dev)) {
+                       netif_stop_queue(dev);
+
+                       /* This is a hard error, log it. */
+                       printk(KERN_ERR PFX "%s: BUG! Tx Ring full when "
+                              "queue awake!\n", dev->name);
+                       dev->stats.tx_errors++;
+               }
+               spin_unlock_irqrestore(&port->vio.lock, flags);
+               return NETDEV_TX_BUSY;
+       }
+
+       d = vio_dring_cur(dr);
+
+       tx_buf = port->tx_bufs[dr->prod].buf;
+       skb_copy_from_linear_data(skb, tx_buf + VNET_PACKET_SKIP, skb->len);
+
+       len = skb->len;
+       if (len < ETH_ZLEN) {
+               len = ETH_ZLEN;
+               memset(tx_buf+VNET_PACKET_SKIP+skb->len, 0, len - skb->len);
+       }
+
+       d->hdr.ack = VIO_ACK_ENABLE;
+       d->size = len;
+       d->ncookies = port->tx_bufs[dr->prod].ncookies;
+       for (i = 0; i < d->ncookies; i++)
+               d->cookies[i] = port->tx_bufs[dr->prod].cookies[i];
+
+       /* This has to be a non-SMP write barrier because we are writing
+        * to memory which is shared with the peer LDOM.
+        */
+       wmb();
+
+       d->hdr.state = VIO_DESC_READY;
+
+       err = __vnet_tx_trigger(port);
+       if (unlikely(err < 0)) {
+               printk(KERN_INFO PFX "%s: TX trigger error %d\n",
+                      dev->name, err);
+               d->hdr.state = VIO_DESC_FREE;
+               dev->stats.tx_carrier_errors++;
+               goto out_dropped_unlock;
+       }
+
+       dev->stats.tx_packets++;
+       dev->stats.tx_bytes += skb->len;
+
+       dr->prod = (dr->prod + 1) & (VNET_TX_RING_SIZE - 1);
+       if (unlikely(vnet_tx_dring_avail(dr) < 2)) {
+               netif_stop_queue(dev);
+               if (vnet_tx_dring_avail(dr) > VNET_TX_WAKEUP_THRESH(dr))
+                       netif_wake_queue(dev);
+       }
+
+       spin_unlock_irqrestore(&port->vio.lock, flags);
+
+       dev_kfree_skb(skb);
+
+       dev->trans_start = jiffies;
+       return NETDEV_TX_OK;
+
+out_dropped_unlock:
+       spin_unlock_irqrestore(&port->vio.lock, flags);
+
+out_dropped:
+       dev_kfree_skb(skb);
+       dev->stats.tx_dropped++;
+       return NETDEV_TX_OK;
+}
+
+static void vnet_tx_timeout(struct net_device *dev)
+{
+       /* XXX Implement me XXX */
+}
+
+static int vnet_open(struct net_device *dev)
+{
+       netif_carrier_on(dev);
+       netif_start_queue(dev);
+
+       return 0;
+}
+
+static int vnet_close(struct net_device *dev)
+{
+       netif_stop_queue(dev);
+       netif_carrier_off(dev);
+
+       return 0;
+}
+
+static void vnet_set_rx_mode(struct net_device *dev)
+{
+       /* XXX Implement multicast support XXX */
+}
+
+static int vnet_change_mtu(struct net_device *dev, int new_mtu)
+{
+       if (new_mtu != ETH_DATA_LEN)
+               return -EINVAL;
+
+       dev->mtu = new_mtu;
+       return 0;
+}
+
+static int vnet_set_mac_addr(struct net_device *dev, void *p)
+{
+       return -EINVAL;
+}
+
+static void vnet_get_drvinfo(struct net_device *dev,
+                            struct ethtool_drvinfo *info)
+{
+       strcpy(info->driver, DRV_MODULE_NAME);
+       strcpy(info->version, DRV_MODULE_VERSION);
+}
+
+static u32 vnet_get_msglevel(struct net_device *dev)
+{
+       struct vnet *vp = netdev_priv(dev);
+       return vp->msg_enable;
+}
+
+static void vnet_set_msglevel(struct net_device *dev, u32 value)
+{
+       struct vnet *vp = netdev_priv(dev);
+       vp->msg_enable = value;
+}
+
+static const struct ethtool_ops vnet_ethtool_ops = {
+       .get_drvinfo            = vnet_get_drvinfo,
+       .get_msglevel           = vnet_get_msglevel,
+       .set_msglevel           = vnet_set_msglevel,
+       .get_link               = ethtool_op_get_link,
+       .get_perm_addr          = ethtool_op_get_perm_addr,
+};
+
+static void vnet_port_free_tx_bufs(struct vnet_port *port)
+{
+       struct vio_dring_state *dr;
+       int i;
+
+       dr = &port->vio.drings[VIO_DRIVER_TX_RING];
+       if (dr->base) {
+               ldc_free_exp_dring(port->vio.lp, dr->base,
+                                  (dr->entry_size * dr->num_entries),
+                                  dr->cookies, dr->ncookies);
+               dr->base = NULL;
+               dr->entry_size = 0;
+               dr->num_entries = 0;
+               dr->pending = 0;
+               dr->ncookies = 0;
+       }
+
+       for (i = 0; i < VNET_TX_RING_SIZE; i++) {
+               void *buf = port->tx_bufs[i].buf;
+
+               if (!buf)
+                       continue;
+
+               ldc_unmap(port->vio.lp,
+                         port->tx_bufs[i].cookies,
+                         port->tx_bufs[i].ncookies);
+
+               kfree(buf);
+               port->tx_bufs[i].buf = NULL;
+       }
+}
+
+static int __devinit vnet_port_alloc_tx_bufs(struct vnet_port *port)
+{
+       struct vio_dring_state *dr;
+       unsigned long len;
+       int i, err, ncookies;
+       void *dring;
+
+       for (i = 0; i < VNET_TX_RING_SIZE; i++) {
+               void *buf = kzalloc(ETH_FRAME_LEN + 8, GFP_KERNEL);
+               int map_len = (ETH_FRAME_LEN + 7) & ~7;
+
+               err = -ENOMEM;
+               if (!buf) {
+                       printk(KERN_ERR "TX buffer allocation failure\n");
+                       goto err_out;
+               }
+               err = -EFAULT;
+               if ((unsigned long)buf & (8UL - 1)) {
+                       printk(KERN_ERR "TX buffer misaligned\n");
+                       kfree(buf);
+                       goto err_out;
+               }
+
+               err = ldc_map_single(port->vio.lp, buf, map_len,
+                                    port->tx_bufs[i].cookies, 2,
+                                    (LDC_MAP_SHADOW |
+                                     LDC_MAP_DIRECT |
+                                     LDC_MAP_RW));
+               if (err < 0) {
+                       kfree(buf);
+                       goto err_out;
+               }
+               port->tx_bufs[i].buf = buf;
+               port->tx_bufs[i].ncookies = err;
+       }
+
+       dr = &port->vio.drings[VIO_DRIVER_TX_RING];
+
+       len = (VNET_TX_RING_SIZE *
+              (sizeof(struct vio_net_desc) +
+               (sizeof(struct ldc_trans_cookie) * 2)));
+
+       ncookies = VIO_MAX_RING_COOKIES;
+       dring = ldc_alloc_exp_dring(port->vio.lp, len,
+                                   dr->cookies, &ncookies,
+                                   (LDC_MAP_SHADOW |
+                                    LDC_MAP_DIRECT |
+                                    LDC_MAP_RW));
+       if (IS_ERR(dring)) {
+               err = PTR_ERR(dring);
+               goto err_out;
+       }
+
+       dr->base = dring;
+       dr->entry_size = (sizeof(struct vio_net_desc) +
+                         (sizeof(struct ldc_trans_cookie) * 2));
+       dr->num_entries = VNET_TX_RING_SIZE;
+       dr->prod = dr->cons = 0;
+       dr->pending = VNET_TX_RING_SIZE;
+       dr->ncookies = ncookies;
+
+       return 0;
+
+err_out:
+       vnet_port_free_tx_bufs(port);
+
+       return err;
+}
+
+static struct ldc_channel_config vnet_ldc_cfg = {
+       .event          = vnet_event,
+       .mtu            = 64,
+       .mode           = LDC_MODE_UNRELIABLE,
+};
+
+static struct vio_driver_ops vnet_vio_ops = {
+       .send_attr              = vnet_send_attr,
+       .handle_attr            = vnet_handle_attr,
+       .handshake_complete     = vnet_handshake_complete,
+};
+
+const char *remote_macaddr_prop = "remote-mac-address";
+
+static int __devinit vnet_port_probe(struct vio_dev *vdev,
+                                    const struct vio_device_id *id)
+{
+       struct mdesc_handle *hp;
+       struct vnet_port *port;
+       unsigned long flags;
+       struct vnet *vp;
+       const u64 *rmac;
+       int len, i, err, switch_port;
+
+       vp = dev_get_drvdata(vdev->dev.parent);
+       if (!vp) {
+               printk(KERN_ERR PFX "Cannot find port parent vnet.\n");
+               return -ENODEV;
+       }
+
+       hp = mdesc_grab();
+
+       rmac = mdesc_get_property(hp, vdev->mp, remote_macaddr_prop, &len);
+       err = -ENODEV;
+       if (!rmac) {
+               printk(KERN_ERR PFX "Port lacks %s property.\n",
+                      remote_macaddr_prop);
+               goto err_out_put_mdesc;
+       }
+
+       port = kzalloc(sizeof(*port), GFP_KERNEL);
+       err = -ENOMEM;
+       if (!port) {
+               printk(KERN_ERR PFX "Cannot allocate vnet_port.\n");
+               goto err_out_put_mdesc;
+       }
+
+       for (i = 0; i < ETH_ALEN; i++)
+               port->raddr[i] = (*rmac >> (5 - i) * 8) & 0xff;
+
+       port->vp = vp;
+
+       err = vio_driver_init(&port->vio, vdev, VDEV_NETWORK,
+                             vnet_versions, ARRAY_SIZE(vnet_versions),
+                             &vnet_vio_ops, vp->dev->name);
+       if (err)
+               goto err_out_free_port;
+
+       err = vio_ldc_alloc(&port->vio, &vnet_ldc_cfg, port);
+       if (err)
+               goto err_out_free_port;
+
+       err = vnet_port_alloc_tx_bufs(port);
+       if (err)
+               goto err_out_free_ldc;
+
+       INIT_HLIST_NODE(&port->hash);
+       INIT_LIST_HEAD(&port->list);
+
+       switch_port = 0;
+       if (mdesc_get_property(hp, vdev->mp, "switch-port", NULL) != NULL)
+               switch_port = 1;
+
+       spin_lock_irqsave(&vp->lock, flags);
+       if (switch_port)
+               list_add(&port->list, &vp->port_list);
+       else
+               list_add_tail(&port->list, &vp->port_list);
+       hlist_add_head(&port->hash, &vp->port_hash[vnet_hashfn(port->raddr)]);
+       spin_unlock_irqrestore(&vp->lock, flags);
+
+       dev_set_drvdata(&vdev->dev, port);
+
+       printk(KERN_INFO "%s: PORT ( remote-mac ", vp->dev->name);
+       for (i = 0; i < 6; i++)
+               printk("%2.2x%c", port->raddr[i], i == 5 ? ' ' : ':');
+       if (switch_port)
+               printk("switch-port ");
+       printk(")\n");
+
+       vio_port_up(&port->vio);
+
+       mdesc_release(hp);
+
+       return 0;
+
+err_out_free_ldc:
+       vio_ldc_free(&port->vio);
+
+err_out_free_port:
+       kfree(port);
+
+err_out_put_mdesc:
+       mdesc_release(hp);
+       return err;
+}
+
+static int vnet_port_remove(struct vio_dev *vdev)
+{
+       struct vnet_port *port = dev_get_drvdata(&vdev->dev);
+
+       if (port) {
+               struct vnet *vp = port->vp;
+               unsigned long flags;
+
+               del_timer_sync(&port->vio.timer);
+
+               spin_lock_irqsave(&vp->lock, flags);
+               list_del(&port->list);
+               hlist_del(&port->hash);
+               spin_unlock_irqrestore(&vp->lock, flags);
+
+               vnet_port_free_tx_bufs(port);
+               vio_ldc_free(&port->vio);
+
+               dev_set_drvdata(&vdev->dev, NULL);
+
+               kfree(port);
+       }
+       return 0;
+}
+
+static struct vio_device_id vnet_port_match[] = {
+       {
+               .type = "vnet-port",
+       },
+       {},
+};
+MODULE_DEVICE_TABLE(vio, vnet_match);
+
+static struct vio_driver vnet_port_driver = {
+       .id_table       = vnet_port_match,
+       .probe          = vnet_port_probe,
+       .remove         = vnet_port_remove,
+       .driver         = {
+               .name   = "vnet_port",
+               .owner  = THIS_MODULE,
+       }
+};
+
+const char *local_mac_prop = "local-mac-address";
+
+static int __devinit vnet_probe(struct vio_dev *vdev,
+                               const struct vio_device_id *id)
+{
+       static int vnet_version_printed;
+       struct mdesc_handle *hp;
+       struct net_device *dev;
+       struct vnet *vp;
+       const u64 *mac;
+       int err, i, len;
+
+       if (vnet_version_printed++ == 0)
+               printk(KERN_INFO "%s", version);
+
+       hp = mdesc_grab();
+
+       mac = mdesc_get_property(hp, vdev->mp, local_mac_prop, &len);
+       if (!mac) {
+               printk(KERN_ERR PFX "vnet lacks %s property.\n",
+                      local_mac_prop);
+               err = -ENODEV;
+               goto err_out;
+       }
+
+       dev = alloc_etherdev(sizeof(*vp));
+       if (!dev) {
+               printk(KERN_ERR PFX "Etherdev alloc failed, aborting.\n");
+               err = -ENOMEM;
+               goto err_out;
+       }
+
+       for (i = 0; i < ETH_ALEN; i++)
+               dev->dev_addr[i] = (*mac >> (5 - i) * 8) & 0xff;
+
+       memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
+
+       SET_NETDEV_DEV(dev, &vdev->dev);
+
+       vp = netdev_priv(dev);
+
+       spin_lock_init(&vp->lock);
+       vp->dev = dev;
+       vp->vdev = vdev;
+
+       INIT_LIST_HEAD(&vp->port_list);
+       for (i = 0; i < VNET_PORT_HASH_SIZE; i++)
+               INIT_HLIST_HEAD(&vp->port_hash[i]);
+
+       dev->open = vnet_open;
+       dev->stop = vnet_close;
+       dev->set_multicast_list = vnet_set_rx_mode;
+       dev->set_mac_address = vnet_set_mac_addr;
+       dev->tx_timeout = vnet_tx_timeout;
+       dev->ethtool_ops = &vnet_ethtool_ops;
+       dev->watchdog_timeo = VNET_TX_TIMEOUT;
+       dev->change_mtu = vnet_change_mtu;
+       dev->hard_start_xmit = vnet_start_xmit;
+
+       err = register_netdev(dev);
+       if (err) {
+               printk(KERN_ERR PFX "Cannot register net device, "
+                      "aborting.\n");
+               goto err_out_free_dev;
+       }
+
+       printk(KERN_INFO "%s: Sun LDOM vnet ", dev->name);
+
+       for (i = 0; i < 6; i++)
+               printk("%2.2x%c", dev->dev_addr[i], i == 5 ? '\n' : ':');
+
+       dev_set_drvdata(&vdev->dev, vp);
+
+       mdesc_release(hp);
+
+       return 0;
+
+err_out_free_dev:
+       free_netdev(dev);
+
+err_out:
+       mdesc_release(hp);
+       return err;
+}
+
+static int vnet_remove(struct vio_dev *vdev)
+{
+
+       struct vnet *vp = dev_get_drvdata(&vdev->dev);
+
+       if (vp) {
+               /* XXX unregister port, or at least check XXX */
+               unregister_netdevice(vp->dev);
+               dev_set_drvdata(&vdev->dev, NULL);
+       }
+       return 0;
+}
+
+static struct vio_device_id vnet_match[] = {
+       {
+               .type = "network",
+       },
+       {},
+};
+MODULE_DEVICE_TABLE(vio, vnet_match);
+
+static struct vio_driver vnet_driver = {
+       .id_table       = vnet_match,
+       .probe          = vnet_probe,
+       .remove         = vnet_remove,
+       .driver         = {
+               .name   = "vnet",
+               .owner  = THIS_MODULE,
+       }
+};
+
+static int __init vnet_init(void)
+{
+       int err = vio_register_driver(&vnet_driver);
+
+       if (!err) {
+               err = vio_register_driver(&vnet_port_driver);
+               if (err)
+                       vio_unregister_driver(&vnet_driver);
+       }
+
+       return err;
+}
+
+static void __exit vnet_exit(void)
+{
+       vio_unregister_driver(&vnet_port_driver);
+       vio_unregister_driver(&vnet_driver);
+}
+
+module_init(vnet_init);
+module_exit(vnet_exit);
diff --git a/drivers/net/sunvnet.h b/drivers/net/sunvnet.h
new file mode 100644 (file)
index 0000000..1c88730
--- /dev/null
@@ -0,0 +1,70 @@
+#ifndef _SUNVNET_H
+#define _SUNVNET_H
+
+#define DESC_NCOOKIES(entry_size)      \
+       ((entry_size) - sizeof(struct vio_net_desc))
+
+/* length of time before we decide the hardware is borked,
+ * and dev->tx_timeout() should be called to fix the problem
+ */
+#define VNET_TX_TIMEOUT                        (5 * HZ)
+
+#define VNET_TX_RING_SIZE              512
+#define VNET_TX_WAKEUP_THRESH(dr)      ((dr)->pending / 4)
+
+/* VNET packets are sent in buffers with the first 6 bytes skipped
+ * so that after the ethernet header the IPv4/IPv6 headers are aligned
+ * properly.
+ */
+#define VNET_PACKET_SKIP               6
+
+struct vnet_tx_entry {
+       void                    *buf;
+       unsigned int            ncookies;
+       struct ldc_trans_cookie cookies[2];
+};
+
+struct vnet;
+struct vnet_port {
+       struct vio_driver_state vio;
+
+       struct hlist_node       hash;
+       u8                      raddr[ETH_ALEN];
+
+       struct vnet             *vp;
+
+       struct vnet_tx_entry    tx_bufs[VNET_TX_RING_SIZE];
+
+       struct list_head        list;
+};
+
+static inline struct vnet_port *to_vnet_port(struct vio_driver_state *vio)
+{
+       return container_of(vio, struct vnet_port, vio);
+}
+
+#define VNET_PORT_HASH_SIZE    16
+#define VNET_PORT_HASH_MASK    (VNET_PORT_HASH_SIZE - 1)
+
+static inline unsigned int vnet_hashfn(u8 *mac)
+{
+       unsigned int val = mac[4] ^ mac[5];
+
+       return val & (VNET_PORT_HASH_MASK);
+}
+
+struct vnet {
+       /* Protects port_list and port_hash.  */
+       spinlock_t              lock;
+
+       struct net_device       *dev;
+
+       u32                     msg_enable;
+       struct vio_dev          *vdev;
+
+       struct list_head        port_list;
+
+       struct hlist_head       port_hash[VNET_PORT_HASH_SIZE];
+};
+
+#endif /* _SUNVNET_H */
index 4fc8681bc110696305b6acc63da9ec6afdcc5e58..a3df09ee729f429a75352349b59dcaf5b006f83e 100644 (file)
@@ -61,7 +61,7 @@ config COSA
 #
 config LANMEDIA
        tristate "LanMedia Corp. SSI/V.35, T1/E1, HSSI, T3 boards"
-       depends on PCI
+       depends on PCI && VIRT_TO_BUS
        ---help---
          Driver for the following Lan Media family of serial boards:
 
index f46c69e4ed829772c190cf2fbfa6910c300613c6..09c93ff932b15453d316df1d12b7844697d9ca22 100644 (file)
@@ -5,11 +5,9 @@
 # Parport configuration.
 #
 
-menu "Parallel port support"
-       depends on HAS_IOMEM
-
-config PARPORT
+menuconfig PARPORT
        tristate "Parallel port support"
+       depends on HAS_IOMEM
        ---help---
          If you want to use devices connected to your machine's parallel port
          (the connector at the computer with 25 holes), e.g. printer, ZIP
@@ -33,9 +31,11 @@ config PARPORT
 
          If unsure, say Y.
 
+if PARPORT
+
 config PARPORT_PC
        tristate "PC-style hardware"
-       depends on PARPORT && (!SPARC64 || PCI) && !SPARC32 && !M32R && !FRV
+       depends on (!SPARC64 || PCI) && !SPARC32 && !M32R && !FRV
        ---help---
          You should say Y here if you have a PC-style parallel port. All
          IBM PC compatible computers and some Alphas have PC-style
@@ -85,7 +85,7 @@ config PARPORT_PC_PCMCIA
 
 config PARPORT_IP32
        tristate "SGI IP32 builtin port (EXPERIMENTAL)"
-       depends on SGI_IP32 && PARPORT && EXPERIMENTAL
+       depends on SGI_IP32 && EXPERIMENTAL
        select PARPORT_NOT_PC
        help
          Say Y here if you need support for the parallel port on
@@ -94,7 +94,7 @@ config PARPORT_IP32
 
 config PARPORT_AMIGA
        tristate "Amiga builtin port"
-       depends on AMIGA && PARPORT
+       depends on AMIGA
        select PARPORT_NOT_PC
        help
          Say Y here if you need support for the parallel port hardware on
@@ -103,7 +103,7 @@ config PARPORT_AMIGA
 
 config PARPORT_MFC3
        tristate "Multiface III parallel port"
-       depends on ZORRO && PARPORT
+       depends on ZORRO
        select PARPORT_NOT_PC
        help
          Say Y here if you need parallel port support for the MFC3 card.
@@ -112,7 +112,7 @@ config PARPORT_MFC3
 
 config PARPORT_ATARI
        tristate "Atari hardware"
-       depends on ATARI && PARPORT
+       depends on ATARI
        select PARPORT_NOT_PC
        help
          Say Y here if you need support for the parallel port hardware on
@@ -122,12 +122,11 @@ config PARPORT_ATARI
 config PARPORT_GSC
        tristate
        default GSC
-       depends on PARPORT
        select PARPORT_NOT_PC
 
 config PARPORT_SUNBPP
        tristate "Sparc hardware (EXPERIMENTAL)"
-       depends on SBUS && PARPORT && EXPERIMENTAL
+       depends on SBUS && EXPERIMENTAL
        select PARPORT_NOT_PC
        help
          This driver provides support for the bidirectional parallel port
@@ -136,7 +135,6 @@ config PARPORT_SUNBPP
 
 config PARPORT_AX88796
        tristate "AX88796 Parallel Port"
-       depends on PARPORT
        select PARPORT_NOT_PC
        help
          Say Y here if you need support for the parallel port hardware on
@@ -148,7 +146,6 @@ config PARPORT_AX88796
 
 config PARPORT_1284
        bool "IEEE 1284 transfer modes"
-       depends on PARPORT
        help
          If you have a printer that supports status readback or device ID, or
          want to use a device that uses enhanced parallel port transfer modes
@@ -159,5 +156,4 @@ config PARPORT_1284
 config PARPORT_NOT_PC
        bool
 
-endmenu
-
+endif # PARPORT
index 7bfbad57879d3196e44351212c2b6cad78d1e0bd..5d58ad55d85c65d4c0d379b19bacfde13e931aab 100644 (file)
@@ -2424,7 +2424,6 @@ static int __devinit sio_ite_8872_probe (struct pci_dev *pdev, int autoirq,
        u32 ite8872set;
        u32 ite8872_lpt, ite8872_lpthi;
        u8 ite8872_irq, type;
-       char *fake_name = "parport probe";
        int irq;
        int i;
 
@@ -2432,11 +2431,11 @@ static int __devinit sio_ite_8872_probe (struct pci_dev *pdev, int autoirq,
        
        // make sure which one chip
        for(i = 0; i < 5; i++) {
-               base_res = request_region(inta_addr[i], 0x8, fake_name);
+               base_res = request_region(inta_addr[i], 32, "it887x");
                if (base_res) {
                        int test;
                        pci_write_config_dword (pdev, 0x60,
-                                               0xe7000000 | inta_addr[i]);
+                                               0xe5000000 | inta_addr[i]);
                        pci_write_config_dword (pdev, 0x78,
                                                0x00000000 | inta_addr[i]);
                        test = inb (inta_addr[i]);
index 10dbdec80416dc69ce9272e37c0fbe7127d328a6..1b7b2812bf2dd94c3ca9723bd7e2db47209df89a 100644 (file)
@@ -20,7 +20,7 @@
 #include <linux/stat.h>
 #include <linux/topology.h>
 #include <linux/mm.h>
-
+#include <linux/capability.h>
 #include "pci.h"
 
 static int sysfs_initialized;  /* = 0 */
index a7bce75c673281641bec37054c10d3def7afabe5..34b8dae0d90fd18455be3ff9aa471de8de585608 100644 (file)
@@ -22,6 +22,18 @@ EXPORT_SYMBOL(pci_root_buses);
 
 LIST_HEAD(pci_devices);
 
+/*
+ * Some device drivers need know if pci is initiated.
+ * Basically, we think pci is not initiated when there
+ * is no device in list of pci_devices.
+ */
+int no_pci_devices(void)
+{
+       return list_empty(&pci_devices);
+}
+
+EXPORT_SYMBOL(no_pci_devices);
+
 #ifdef HAVE_PCI_LEGACY
 /**
  * pci_create_legacy_files - create legacy I/O port and memory files
index cfa0dfe61b1af384b89da6147cb75bf93d6dc70d..90adc62d07ffb7006f820fe32486aea6abaa5377 100644 (file)
@@ -11,7 +11,7 @@
 #include <linux/module.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
-
+#include <linux/capability.h>
 #include <asm/uaccess.h>
 #include <asm/byteorder.h>
 #include "pci.h"
index 9f7090fa8771401c954782eec3e052f5e29e7770..c6e79d01ce3d1a8e4f747a762f8e052712320102 100644 (file)
@@ -202,7 +202,7 @@ static struct pci_dev * pci_find_subsys(unsigned int vendor,
         * can cause some machines to crash.  So here we detect and flag that
         * situation and bail out early.
         */
-       if (unlikely(list_empty(&pci_devices)))
+       if (unlikely(no_pci_devices()))
                return NULL;
        down_read(&pci_bus_sem);
        n = from ? from->global_list.next : pci_devices.next;
@@ -277,7 +277,7 @@ pci_get_subsys(unsigned int vendor, unsigned int device,
         * can cause some machines to crash.  So here we detect and flag that
         * situation and bail out early.
         */
-       if (unlikely(list_empty(&pci_devices)))
+       if (unlikely(no_pci_devices()))
                return NULL;
        down_read(&pci_bus_sem);
        n = from ? from->global_list.next : pci_devices.next;
index 1959cef8e9debc6e613882ebfd06427ecab929d2..821933f9aa57dc84825301e8b45504ad711aa3c5 100644 (file)
@@ -2,11 +2,9 @@
 # Plug and Play configuration
 #
 
-menu "Plug and Play support"
-       depends on HAS_IOMEM
-
-config PNP
+menuconfig PNP
        bool "Plug and Play support"
+       depends on HAS_IOMEM
        depends on ISA || ACPI
        ---help---
          Plug and Play (PnP) is a standard for peripherals which allows those
@@ -22,15 +20,15 @@ config PNP
 
          If unsure, say Y.
 
+if PNP
+
 config PNP_DEBUG
        bool "PnP Debug Messages"
-       depends on PNP
        help
          Say Y if you want the Plug and Play Layer to print debug messages.
          This is useful if you are developing a PnP driver or troubleshooting.
 
 comment "Protocols"
-       depends on PNP
 
 source "drivers/pnp/isapnp/Kconfig"
 
@@ -38,5 +36,4 @@ source "drivers/pnp/pnpbios/Kconfig"
 
 source "drivers/pnp/pnpacpi/Kconfig"
 
-endmenu
-
+endif # PNP
index 578651eeb4b02c30578e326a1592bd1cbf16a3b9..f1ef36673ad41de168eb706bd775be3cef0a9617 100644 (file)
@@ -3,7 +3,7 @@
 #
 config ISAPNP
        bool "ISA Plug and Play support"
-       depends on PNP && ISA
+       depends on ISA
        help
          Say Y here if you would like support for ISA Plug and Play devices.
          Some information is in <file:Documentation/isapnp.txt>.
index a0b158704ca1f8f5eb5982f55477c96586d5692f..914d00c423ade6a353fd81d333c2eef7d89a6254 100644 (file)
@@ -370,8 +370,6 @@ static int __init isapnp_read_tag(unsigned char *type, unsigned short *size)
 #if 0
        printk(KERN_DEBUG "tag = 0x%x, type = 0x%x, size = %i\n", tag, *type, *size);
 #endif
-       if (type == 0)                          /* wrong type */
-               return -1;
        if (*type == 0xff && *size == 0xffff)   /* probably invalid data */
                return -1;
        return 0;
index fab848cae89de6e627f5a725642344204d11a203..b986d9fa3b9af0d6dfad6ef5c3ef63f45a0359c1 100644 (file)
@@ -3,7 +3,7 @@
 #
 config PNPBIOS
        bool "Plug and Play BIOS support (EXPERIMENTAL)"
-       depends on PNP && ISA && X86 && EXPERIMENTAL
+       depends on ISA && X86 && EXPERIMENTAL
        default n
        ---help---
          Linux uses the PNPBIOS as defined in "Plug and Play BIOS
index 022e869c44ddf77373370e4b0ee57e49342b9508..7b5773d882127cd0b935468cfa4b58a682a6a920 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/ioport.h>
 #include <linux/timer.h>
 #include <linux/smp_lock.h>
+#include <linux/io.h>
 #include <asm/irq.h>
 #include <asm/ebus.h>
 #include <asm/oplib.h>
index 9d2119b53ac9d1f9ad23f720bf81d0e020f16609..372723161c97b8278c594220ff0c949076bdcd55 100644 (file)
@@ -545,7 +545,7 @@ config SCSI_HPTIOP
 
 config SCSI_BUSLOGIC
        tristate "BusLogic SCSI support"
-       depends on (PCI || ISA || MCA) && SCSI && ISA_DMA_API
+       depends on (PCI || ISA || MCA) && SCSI && ISA_DMA_API && VIRT_TO_BUS
        ---help---
          This is support for BusLogic MultiMaster and FlashPoint SCSI Host
          Adapters. Consult the SCSI-HOWTO, available from
index 68817a7d8c0d46c7ea33e05e3a1eeac7013a7db8..2aa6bfe8fdb3d2a0fdfb8d685a065ff7815a4e6b 100644 (file)
@@ -934,8 +934,6 @@ static void change_speed(ser_info_t *info)
        /*
         * Set up parity check flag
         */
-#define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
-
        info->read_status_mask = (BD_SC_EMPTY | BD_SC_OV);
        if (I_INPCK(info->tty))
                info->read_status_mask |= BD_SC_FR | BD_SC_PR;
@@ -1527,11 +1525,6 @@ static void rs_360_set_termios(struct tty_struct *tty, struct ktermios *old_term
 {
        ser_info_t *info = (ser_info_t *)tty->driver_data;
 
-       if (   (tty->termios->c_cflag == old_termios->c_cflag)
-           && (   RELEVANT_IFLAG(tty->termios->c_iflag) 
-               == RELEVANT_IFLAG(old_termios->c_iflag)))
-         return;
-
        change_speed(info);
 
 #ifdef modem_control
index c84dab083a852b48ff7a55d1fbe87c79cd01e23a..0b3ec38ae6147e05ac8e02a917e1427adb4c46e8 100644 (file)
@@ -2514,12 +2514,18 @@ static int __init serial8250_console_setup(struct console *co, char *options)
        return uart_set_options(port, co, baud, parity, bits, flow);
 }
 
+static int __init serial8250_console_early_setup(void)
+{
+       return serial8250_find_port_for_earlycon();
+}
+
 static struct uart_driver serial8250_reg;
 static struct console serial8250_console = {
        .name           = "ttyS",
        .write          = serial8250_console_write,
        .device         = uart_console_device,
        .setup          = serial8250_console_setup,
+       .early_setup    = serial8250_console_early_setup,
        .flags          = CON_PRINTBUFFER,
        .index          = -1,
        .data           = &serial8250_reg,
@@ -2533,7 +2539,7 @@ static int __init serial8250_console_init(void)
 }
 console_initcall(serial8250_console_init);
 
-static int __init find_port(struct uart_port *p)
+int serial8250_find_port(struct uart_port *p)
 {
        int line;
        struct uart_port *port;
@@ -2546,26 +2552,6 @@ static int __init find_port(struct uart_port *p)
        return -ENODEV;
 }
 
-int __init serial8250_start_console(struct uart_port *port, char *options)
-{
-       int line;
-
-       line = find_port(port);
-       if (line < 0)
-               return -ENODEV;
-
-       add_preferred_console("ttyS", line, options);
-       printk("Adding console on ttyS%d at %s 0x%lx (options '%s')\n",
-               line, port->iotype == UPIO_MEM ? "MMIO" : "I/O port",
-               port->iotype == UPIO_MEM ? (unsigned long) port->mapbase :
-                   (unsigned long) port->iobase, options);
-       if (!(serial8250_console.flags & CON_ENABLED)) {
-               serial8250_console.flags &= ~CON_PRINTBUFFER;
-               register_console(&serial8250_console);
-       }
-       return line;
-}
-
 #define SERIAL8250_CONSOLE     &serial8250_console
 #else
 #define SERIAL8250_CONSOLE     NULL
index 7e511199b4c5c91f09fcde69ced030c7ca15043d..947c20507e1f2a4bee47d64d918e9b3ecb167c45 100644 (file)
  * we locate the device directly by its MMIO or I/O port address.
  *
  * The user can specify the device directly, e.g.,
- *     console=uart,io,0x3f8,9600n8
- *     console=uart,mmio,0xff5e0000,115200n8
- * or platform code can call early_uart_console_init() to set
- * the early UART device.
- *
- * After the normal serial driver starts, we try to locate the
- * matching ttyS device and start a console there.
+ *     earlycon=uart8250,io,0x3f8,9600n8
+ *     earlycon=uart8250,mmio,0xff5e0000,115200n8
+ * or
+ *     console=uart8250,io,0x3f8,9600n8
+ *     console=uart8250,mmio,0xff5e0000,115200n8
  */
 
 #include <linux/tty.h>
 #include <linux/serial_core.h>
 #include <linux/serial_reg.h>
 #include <linux/serial.h>
+#include <linux/serial_8250.h>
 #include <asm/io.h>
 #include <asm/serial.h>
+#ifdef CONFIG_FIX_EARLYCON_MEM
+#include <asm/pgtable.h>
+#include <asm/fixmap.h>
+#endif
 
-struct early_uart_device {
+struct early_serial8250_device {
        struct uart_port port;
        char options[16];               /* e.g., 115200n8 */
        unsigned int baud;
 };
 
-static struct early_uart_device early_device __initdata;
-static int early_uart_registered __initdata;
+static struct early_serial8250_device early_device;
 
 static unsigned int __init serial_in(struct uart_port *port, int offset)
 {
@@ -80,7 +82,7 @@ static void __init putc(struct uart_port *port, int c)
        serial_out(port, UART_TX, c);
 }
 
-static void __init early_uart_write(struct console *console, const char *s, unsigned int count)
+static void __init early_serial8250_write(struct console *console, const char *s, unsigned int count)
 {
        struct uart_port *port = &early_device.port;
        unsigned int ier;
@@ -111,7 +113,7 @@ static unsigned int __init probe_baud(struct uart_port *port)
        return (port->uartclk / 16) / quot;
 }
 
-static void __init init_port(struct early_uart_device *device)
+static void __init init_port(struct early_serial8250_device *device)
 {
        struct uart_port *port = &device->port;
        unsigned int divisor;
@@ -130,10 +132,9 @@ static void __init init_port(struct early_uart_device *device)
        serial_out(port, UART_LCR, c & ~UART_LCR_DLAB);
 }
 
-static int __init parse_options(struct early_uart_device *device, char *options)
+static int __init parse_options(struct early_serial8250_device *device, char *options)
 {
        struct uart_port *port = &device->port;
-       int mapsize = 64;
        int mmio, length;
 
        if (!options)
@@ -143,12 +144,18 @@ static int __init parse_options(struct early_uart_device *device, char *options)
        if (!strncmp(options, "mmio,", 5)) {
                port->iotype = UPIO_MEM;
                port->mapbase = simple_strtoul(options + 5, &options, 0);
-               port->membase = ioremap(port->mapbase, mapsize);
+#ifdef CONFIG_FIX_EARLYCON_MEM
+               set_fixmap_nocache(FIX_EARLYCON_MEM_BASE, port->mapbase & PAGE_MASK);
+               port->membase = (void __iomem *)__fix_to_virt(FIX_EARLYCON_MEM_BASE);
+               port->membase += port->mapbase & ~PAGE_MASK;
+#else
+               port->membase = ioremap(port->mapbase, 64);
                if (!port->membase) {
                        printk(KERN_ERR "%s: Couldn't ioremap 0x%lx\n",
                                __FUNCTION__, port->mapbase);
                        return -ENOMEM;
                }
+#endif
                mmio = 1;
        } else if (!strncmp(options, "io,", 3)) {
                port->iotype = UPIO_PORT;
@@ -175,9 +182,16 @@ static int __init parse_options(struct early_uart_device *device, char *options)
        return 0;
 }
 
-static int __init early_uart_setup(struct console *console, char *options)
+static struct console early_serial8250_console __initdata = {
+       .name   = "uart",
+       .write  = early_serial8250_write,
+       .flags  = CON_PRINTBUFFER | CON_BOOT,
+       .index  = -1,
+};
+
+static int __init early_serial8250_setup(char *options)
 {
-       struct early_uart_device *device = &early_device;
+       struct early_serial8250_device *device = &early_device;
        int err;
 
        if (device->port.membase || device->port.iobase)
@@ -190,61 +204,48 @@ static int __init early_uart_setup(struct console *console, char *options)
        return 0;
 }
 
-static struct console early_uart_console __initdata = {
-       .name   = "uart",
-       .write  = early_uart_write,
-       .setup  = early_uart_setup,
-       .flags  = CON_PRINTBUFFER,
-       .index  = -1,
-};
-
-static int __init early_uart_console_init(void)
-{
-       if (!early_uart_registered) {
-               register_console(&early_uart_console);
-               early_uart_registered = 1;
-       }
-       return 0;
-}
-console_initcall(early_uart_console_init);
-
-int __init early_serial_console_init(char *cmdline)
+int __init setup_early_serial8250_console(char *cmdline)
 {
        char *options;
        int err;
 
-       options = strstr(cmdline, "console=uart,");
-       if (!options)
-               return -ENODEV;
+       options = strstr(cmdline, "uart8250,");
+       if (!options) {
+               options = strstr(cmdline, "uart,");
+               if (!options)
+                       return 0;
+       }
 
        options = strchr(cmdline, ',') + 1;
-       if ((err = early_uart_setup(NULL, options)) < 0)
+       if ((err = early_serial8250_setup(options)) < 0)
                return err;
-       return early_uart_console_init();
+
+       register_console(&early_serial8250_console);
+
+       return 0;
 }
 
-static int __init early_uart_console_switch(void)
+int __init serial8250_find_port_for_earlycon(void)
 {
-       struct early_uart_device *device = &early_device;
+       struct early_serial8250_device *device = &early_device;
        struct uart_port *port = &device->port;
-       int mmio, line;
+       int line;
+       int ret;
 
-       if (!(early_uart_console.flags & CON_ENABLED))
-               return 0;
+       if (!device->port.membase && !device->port.iobase)
+               return -ENODEV;
 
-       /* Try to start the normal driver on a matching line.  */
-       mmio = (port->iotype == UPIO_MEM);
-       line = serial8250_start_console(port, device->options);
+       line = serial8250_find_port(port);
        if (line < 0)
-               printk("No ttyS device at %s 0x%lx for console\n",
-                       mmio ? "MMIO" : "I/O port",
-                       mmio ? port->mapbase :
-                           (unsigned long) port->iobase);
+               return -ENODEV;
 
-       unregister_console(&early_uart_console);
-       if (mmio)
-               iounmap(port->membase);
+       ret = update_console_cmdline("uart", 8250,
+                            "ttyS", line, device->options);
+       if (ret < 0)
+               ret = update_console_cmdline("uart", 0,
+                                    "ttyS", line, device->options);
 
-       return 0;
+       return ret;
 }
-late_initcall(early_uart_console_switch);
+
+early_param("earlycon", setup_early_serial8250_console);
index 2adbed4e10f350ac753d7db2f1be860eb01e6243..cab42cbd920db98df8d9941f5f0e466dfdfa6868 100644 (file)
@@ -62,8 +62,22 @@ config SERIAL_8250_CONSOLE
          kernel will automatically use the first serial line, /dev/ttyS0, as
          system console.
 
+         you can set that using a kernel command line option such as
+         "console=uart8250,io,0x3f8,9600n8"
+         "console=uart8250,mmio,0xff5e0000,115200n8".
+         and it will switch to normal serial console when correponding port is
+         ready.
+         "earlycon=uart8250,io,0x3f8,9600n8"
+         "earlycon=uart8250,mmio,0xff5e0000,115200n8".
+         it will not only setup early console.
+
          If unsure, say N.
 
+config FIX_EARLYCON_MEM
+       bool
+       depends on X86
+       default y
+
 config SERIAL_8250_GSC
        tristate
        depends on SERIAL_8250 && GSC
index 3320bcd92c0a3b54de5b3da4c52a9c1683bb84eb..4d6b3c56d20e7df9ea1262ae89cae2e24d18f901 100644 (file)
@@ -114,6 +114,7 @@ struct atmel_uart_port {
        struct uart_port        uart;           /* uart */
        struct clk              *clk;           /* uart clock */
        unsigned short          suspended;      /* is port suspended? */
+       int                     break_active;   /* break being received */
 };
 
 static struct atmel_uart_port atmel_ports[ATMEL_MAX_UART];
@@ -252,6 +253,7 @@ static void atmel_break_ctl(struct uart_port *port, int break_state)
  */
 static void atmel_rx_chars(struct uart_port *port)
 {
+       struct atmel_uart_port *atmel_port = (struct atmel_uart_port *) port;
        struct tty_struct *tty = port->info->tty;
        unsigned int status, ch, flg;
 
@@ -267,13 +269,29 @@ static void atmel_rx_chars(struct uart_port *port)
                 * note that the error handling code is
                 * out of the main execution path
                 */
-               if (unlikely(status & (ATMEL_US_PARE | ATMEL_US_FRAME | ATMEL_US_OVRE | ATMEL_US_RXBRK))) {
+               if (unlikely(status & (ATMEL_US_PARE | ATMEL_US_FRAME
+                                      | ATMEL_US_OVRE | ATMEL_US_RXBRK)
+                            || atmel_port->break_active)) {
                        UART_PUT_CR(port, ATMEL_US_RSTSTA);     /* clear error */
-                       if (status & ATMEL_US_RXBRK) {
+                       if (status & ATMEL_US_RXBRK
+                           && !atmel_port->break_active) {
                                status &= ~(ATMEL_US_PARE | ATMEL_US_FRAME);    /* ignore side-effect */
                                port->icount.brk++;
+                               atmel_port->break_active = 1;
+                               UART_PUT_IER(port, ATMEL_US_RXBRK);
                                if (uart_handle_break(port))
                                        goto ignore_char;
+                       } else {
+                               /*
+                                * This is either the end-of-break
+                                * condition or we've received at
+                                * least one character without RXBRK
+                                * being set. In both cases, the next
+                                * RXBRK will indicate start-of-break.
+                                */
+                               UART_PUT_IDR(port, ATMEL_US_RXBRK);
+                               status &= ~ATMEL_US_RXBRK;
+                               atmel_port->break_active = 0;
                        }
                        if (status & ATMEL_US_PARE)
                                port->icount.parity++;
@@ -352,6 +370,16 @@ static irqreturn_t atmel_interrupt(int irq, void *dev_id)
                /* Interrupt receive */
                if (pending & ATMEL_US_RXRDY)
                        atmel_rx_chars(port);
+               else if (pending & ATMEL_US_RXBRK) {
+                       /*
+                        * End of break detected. If it came along
+                        * with a character, atmel_rx_chars will
+                        * handle it.
+                        */
+                       UART_PUT_CR(port, ATMEL_US_RSTSTA);
+                       UART_PUT_IDR(port, ATMEL_US_RXBRK);
+                       atmel_port->break_active = 0;
+               }
 
                // TODO: All reads to CSR will clear these interrupts!
                if (pending & ATMEL_US_RIIC) port->icount.rng++;
index c3abfb39f31650c207b16fe17d6ed778f5932bc9..f3257f708ef91161bb10469ac97c09f998eadf3d 100644 (file)
@@ -862,6 +862,7 @@ ip22zilog_set_termios(struct uart_port *port, struct ktermios *termios,
        up->cflag = termios->c_cflag;
 
        ip22zilog_maybe_update_regs(up, ZILOG_CHANNEL_FROM_PORT(port));
+       uart_update_timeout(port, termios->c_cflag, baud);
 
        spin_unlock_irqrestore(&up->port.lock, flags);
 }
@@ -1017,6 +1018,8 @@ ip22serial_console_termios(struct console *con, char *options)
        }
 
        con->cflag = cflag | CS8;                       /* 8N1 */
+
+       uart_update_timeout(&ip22zilog_port_table[con->index].port, cflag, baud);
 }
 
 static int __init ip22zilog_console_setup(struct console *con, char *options)
index 326020f86f757e98ef6f148754cdb1e355ee75b3..9c57486c2e7fe20783b004dad25475b4cc805358 100644 (file)
@@ -1910,6 +1910,12 @@ uart_set_options(struct uart_port *port, struct console *co,
        if (flow == 'r')
                termios.c_cflag |= CRTSCTS;
 
+       /*
+        * some uarts on other side don't support no flow control.
+        * So we set * DTR in host uart to make them happy
+        */
+       port->mctrl |= TIOCM_DTR;
+
        port->ops->set_termios(port, &termios, NULL);
        co->cflag = termios.c_cflag;
 
index 1f89496d530e405db3f11d6d0f52eaaaed34ae5f..672cd104253968451af42759fdb2320a2791d922 100644 (file)
@@ -367,7 +367,9 @@ static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag)
        } else {
 #ifdef CONFIG_CPU_SUBTYPE_SH7343
                /* Nothing */
-#elif defined(CONFIG_CPU_SUBTYPE_SH7780) || defined(CONFIG_CPU_SUBTYPE_SH7785)
+#elif defined(CONFIG_CPU_SUBTYPE_SH7780) || \
+      defined(CONFIG_CPU_SUBTYPE_SH7785) || \
+      defined(CONFIG_CPU_SUBTYPE_SHX3)
                ctrl_outw(0x0080, SCSPTR0); /* Set RTS = 1 */
 #else
                ctrl_outw(0x0080, SCSPTR2); /* Set RTS = 1 */
index fb04fb5f984309555ca89b0bf7d11047ccf4d2e8..247fb66bf0f41e7a4de7685f4e72077bb244c7d6 100644 (file)
 # define SCIF_ORER 0x0001   /* overrun error bit */
 # define SCSCR_INIT(port) 0x3a /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
 # define SCIF_ONLY
-#elif defined(CONFIG_CPU_SUBTYPE_SH7750) || defined(CONFIG_CPU_SUBTYPE_SH7751)
+#elif defined(CONFIG_CPU_SUBTYPE_SH7750)  || \
+      defined(CONFIG_CPU_SUBTYPE_SH7750R) || \
+      defined(CONFIG_CPU_SUBTYPE_SH7750S) || \
+      defined(CONFIG_CPU_SUBTYPE_SH7091)  || \
+      defined(CONFIG_CPU_SUBTYPE_SH7751)  || \
+      defined(CONFIG_CPU_SUBTYPE_SH7751R)
 # define SCSPTR1 0xffe0001c /* 8  bit SCI */
 # define SCSPTR2 0xFFE80020 /* 16 bit SCIF */
 # define SCIF_ORER 0x0001   /* overrun error bit */
@@ -73,7 +78,7 @@
 # define SCPDR  0xA4050136        /* 16 bit SCIF */
 # define SCSCR_INIT(port)  0x0030 /* TIE=0,RIE=0,TE=1,RE=1 */
 # define SCIF_ONLY
-#elif defined(CONFIG_CPU_SUBTYPE_SH7710) || defined(CONFIG_CPU_SUBTYPE_SH7712) 
+#elif defined(CONFIG_CPU_SUBTYPE_SH7710) || defined(CONFIG_CPU_SUBTYPE_SH7712)
 # define SCSPTR0 0xA4400000      /* 16 bit SCIF */
 # define SCI_NPORTS 2
 # define SCIF_ORER 0x0001   /* overrun error bit */
 # define SCIF_ORER 0x0001  /* overrun error bit */
 # define SCSCR_INIT(port)      0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
 # define SCIF_ONLY
+#elif defined(CONFIG_CPU_SUBTYPE_SHX3)
+# define SCSPTR0 0xffc30020            /* 16 bit SCIF */
+# define SCSPTR1 0xffc40020            /* 16 bit SCIF */
+# define SCSPTR2 0xffc50020            /* 16 bit SCIF */
+# define SCSPTR3 0xffc60020            /* 16 bit SCIF */
+# define SCIF_ORER 0x0001              /* Overrun error bit */
+# define SCSCR_INIT(port)      0x38    /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
+# define SCIF_ONLY
 #else
 # error CPU subtype not defined
 #endif
 #define SCI_CTRL_FLAGS_RIE  0x40 /* all */
 #define SCI_CTRL_FLAGS_TE   0x20 /* all */
 #define SCI_CTRL_FLAGS_RE   0x10 /* all */
-#if defined(CONFIG_CPU_SUBTYPE_SH7750) || \
-    defined(CONFIG_CPU_SUBTYPE_SH7751) || \
-    defined(CONFIG_CPU_SUBTYPE_SH7780) || \
-    defined(CONFIG_CPU_SUBTYPE_SH7785)
+#if defined(CONFIG_CPU_SUBTYPE_SH7750)  || \
+    defined(CONFIG_CPU_SUBTYPE_SH7091)  || \
+    defined(CONFIG_CPU_SUBTYPE_SH7750R) || \
+    defined(CONFIG_CPU_SUBTYPE_SH7750S) || \
+    defined(CONFIG_CPU_SUBTYPE_SH7751)  || \
+    defined(CONFIG_CPU_SUBTYPE_SH7751R) || \
+    defined(CONFIG_CPU_SUBTYPE_SH7780)  || \
+    defined(CONFIG_CPU_SUBTYPE_SH7785)  || \
+    defined(CONFIG_CPU_SUBTYPE_SHX3)
 #define SCI_CTRL_FLAGS_REIE 0x08 /* 7750 SCIF */
 #else
 #define SCI_CTRL_FLAGS_REIE 0
@@ -514,8 +532,12 @@ static inline void set_sh771x_scif_pfc(struct uart_port *port)
        }
 }
 
-#elif defined(CONFIG_CPU_SUBTYPE_SH7750) || \
-      defined(CONFIG_CPU_SUBTYPE_SH7751) || \
+#elif defined(CONFIG_CPU_SUBTYPE_SH7750)  || \
+      defined(CONFIG_CPU_SUBTYPE_SH7751)  || \
+      defined(CONFIG_CPU_SUBTYPE_SH7751R) || \
+      defined(CONFIG_CPU_SUBTYPE_SH7750R) || \
+      defined(CONFIG_CPU_SUBTYPE_SH7750S) || \
+      defined(CONFIG_CPU_SUBTYPE_SH7091)  || \
       defined(CONFIG_CPU_SUBTYPE_SH4_202)
 static inline int sci_rxd_in(struct uart_port *port)
 {
@@ -653,6 +675,18 @@ static inline int sci_rxd_in(struct uart_port *port)
                return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */
        return 1;
 }
+#elif defined(CONFIG_CPU_SUBTYPE_SHX3)
+static inline int sci_rxd_in(struct uart_port *port)
+{
+       if (port->mapbase == 0xffc30000)
+               return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */
+       if (port->mapbase == 0xffc40000)
+               return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */
+       if (port->mapbase == 0xffc50000)
+               return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */
+       if (port->mapbase == 0xffc60000)
+               return ctrl_inw(SCSPTR3) & 0x0001 ? 1 : 0; /* SCIF */
+}
 #endif
 
 /*
index a27e9e92cb5eed49811fe974ec50b3939ba39f53..41fc61264443578e77fc4deb16ef276c79d2d502 100644 (file)
@@ -759,7 +759,7 @@ static void __init sn_sal_switch_to_interrupts(struct sn_cons_port *port)
  */
 
 static void sn_sal_console_write(struct console *, const char *, unsigned);
-static int __init sn_sal_console_setup(struct console *, char *);
+static int sn_sal_console_setup(struct console *, char *);
 static struct uart_driver sal_console_uart;
 extern struct tty_driver *uart_console_device(struct console *, int *);
 
@@ -1006,7 +1006,7 @@ sn_sal_console_write(struct console *co, const char *s, unsigned count)
  * here so providing it is easier.
  *
  */
-static int __init sn_sal_console_setup(struct console *co, char *options)
+static int sn_sal_console_setup(struct console *co, char *options)
 {
        return 0;
 }
index 96557e6dba60c4d57a1d96842ba5aa6cd3e8902b..17bcca53d6a1a70fb5efc374c876160961facb91 100644 (file)
@@ -440,8 +440,16 @@ static void sunhv_console_write_paged(struct console *con, const char *s, unsign
 {
        struct uart_port *port = sunhv_port;
        unsigned long flags;
+       int locked = 1;
+
+       local_irq_save(flags);
+       if (port->sysrq) {
+               locked = 0;
+       } else if (oops_in_progress) {
+               locked = spin_trylock(&port->lock);
+       } else
+               spin_lock(&port->lock);
 
-       spin_lock_irqsave(&port->lock, flags);
        while (n > 0) {
                unsigned long ra = __pa(con_write_page);
                unsigned long page_bytes;
@@ -469,7 +477,10 @@ static void sunhv_console_write_paged(struct console *con, const char *s, unsign
                        ra += written;
                }
        }
-       spin_unlock_irqrestore(&port->lock, flags);
+
+       if (locked)
+               spin_unlock(&port->lock);
+       local_irq_restore(flags);
 }
 
 static inline void sunhv_console_putchar(struct uart_port *port, char c)
@@ -488,7 +499,15 @@ static void sunhv_console_write_bychar(struct console *con, const char *s, unsig
 {
        struct uart_port *port = sunhv_port;
        unsigned long flags;
-       int i;
+       int i, locked = 1;
+
+       local_irq_save(flags);
+       if (port->sysrq) {
+               locked = 0;
+       } else if (oops_in_progress) {
+               locked = spin_trylock(&port->lock);
+       } else
+               spin_lock(&port->lock);
 
        spin_lock_irqsave(&port->lock, flags);
        for (i = 0; i < n; i++) {
@@ -496,7 +515,10 @@ static void sunhv_console_write_bychar(struct console *con, const char *s, unsig
                        sunhv_console_putchar(port, '\r');
                sunhv_console_putchar(port, *s++);
        }
-       spin_unlock_irqrestore(&port->lock, flags);
+
+       if (locked)
+               spin_unlock(&port->lock);
+       local_irq_restore(flags);
 }
 
 static struct console sunhv_console = {
index deb9ab4b5a0b6b53c3167c842a833e71d4fcc4fe..8a0f9e4408d4a78976040178885efc1571b7a184 100644 (file)
@@ -860,22 +860,31 @@ static int num_channels;
 static void sunsab_console_putchar(struct uart_port *port, int c)
 {
        struct uart_sunsab_port *up = (struct uart_sunsab_port *)port;
-       unsigned long flags;
-
-       spin_lock_irqsave(&up->port.lock, flags);
 
        sunsab_tec_wait(up);
        writeb(c, &up->regs->w.tic);
-
-       spin_unlock_irqrestore(&up->port.lock, flags);
 }
 
 static void sunsab_console_write(struct console *con, const char *s, unsigned n)
 {
        struct uart_sunsab_port *up = &sunsab_ports[con->index];
+       unsigned long flags;
+       int locked = 1;
+
+       local_irq_save(flags);
+       if (up->port.sysrq) {
+               locked = 0;
+       } else if (oops_in_progress) {
+               locked = spin_trylock(&up->port.lock);
+       } else
+               spin_lock(&up->port.lock);
 
        uart_console_write(&up->port, s, n, sunsab_console_putchar);
        sunsab_tec_wait(up);
+
+       if (locked)
+               spin_unlock(&up->port.lock);
+       local_irq_restore(flags);
 }
 
 static int sunsab_console_setup(struct console *con, char *options)
index 2a63cdba32083eae3984578722ba7159fc58eb06..26d720baf88c17619577d09420b50cade271e09d 100644 (file)
@@ -1288,7 +1288,17 @@ static void sunsu_console_write(struct console *co, const char *s,
                                unsigned int count)
 {
        struct uart_sunsu_port *up = &sunsu_ports[co->index];
+       unsigned long flags;
        unsigned int ier;
+       int locked = 1;
+
+       local_irq_save(flags);
+       if (up->port.sysrq) {
+               locked = 0;
+       } else if (oops_in_progress) {
+               locked = spin_trylock(&up->port.lock);
+       } else
+               spin_lock(&up->port.lock);
 
        /*
         *      First save the UER then disable the interrupts
@@ -1304,6 +1314,10 @@ static void sunsu_console_write(struct console *co, const char *s,
         */
        wait_for_xmitr(up);
        serial_out(up, UART_IER, ier);
+
+       if (locked)
+               spin_unlock(&up->port.lock);
+       local_irq_restore(flags);
 }
 
 /*
index 15b6e1cb040be54994ea9cbeea68bce51a61e2bf..0a3e10a4a35dec59485e1455b5ee8f30a0277c25 100644 (file)
@@ -9,7 +9,7 @@
  * C. Dost, Pete Zaitcev, Ted Ts'o and Alex Buell for their
  * work there.
  *
- *  Copyright (C) 2002, 2006 David S. Miller (davem@davemloft.net)
+ * Copyright (C) 2002, 2006, 2007 David S. Miller (davem@davemloft.net)
  */
 
 #include <linux/module.h>
@@ -1151,11 +1151,22 @@ sunzilog_console_write(struct console *con, const char *s, unsigned int count)
 {
        struct uart_sunzilog_port *up = &sunzilog_port_table[con->index];
        unsigned long flags;
+       int locked = 1;
+
+       local_irq_save(flags);
+       if (up->port.sysrq) {
+               locked = 0;
+       } else if (oops_in_progress) {
+               locked = spin_trylock(&up->port.lock);
+       } else
+               spin_lock(&up->port.lock);
 
-       spin_lock_irqsave(&up->port.lock, flags);
        uart_console_write(&up->port, s, count, sunzilog_putchar);
        udelay(2);
-       spin_unlock_irqrestore(&up->port.lock, flags);
+
+       if (locked)
+               spin_unlock(&up->port.lock);
+       local_irq_restore(flags);
 }
 
 static int __init sunzilog_console_setup(struct console *con, char *options)
index dd1d6a53f3c084f0b5a2cc49d27ee27da3fafb0c..8f530e68263bd31fb8f80ce2be5660de6b2733a9 100644 (file)
@@ -2,11 +2,9 @@
 # Telephony device configuration
 #
 
-menu "Telephony Support"
+menuconfig PHONE
+       tristate "Telephony support"
        depends on HAS_IOMEM
-
-config PHONE
-       tristate "Linux telephony support"
        ---help---
          Say Y here if you have a telephony card, which for example allows
          you to use a regular phone for voice-over-IP applications.
@@ -17,9 +15,10 @@ config PHONE
          To compile this driver as a module, choose M here: the
          module will be called phonedev.
 
+if PHONE
+
 config PHONE_IXJ
        tristate "QuickNet Internet LineJack/PhoneJack support"
-       depends on PHONE
        ---help---
          Say M if you have a telephony card manufactured by Quicknet
          Technologies, Inc.  These include the Internet PhoneJACK and
@@ -44,5 +43,4 @@ config PHONE_IXJ_PCMCIA
          cards manufactured by Quicknet Technologies, Inc.  This changes the
          card initialization code to work with the card manager daemon.
 
-endmenu
-
+endif # PHONE
index df2909ae704cd51132021b14a85d066f71b5517b..2ba959a83eb0f9c252854a3cacfce4fca94c6238 100644 (file)
@@ -115,11 +115,11 @@ enum { VO_PAL, VO_NTSC, VO_VGA };
 enum { PAL_ARGB1555, PAL_RGB565, PAL_ARGB4444, PAL_ARGB8888 };
 
 struct pvr2_params { unsigned int val; char *name; };
-static struct pvr2_params cables[] __initdata = {
+static struct pvr2_params cables[] __devinitdata = {
        { CT_VGA, "VGA" }, { CT_RGB, "RGB" }, { CT_COMPOSITE, "COMPOSITE" },
 };
 
-static struct pvr2_params outputs[] __initdata = {
+static struct pvr2_params outputs[] __devinitdata = {
        { VO_PAL, "PAL" }, { VO_NTSC, "NTSC" }, { VO_VGA, "VGA" },
 };
 
@@ -147,16 +147,16 @@ static struct pvr2fb_par {
 
 static struct fb_info *fb_info;
 
-static struct fb_fix_screeninfo pvr2_fix __initdata = {
+static struct fb_fix_screeninfo pvr2_fix __devinitdata = {
        .id =           "NEC PowerVR2",
-       .type =         FB_TYPE_PACKED_PIXELS,
-       .visual =       FB_VISUAL_TRUECOLOR,
+       .type =         FB_TYPE_PACKED_PIXELS,
+       .visual =       FB_VISUAL_TRUECOLOR,
        .ypanstep =     1,
        .ywrapstep =    1,
-       .accel =        FB_ACCEL_NONE,
+       .accel =        FB_ACCEL_NONE,
 };
 
-static struct fb_var_screeninfo pvr2_var __initdata = {
+static struct fb_var_screeninfo pvr2_var __devinitdata = {
        .xres =         640,
        .yres =         480,
        .xres_virtual = 640,
@@ -195,10 +195,6 @@ static unsigned int shdma = PVR2_CASCADE_CHAN;
 static unsigned int pvr2dma = ONCHIP_NR_DMA_CHANNELS;
 #endif
 
-/* Interface used by the world */
-
-int pvr2fb_setup(char*);
-
 static int pvr2fb_setcolreg(unsigned int regno, unsigned int red, unsigned int green, unsigned int blue,
                             unsigned int transp, struct fb_info *info);
 static int pvr2fb_blank(int blank, struct fb_info *info);
@@ -227,12 +223,12 @@ static struct fb_ops pvr2fb_ops = {
 #ifdef CONFIG_SH_DMA
        .fb_write       = pvr2fb_write,
 #endif
-       .fb_fillrect    = cfb_fillrect,
+       .fb_fillrect    = cfb_fillrect,
        .fb_copyarea    = cfb_copyarea,
        .fb_imageblit   = cfb_imageblit,
 };
 
-static struct fb_videomode pvr2_modedb[] __initdata = {
+static struct fb_videomode pvr2_modedb[] __devinitdata = {
     /*
      * Broadcast video modes (PAL and NTSC).  I'm unfamiliar with
      * PAL-M and PAL-N, but from what I've read both modes parallel PAL and
@@ -252,7 +248,7 @@ static struct fb_videomode pvr2_modedb[] __initdata = {
        /* 640x480 @ 60hz (VGA) */
        "vga_640x480", 60, 640, 480, VGA_CLK, 38, 33, 0, 18, 146, 26,
        0, FB_VMODE_YWRAP
-    }, 
+    },
 };
 
 #define NUM_TOTAL_MODES  ARRAY_SIZE(pvr2_modedb)
@@ -262,7 +258,7 @@ static struct fb_videomode pvr2_modedb[] __initdata = {
 #define DEFMODE_VGA    2
 
 static int defmode = DEFMODE_NTSC;
-static char *mode_option __initdata = NULL;
+static char *mode_option __devinitdata = NULL;
 
 static inline void pvr2fb_set_pal_type(unsigned int type)
 {
@@ -293,7 +289,7 @@ static void set_color_bitfields(struct fb_var_screeninfo *var)
 {
        switch (var->bits_per_pixel) {
            case 16:        /* RGB 565 */
-               pvr2fb_set_pal_type(PAL_RGB565);
+               pvr2fb_set_pal_type(PAL_RGB565);
                var->red.offset = 11;    var->red.length = 5;
                var->green.offset = 5;   var->green.length = 6;
                var->blue.offset = 0;    var->blue.length = 5;
@@ -306,7 +302,7 @@ static void set_color_bitfields(struct fb_var_screeninfo *var)
                var->transp.offset = 0;  var->transp.length = 0;
                break;
            case 32:        /* ARGB 8888 */
-               pvr2fb_set_pal_type(PAL_ARGB8888);
+               pvr2fb_set_pal_type(PAL_ARGB8888);
                var->red.offset = 16;    var->red.length = 8;
                var->green.offset = 8;   var->green.length = 8;
                var->blue.offset = 0;    var->blue.length = 8;
@@ -379,13 +375,13 @@ static int pvr2fb_set_par(struct fb_info *info)
        var->vmode &= FB_VMODE_MASK;
        if (var->vmode & FB_VMODE_INTERLACED && video_output != VO_VGA)
                par->is_interlaced = 1;
-       /* 
+       /*
         * XXX: Need to be more creative with this (i.e. allow doublecan for
         * PAL/NTSC output).
         */
        if (var->vmode & FB_VMODE_DOUBLE && video_output == VO_VGA)
                par->is_doublescan = 1;
-       
+
        par->hsync_total = var->left_margin + var->xres + var->right_margin +
                           var->hsync_len;
        par->vsync_total = var->upper_margin + var->yres + var->lower_margin +
@@ -408,7 +404,7 @@ static int pvr2fb_set_par(struct fb_info *info)
        } else {
                /* VGA mode */
                /* XXX: What else needs to be checked? */
-               /* 
+               /*
                 * XXX: We have a little freedom in VGA modes, what ranges
                 * should be here (i.e. hsync/vsync totals, etc.)?
                 */
@@ -419,8 +415,8 @@ static int pvr2fb_set_par(struct fb_info *info)
        /* Calculate the remainding offsets */
        par->diwstart_h = par->borderstart_h + var->left_margin;
        par->diwstart_v = par->borderstart_v + var->upper_margin;
-       par->borderstop_h = par->diwstart_h + var->xres + 
-                           var->right_margin;    
+       par->borderstop_h = par->diwstart_h + var->xres +
+                           var->right_margin;
        par->borderstop_v = par->diwstart_v + var->yres +
                            var->lower_margin;
 
@@ -465,12 +461,12 @@ static int pvr2fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
        set_color_bitfields(var);
 
        if (var->vmode & FB_VMODE_YWRAP) {
-               if (var->xoffset || var->yoffset < 0 || 
+               if (var->xoffset || var->yoffset < 0 ||
                    var->yoffset >= var->yres_virtual) {
                        var->xoffset = var->yoffset = 0;
                } else {
                        if (var->xoffset > var->xres_virtual - var->xres ||
-                           var->yoffset > var->yres_virtual - var->yres || 
+                           var->yoffset > var->yres_virtual - var->yres ||
                            var->xoffset < 0 || var->yoffset < 0)
                                var->xoffset = var->yoffset = 0;
                }
@@ -478,7 +474,7 @@ static int pvr2fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
                var->xoffset = var->yoffset = 0;
        }
 
-       /* 
+       /*
         * XXX: Need to be more creative with this (i.e. allow doublecan for
         * PAL/NTSC output).
         */
@@ -507,7 +503,7 @@ static int pvr2fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
                var->vsync_len    = par->borderstop_v +
                                   (par->vsync_total - par->borderstop_v);
        }
-               
+
        hsync_total = var->left_margin + var->xres + var->right_margin +
                      var->hsync_len;
        vtotal = var->upper_margin + var->yres + var->lower_margin +
@@ -531,7 +527,7 @@ static int pvr2fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
                        }
                }
        }
-       
+
        /* Check memory sizes */
        line_length = get_line_length(var->xres_virtual, var->bits_per_pixel);
        if (line_length * var->yres_virtual > info->fix.smem_len)
@@ -552,7 +548,7 @@ static void pvr2_update_display(struct fb_info *info)
                  DISP_DIWADDRS);
 }
 
-/* 
+/*
  * Initialize the video mode.  Currently, the 16bpp and 24bpp modes aren't
  * very stable.  It's probably due to the fact that a lot of the 2D video
  * registers are still undocumented.
@@ -592,18 +588,18 @@ static void pvr2_init_display(struct fb_info *info)
        /* display window start position */
        fb_writel(par->diwstart_h, DISP_DIWHSTRT);
        fb_writel((par->diwstart_v << 16) | par->diwstart_v, DISP_DIWVSTRT);
-       
+
        /* misc. settings */
        fb_writel((0x16 << 16) | par->is_lowres, DISP_DIWCONF);
 
        /* clock doubler (for VGA), scan doubler, display enable */
-       fb_writel(((video_output == VO_VGA) << 23) | 
+       fb_writel(((video_output == VO_VGA) << 23) |
                  (par->is_doublescan << 1) | 1, DISP_DIWMODE);
 
        /* bits per pixel */
        fb_writel(fb_readl(DISP_DIWMODE) | (--bytesperpixel << 2), DISP_DIWMODE);
 
-       /* video enable, color sync, interlace, 
+       /* video enable, color sync, interlace,
         * hsync and vsync polarity (currently unused) */
        fb_writel(0x100 | ((par->is_interlaced /*|4*/) << 4), DISP_SYNCCONF);
 }
@@ -657,7 +653,7 @@ static irqreturn_t pvr2fb_interrupt(int irq, void *dev_id)
 static int pvr2_init_cable(void)
 {
        if (cable_type < 0) {
-               fb_writel((fb_readl(PCTRA) & 0xfff0ffff) | 0x000a0000, 
+               fb_writel((fb_readl(PCTRA) & 0xfff0ffff) | 0x000a0000,
                          PCTRA);
                cable_type = (fb_readw(PDTRA) >> 8) & 3;
        }
@@ -687,7 +683,7 @@ static ssize_t pvr2fb_write(struct fb_info *info, const char *buf,
        pages = kmalloc(nr_pages * sizeof(struct page *), GFP_KERNEL);
        if (!pages)
                return -ENOMEM;
-       
+
        down_read(&current->mm->mmap_sem);
        ret = get_user_pages(current, current->mm, (unsigned long)buf,
                             nr_pages, WRITE, 0, pages, NULL);
@@ -700,7 +696,7 @@ static ssize_t pvr2fb_write(struct fb_info *info, const char *buf,
        }
 
        dma_configure_channel(shdma, 0x12c1);
-       
+
        dst   = (unsigned long)fb_info->screen_base + *ppos;
        start = (unsigned long)page_address(pages[0]);
        end   = (unsigned long)page_address(pages[nr_pages]);
@@ -744,7 +740,7 @@ out_unmap:
        kfree(pages);
 
        return ret;
-} 
+}
 #endif /* CONFIG_SH_DMA */
 
 /**
@@ -765,21 +761,21 @@ out_unmap:
  * in for flexibility anyways. Who knows, maybe someone has tv-out on a
  * PCI-based version of these things ;-)
  */
-static int __init pvr2fb_common_init(void)
+static int __devinit pvr2fb_common_init(void)
 {
        struct pvr2fb_par *par = currentpar;
        unsigned long modememused, rev;
 
        fb_info->screen_base = ioremap_nocache(pvr2_fix.smem_start,
                                               pvr2_fix.smem_len);
-       
+
        if (!fb_info->screen_base) {
                printk(KERN_ERR "pvr2fb: Failed to remap smem space\n");
                goto out_err;
        }
 
        par->mmio_base = (unsigned long)ioremap_nocache(pvr2_fix.mmio_start,
-                                                       pvr2_fix.mmio_len);
+                                                       pvr2_fix.mmio_len);
        if (!par->mmio_base) {
                printk(KERN_ERR "pvr2fb: Failed to remap mmio space\n");
                goto out_err;
@@ -820,7 +816,7 @@ static int __init pvr2fb_common_init(void)
        printk("fb%d: %s (rev %ld.%ld) frame buffer device, using %ldk/%ldk of video memory\n",
               fb_info->node, fb_info->fix.id, (rev >> 4) & 0x0f, rev & 0x0f,
               modememused >> 10, (unsigned long)(fb_info->fix.smem_len >> 10));
-       printk("fb%d: Mode %dx%d-%d pitch = %ld cable: %s video output: %s\n", 
+       printk("fb%d: Mode %dx%d-%d pitch = %ld cable: %s video output: %s\n",
               fb_info->node, fb_info->var.xres, fb_info->var.yres,
               fb_info->var.bits_per_pixel,
               get_line_length(fb_info->var.xres, fb_info->var.bits_per_pixel),
@@ -878,8 +874,8 @@ static int __init pvr2fb_dc_init(void)
                        video_output = VO_NTSC;
                }
        }
-       
-       /* 
+
+       /*
         * Nothing exciting about the DC PVR2 .. only a measly 8MiB.
         */
        pvr2_fix.smem_start     = 0xa5000000;   /* RAM starts here */
@@ -903,7 +899,7 @@ static int __init pvr2fb_dc_init(void)
        return pvr2fb_common_init();
 }
 
-static void pvr2fb_dc_exit(void)
+static void __exit pvr2fb_dc_exit(void)
 {
        if (fb_info->screen_base) {
                iounmap(fb_info->screen_base);
@@ -987,13 +983,13 @@ static int __init pvr2fb_pci_init(void)
        return pci_register_driver(&pvr2fb_pci_driver);
 }
 
-static void pvr2fb_pci_exit(void)
+static void __exit pvr2fb_pci_exit(void)
 {
        pci_unregister_driver(&pvr2fb_pci_driver);
 }
 #endif /* CONFIG_PCI */
 
-static int __init pvr2_get_param(const struct pvr2_params *p, const char *s,
+static int __devinit pvr2_get_param(const struct pvr2_params *p, const char *s,
                                    int val, int size)
 {
        int i;
@@ -1021,7 +1017,7 @@ static int __init pvr2_get_param(const struct pvr2_params *p, const char *s,
  */
 
 #ifndef MODULE
-int __init pvr2fb_setup(char *options)
+static int __init pvr2fb_setup(char *options)
 {
        char *this_opt;
        char cable_arg[80];
@@ -1061,7 +1057,7 @@ static struct pvr2_board {
        int (*init)(void);
        void (*exit)(void);
        char name[16];
-} board_list[] = {
+} board_driver[] = {
 #ifdef CONFIG_SH_DREAMCAST
        { pvr2fb_dc_init, pvr2fb_dc_exit, "Sega DC PVR2" },
 #endif
@@ -1071,7 +1067,7 @@ static struct pvr2_board {
        { 0, },
 };
 
-int __init pvr2fb_init(void)
+static int __init pvr2fb_init(void)
 {
        int i, ret = -ENODEV;
        int size;
@@ -1095,8 +1091,8 @@ int __init pvr2fb_init(void)
 
        currentpar = (struct pvr2fb_par *)(fb_info + 1);
 
-       for (i = 0; i < ARRAY_SIZE(board_list); i++) {
-               struct pvr2_board *pvr_board = board_list + i;
+       for (i = 0; i < ARRAY_SIZE(board_driver); i++) {
+               struct pvr2_board *pvr_board = board_driver + i;
 
                if (!pvr_board->init)
                        continue;
@@ -1118,13 +1114,13 @@ static void __exit pvr2fb_exit(void)
 {
        int i;
 
-       for (i = 0; i < ARRAY_SIZE(board_list); i++) {
-               struct pvr2_board *pvr_board = board_list + i;
+       for (i = 0; i < ARRAY_SIZE(board_driver); i++) {
+               struct pvr2_board *pvr_board = board_driver + i;
 
                if (pvr_board->exit)
                        pvr_board->exit();
        }
-               
+
 #ifdef CONFIG_SH_STORE_QUEUES
        sq_unmap(pvr2fb_map);
 #endif
@@ -1139,4 +1135,3 @@ module_exit(pvr2fb_exit);
 MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>, M. R. Brown <mrbrown@0xd6.org>");
 MODULE_DESCRIPTION("Framebuffer driver for NEC PowerVR 2 based graphics boards");
 MODULE_LICENSE("GPL");
-
index ca75b3ad3a2ebd6f64ae48fc7d476c7ec98f86ec..6854fd6b9714a2a03752f70becce39d4780f6147 100644 (file)
@@ -1,8 +1,6 @@
-menu "Dallas's 1-wire bus"
-       depends on HAS_IOMEM
-
-config W1
+menuconfig W1
        tristate "Dallas's 1-wire support"
+       depends on HAS_IOMEM
        ---help---
          Dallas' 1-wire bus is useful to connect slow 1-pin devices
          such as iButtons and thermal sensors.
@@ -12,8 +10,10 @@ config W1
          This W1 support can also be built as a module.  If so, the module
          will be called wire.ko.
 
+if W1
+
 config W1_CON
-       depends on CONNECTOR && W1
+       depends on CONNECTOR
        bool "Userspace communication over connector"
        default y
        --- help ---
@@ -27,4 +27,4 @@ config W1_CON
 source drivers/w1/masters/Kconfig
 source drivers/w1/slaves/Kconfig
 
-endmenu
+endif # W1
index 8f779338f744a55f91ac6ebb23f27b0b515f97f5..8236d447adf5f90ecbf054bc5fa9f54a6ada8137 100644 (file)
@@ -3,11 +3,10 @@
 #
 
 menu "1-wire Bus Masters"
-       depends on W1
 
 config W1_MASTER_MATROX
        tristate "Matrox G400 transport layer for 1-wire"
-       depends on W1 && PCI
+       depends on PCI
        help
          Say Y here if you want to communicate with your 1-wire devices
          using Matrox's G400 GPIO pins.
@@ -17,7 +16,7 @@ config W1_MASTER_MATROX
 
 config W1_MASTER_DS2490
        tristate "DS2490 USB <-> W1 transport layer for 1-wire"
-       depends on W1 && USB
+       depends on USB
        help
          Say Y here if you want to have a driver for DS2490 based USB <-> W1 bridges,
          for example DS9490*.
@@ -27,7 +26,7 @@ config W1_MASTER_DS2490
 
 config W1_MASTER_DS2482
        tristate "Maxim DS2482 I2C to 1-Wire bridge"
-       depends on I2C && W1 && EXPERIMENTAL
+       depends on I2C && EXPERIMENTAL
        help
          If you say yes here you get support for the Maxim DS2482
          I2C to 1-Wire bridge.
index df95d6c2cefa01124b1513d2b5a07514cfb21c48..3df29a122f84c559d6ca1dcc104725028f18a9a7 100644 (file)
@@ -3,25 +3,21 @@
 #
 
 menu "1-wire Slaves"
-       depends on W1
 
 config W1_SLAVE_THERM
        tristate "Thermal family implementation"
-       depends on W1
        help
          Say Y here if you want to connect 1-wire thermal sensors to your
          wire.
 
 config W1_SLAVE_SMEM
        tristate "Simple 64bit memory family implementation"
-       depends on W1
        help
          Say Y here if you want to connect 1-wire
          simple 64bit memory rom(ds2401/ds2411/ds1990*) to your wire.
 
 config W1_SLAVE_DS2433
        tristate "4kb EEPROM family support (DS2433)"
-       depends on W1
        help
          Say Y here if you want to use a 1-wire
          4kb EEPROM family device (DS2433).
index 94b9d861bf9b6f75b6869085ef36e0f4068767d9..ee11f8d94085eae4ef65fe005f8cdba2d264b658 100644 (file)
@@ -991,7 +991,7 @@ config TMPFS_POSIX_ACL
 
 config HUGETLBFS
        bool "HugeTLB file system support"
-       depends on X86 || IA64 || PPC64 || SPARC64 || SUPERH || BROKEN
+       depends on X86 || IA64 || PPC64 || SPARC64 || (SUPERH && MMU) || BROKEN
        help
          hugetlbfs is a filesystem backing for HugeTLB pages, based on
          ramfs. For architectures that support it, say Y here and read
index 73ce561f3ea0c2ea5cd901156a0c3cbf730ed200..a66671082cfbb98d37277e73e3255c70d8415946 100644 (file)
@@ -8,6 +8,7 @@ kafs-objs := \
        cmservice.o \
        dir.o \
        file.o \
+       flock.o \
        fsclient.o \
        inode.o \
        main.o \
index 2452579481404fe702aa852b39ab404254773c5b..c548aa346f0dd6f9a7aed6664abb32bcbb6ddd79 100644 (file)
@@ -37,6 +37,13 @@ typedef enum {
        AFS_FTYPE_SYMLINK       = 3,
 } afs_file_type_t;
 
+typedef enum {
+       AFS_LOCK_READ           = 0,    /* read lock request */
+       AFS_LOCK_WRITE          = 1,    /* write lock request */
+} afs_lock_type_t;
+
+#define AFS_LOCKWAIT           (5 * 60) /* time until a lock times out (seconds) */
+
 /*
  * AFS file identifier
  */
@@ -120,6 +127,7 @@ struct afs_file_status {
        struct afs_fid          parent;         /* parent dir ID for non-dirs only */
        time_t                  mtime_client;   /* last time client changed data */
        time_t                  mtime_server;   /* last time server changed data */
+       s32                     lock_count;     /* file lock count (0=UNLK -1=WRLCK +ve=#RDLCK */
 };
 
 /*
index a18c374ebe080d9cbbc9544bd2e4dbdbf42ec62a..eb647323d8f03a3f6634d4f83d0aa648f9093201 100644 (file)
@@ -31,6 +31,9 @@ enum AFS_FS_Operations {
        FSGETVOLUMEINFO         = 148,  /* AFS Get information about a volume */
        FSGETVOLUMESTATUS       = 149,  /* AFS Get volume status information */
        FSGETROOTVOLUME         = 151,  /* AFS Get root volume name */
+       FSSETLOCK               = 156,  /* AFS Request a file lock */
+       FSEXTENDLOCK            = 157,  /* AFS Extend a file lock */
+       FSRELEASELOCK           = 158,  /* AFS Release a file lock */
        FSLOOKUP                = 161,  /* AFS lookup file in directory */
        FSFETCHDATA64           = 65537, /* AFS Fetch file data */
        FSSTOREDATA64           = 65538, /* AFS Store file data */
index bacf518c6fa80d891f24e1168a82abf1a48d2d62..b8243945818de3abd394435953acb8ed8e88eeef 100644 (file)
@@ -125,6 +125,9 @@ static void afs_break_callback(struct afs_server *server,
                spin_unlock(&server->cb_lock);
 
                queue_work(afs_callback_update_worker, &vnode->cb_broken_work);
+               if (list_empty(&vnode->granted_locks) &&
+                   !list_empty(&vnode->pending_locks))
+                       afs_lock_may_be_available(vnode);
                spin_unlock(&vnode->lock);
        }
 }
index 546c59522eb16e0307070102df305cc05766f419..33fe39ad4e0327a91e925c10ad54629c5f7c763a 100644 (file)
@@ -44,6 +44,7 @@ const struct file_operations afs_dir_file_operations = {
        .open           = afs_dir_open,
        .release        = afs_release,
        .readdir        = afs_readdir,
+       .lock           = afs_lock,
 };
 
 const struct inode_operations afs_dir_inode_operations = {
index aede7eb66dd4f970a74021b41487a5a0a70c0616..525f7c56e068d877e95dedea3a15dafc116fdb41 100644 (file)
@@ -34,6 +34,8 @@ const struct file_operations afs_file_operations = {
        .mmap           = generic_file_readonly_mmap,
        .splice_read    = generic_file_splice_read,
        .fsync          = afs_fsync,
+       .lock           = afs_lock,
+       .flock          = afs_flock,
 };
 
 const struct inode_operations afs_file_inode_operations = {
diff --git a/fs/afs/flock.c b/fs/afs/flock.c
new file mode 100644 (file)
index 0000000..8f07f8d
--- /dev/null
@@ -0,0 +1,558 @@
+/* AFS file locking support
+ *
+ * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include <linux/smp_lock.h>
+#include "internal.h"
+
+#define AFS_LOCK_GRANTED       0
+#define AFS_LOCK_PENDING       1
+
+static void afs_fl_copy_lock(struct file_lock *new, struct file_lock *fl);
+static void afs_fl_release_private(struct file_lock *fl);
+
+static struct workqueue_struct *afs_lock_manager;
+
+static struct file_lock_operations afs_lock_ops = {
+       .fl_copy_lock           = afs_fl_copy_lock,
+       .fl_release_private     = afs_fl_release_private,
+};
+
+/*
+ * initialise the lock manager thread if it isn't already running
+ */
+static int afs_init_lock_manager(void)
+{
+       if (!afs_lock_manager) {
+               afs_lock_manager = create_singlethread_workqueue("kafs_lockd");
+               if (!afs_lock_manager)
+                       return -ENOMEM;
+       }
+       return 0;
+}
+
+/*
+ * destroy the lock manager thread if it's running
+ */
+void __exit afs_kill_lock_manager(void)
+{
+       if (afs_lock_manager)
+               destroy_workqueue(afs_lock_manager);
+}
+
+/*
+ * if the callback is broken on this vnode, then the lock may now be available
+ */
+void afs_lock_may_be_available(struct afs_vnode *vnode)
+{
+       _enter("{%x:%u}", vnode->fid.vid, vnode->fid.vnode);
+
+       queue_delayed_work(afs_lock_manager, &vnode->lock_work, 0);
+}
+
+/*
+ * the lock will time out in 5 minutes unless we extend it, so schedule
+ * extension in a bit less than that time
+ */
+static void afs_schedule_lock_extension(struct afs_vnode *vnode)
+{
+       queue_delayed_work(afs_lock_manager, &vnode->lock_work,
+                          AFS_LOCKWAIT * HZ / 2);
+}
+
+/*
+ * do work for a lock, including:
+ * - probing for a lock we're waiting on but didn't get immediately
+ * - extending a lock that's close to timing out
+ */
+void afs_lock_work(struct work_struct *work)
+{
+       struct afs_vnode *vnode =
+               container_of(work, struct afs_vnode, lock_work.work);
+       struct file_lock *fl;
+       afs_lock_type_t type;
+       struct key *key;
+       int ret;
+
+       _enter("{%x:%u}", vnode->fid.vid, vnode->fid.vnode);
+
+       spin_lock(&vnode->lock);
+
+       if (test_bit(AFS_VNODE_UNLOCKING, &vnode->flags)) {
+               _debug("unlock");
+               spin_unlock(&vnode->lock);
+
+               /* attempt to release the server lock; if it fails, we just
+                * wait 5 minutes and it'll time out anyway */
+               ret = afs_vnode_release_lock(vnode, vnode->unlock_key);
+               if (ret < 0)
+                       printk(KERN_WARNING "AFS:"
+                              " Failed to release lock on {%x:%x} error %d\n",
+                              vnode->fid.vid, vnode->fid.vnode, ret);
+
+               spin_lock(&vnode->lock);
+               key_put(vnode->unlock_key);
+               vnode->unlock_key = NULL;
+               clear_bit(AFS_VNODE_UNLOCKING, &vnode->flags);
+       }
+
+       /* if we've got a lock, then it must be time to extend that lock as AFS
+        * locks time out after 5 minutes */
+       if (!list_empty(&vnode->granted_locks)) {
+               _debug("extend");
+
+               if (test_and_set_bit(AFS_VNODE_LOCKING, &vnode->flags))
+                       BUG();
+               fl = list_entry(vnode->granted_locks.next,
+                               struct file_lock, fl_u.afs.link);
+               key = key_get(fl->fl_file->private_data);
+               spin_unlock(&vnode->lock);
+
+               ret = afs_vnode_extend_lock(vnode, key);
+               clear_bit(AFS_VNODE_LOCKING, &vnode->flags);
+               key_put(key);
+               switch (ret) {
+               case 0:
+                       afs_schedule_lock_extension(vnode);
+                       break;
+               default:
+                       /* ummm... we failed to extend the lock - retry
+                        * extension shortly */
+                       printk(KERN_WARNING "AFS:"
+                              " Failed to extend lock on {%x:%x} error %d\n",
+                              vnode->fid.vid, vnode->fid.vnode, ret);
+                       queue_delayed_work(afs_lock_manager, &vnode->lock_work,
+                                          HZ * 10);
+                       break;
+               }
+               _leave(" [extend]");
+               return;
+       }
+
+       /* if we don't have a granted lock, then we must've been called back by
+        * the server, and so if might be possible to get a lock we're
+        * currently waiting for */
+       if (!list_empty(&vnode->pending_locks)) {
+               _debug("get");
+
+               if (test_and_set_bit(AFS_VNODE_LOCKING, &vnode->flags))
+                       BUG();
+               fl = list_entry(vnode->pending_locks.next,
+                               struct file_lock, fl_u.afs.link);
+               key = key_get(fl->fl_file->private_data);
+               type = (fl->fl_type == F_RDLCK) ?
+                       AFS_LOCK_READ : AFS_LOCK_WRITE;
+               spin_unlock(&vnode->lock);
+
+               ret = afs_vnode_set_lock(vnode, key, type);
+               clear_bit(AFS_VNODE_LOCKING, &vnode->flags);
+               switch (ret) {
+               case -EWOULDBLOCK:
+                       _debug("blocked");
+                       break;
+               case 0:
+                       _debug("acquired");
+                       if (type == AFS_LOCK_READ)
+                               set_bit(AFS_VNODE_READLOCKED, &vnode->flags);
+                       else
+                               set_bit(AFS_VNODE_WRITELOCKED, &vnode->flags);
+                       ret = AFS_LOCK_GRANTED;
+               default:
+                       spin_lock(&vnode->lock);
+                       /* the pending lock may have been withdrawn due to a
+                        * signal */
+                       if (list_entry(vnode->pending_locks.next,
+                                      struct file_lock, fl_u.afs.link) == fl) {
+                               fl->fl_u.afs.state = ret;
+                               if (ret == AFS_LOCK_GRANTED)
+                                       list_move_tail(&fl->fl_u.afs.link,
+                                                      &vnode->granted_locks);
+                               else
+                                       list_del_init(&fl->fl_u.afs.link);
+                               wake_up(&fl->fl_wait);
+                               spin_unlock(&vnode->lock);
+                       } else {
+                               _debug("withdrawn");
+                               clear_bit(AFS_VNODE_READLOCKED, &vnode->flags);
+                               clear_bit(AFS_VNODE_WRITELOCKED, &vnode->flags);
+                               spin_unlock(&vnode->lock);
+                               afs_vnode_release_lock(vnode, key);
+                               if (!list_empty(&vnode->pending_locks))
+                                       afs_lock_may_be_available(vnode);
+                       }
+                       break;
+               }
+               key_put(key);
+               _leave(" [pend]");
+               return;
+       }
+
+       /* looks like the lock request was withdrawn on a signal */
+       spin_unlock(&vnode->lock);
+       _leave(" [no locks]");
+}
+
+/*
+ * pass responsibility for the unlocking of a vnode on the server to the
+ * manager thread, lest a pending signal in the calling thread interrupt
+ * AF_RXRPC
+ * - the caller must hold the vnode lock
+ */
+static void afs_defer_unlock(struct afs_vnode *vnode, struct key *key)
+{
+       cancel_delayed_work(&vnode->lock_work);
+       if (!test_and_clear_bit(AFS_VNODE_READLOCKED, &vnode->flags) &&
+           !test_and_clear_bit(AFS_VNODE_WRITELOCKED, &vnode->flags))
+               BUG();
+       if (test_and_set_bit(AFS_VNODE_UNLOCKING, &vnode->flags))
+               BUG();
+       vnode->unlock_key = key_get(key);
+       afs_lock_may_be_available(vnode);
+}
+
+/*
+ * request a lock on a file on the server
+ */
+static int afs_do_setlk(struct file *file, struct file_lock *fl)
+{
+       struct afs_vnode *vnode = AFS_FS_I(file->f_mapping->host);
+       afs_lock_type_t type;
+       struct key *key = file->private_data;
+       int ret;
+
+       _enter("{%x:%u},%u", vnode->fid.vid, vnode->fid.vnode, fl->fl_type);
+
+       /* only whole-file locks are supported */
+       if (fl->fl_start != 0 || fl->fl_end != OFFSET_MAX)
+               return -EINVAL;
+
+       ret = afs_init_lock_manager();
+       if (ret < 0)
+               return ret;
+
+       fl->fl_ops = &afs_lock_ops;
+       INIT_LIST_HEAD(&fl->fl_u.afs.link);
+       fl->fl_u.afs.state = AFS_LOCK_PENDING;
+
+       type = (fl->fl_type == F_RDLCK) ? AFS_LOCK_READ : AFS_LOCK_WRITE;
+
+       lock_kernel();
+
+       /* make sure we've got a callback on this file and that our view of the
+        * data version is up to date */
+       ret = afs_vnode_fetch_status(vnode, NULL, key);
+       if (ret < 0)
+               goto error;
+
+       if (vnode->status.lock_count != 0 && !(fl->fl_flags & FL_SLEEP)) {
+               ret = -EAGAIN;
+               goto error;
+       }
+
+       spin_lock(&vnode->lock);
+
+       if (list_empty(&vnode->pending_locks)) {
+               /* if there's no-one else with a lock on this vnode, then we
+                * need to ask the server for a lock */
+               if (list_empty(&vnode->granted_locks)) {
+                       _debug("not locked");
+                       ASSERTCMP(vnode->flags &
+                                 ((1 << AFS_VNODE_LOCKING) |
+                                  (1 << AFS_VNODE_READLOCKED) |
+                                  (1 << AFS_VNODE_WRITELOCKED)), ==, 0);
+                       list_add_tail(&fl->fl_u.afs.link, &vnode->pending_locks);
+                       set_bit(AFS_VNODE_LOCKING, &vnode->flags);
+                       spin_unlock(&vnode->lock);
+
+                       ret = afs_vnode_set_lock(vnode, key, type);
+                       clear_bit(AFS_VNODE_LOCKING, &vnode->flags);
+                       switch (ret) {
+                       case 0:
+                               goto acquired_server_lock;
+                       case -EWOULDBLOCK:
+                               spin_lock(&vnode->lock);
+                               ASSERT(list_empty(&vnode->granted_locks));
+                               ASSERTCMP(vnode->pending_locks.next, ==,
+                                         &fl->fl_u.afs.link);
+                               goto wait;
+                       default:
+                               spin_lock(&vnode->lock);
+                               list_del_init(&fl->fl_u.afs.link);
+                               spin_unlock(&vnode->lock);
+                               goto error;
+                       }
+               }
+
+               /* if we've already got a readlock on the server and no waiting
+                * writelocks, then we might be able to instantly grant another
+                * readlock */
+               if (type == AFS_LOCK_READ &&
+                   vnode->flags & (1 << AFS_VNODE_READLOCKED)) {
+                       _debug("instant readlock");
+                       ASSERTCMP(vnode->flags &
+                                 ((1 << AFS_VNODE_LOCKING) |
+                                  (1 << AFS_VNODE_WRITELOCKED)), ==, 0);
+                       ASSERT(!list_empty(&vnode->granted_locks));
+                       goto sharing_existing_lock;
+               }
+       }
+
+       /* otherwise, we need to wait for a local lock to become available */
+       _debug("wait local");
+       list_add_tail(&fl->fl_u.afs.link, &vnode->pending_locks);
+wait:
+       if (!(fl->fl_flags & FL_SLEEP)) {
+               _debug("noblock");
+               ret = -EAGAIN;
+               goto abort_attempt;
+       }
+       spin_unlock(&vnode->lock);
+
+       /* now we need to sleep and wait for the lock manager thread to get the
+        * lock from the server */
+       _debug("sleep");
+       ret = wait_event_interruptible(fl->fl_wait,
+                                      fl->fl_u.afs.state <= AFS_LOCK_GRANTED);
+       if (fl->fl_u.afs.state <= AFS_LOCK_GRANTED) {
+               ret = fl->fl_u.afs.state;
+               if (ret < 0)
+                       goto error;
+               spin_lock(&vnode->lock);
+               goto given_lock;
+       }
+
+       /* we were interrupted, but someone may still be in the throes of
+        * giving us the lock */
+       _debug("intr");
+       ASSERTCMP(ret, ==, -ERESTARTSYS);
+
+       spin_lock(&vnode->lock);
+       if (fl->fl_u.afs.state <= AFS_LOCK_GRANTED) {
+               ret = fl->fl_u.afs.state;
+               if (ret < 0) {
+                       spin_unlock(&vnode->lock);
+                       goto error;
+               }
+               goto given_lock;
+       }
+
+abort_attempt:
+       /* we aren't going to get the lock, either because we're unwilling to
+        * wait, or because some signal happened */
+       _debug("abort");
+       if (list_empty(&vnode->granted_locks) &&
+           vnode->pending_locks.next == &fl->fl_u.afs.link) {
+               if (vnode->pending_locks.prev != &fl->fl_u.afs.link) {
+                       /* kick the next pending lock into having a go */
+                       list_del_init(&fl->fl_u.afs.link);
+                       afs_lock_may_be_available(vnode);
+               }
+       } else {
+               list_del_init(&fl->fl_u.afs.link);
+       }
+       spin_unlock(&vnode->lock);
+       goto error;
+
+acquired_server_lock:
+       /* we've acquired a server lock, but it needs to be renewed after 5
+        * mins */
+       spin_lock(&vnode->lock);
+       afs_schedule_lock_extension(vnode);
+       if (type == AFS_LOCK_READ)
+               set_bit(AFS_VNODE_READLOCKED, &vnode->flags);
+       else
+               set_bit(AFS_VNODE_WRITELOCKED, &vnode->flags);
+sharing_existing_lock:
+       /* the lock has been granted as far as we're concerned... */
+       fl->fl_u.afs.state = AFS_LOCK_GRANTED;
+       list_move_tail(&fl->fl_u.afs.link, &vnode->granted_locks);
+given_lock:
+       /* ... but we do still need to get the VFS's blessing */
+       ASSERT(!(vnode->flags & (1 << AFS_VNODE_LOCKING)));
+       ASSERT((vnode->flags & ((1 << AFS_VNODE_READLOCKED) |
+                               (1 << AFS_VNODE_WRITELOCKED))) != 0);
+       ret = posix_lock_file(file, fl, NULL);
+       if (ret < 0)
+               goto vfs_rejected_lock;
+       spin_unlock(&vnode->lock);
+
+       /* again, make sure we've got a callback on this file and, again, make
+        * sure that our view of the data version is up to date (we ignore
+        * errors incurred here and deal with the consequences elsewhere) */
+       afs_vnode_fetch_status(vnode, NULL, key);
+
+error:
+       unlock_kernel();
+       _leave(" = %d", ret);
+       return ret;
+
+vfs_rejected_lock:
+       /* the VFS rejected the lock we just obtained, so we have to discard
+        * what we just got */
+       _debug("vfs refused %d", ret);
+       list_del_init(&fl->fl_u.afs.link);
+       if (list_empty(&vnode->granted_locks))
+               afs_defer_unlock(vnode, key);
+       spin_unlock(&vnode->lock);
+       goto abort_attempt;
+}
+
+/*
+ * unlock on a file on the server
+ */
+static int afs_do_unlk(struct file *file, struct file_lock *fl)
+{
+       struct afs_vnode *vnode = AFS_FS_I(file->f_mapping->host);
+       struct key *key = file->private_data;
+       int ret;
+
+       _enter("{%x:%u},%u", vnode->fid.vid, vnode->fid.vnode, fl->fl_type);
+
+       /* only whole-file unlocks are supported */
+       if (fl->fl_start != 0 || fl->fl_end != OFFSET_MAX)
+               return -EINVAL;
+
+       fl->fl_ops = &afs_lock_ops;
+       INIT_LIST_HEAD(&fl->fl_u.afs.link);
+       fl->fl_u.afs.state = AFS_LOCK_PENDING;
+
+       spin_lock(&vnode->lock);
+       ret = posix_lock_file(file, fl, NULL);
+       if (ret < 0) {
+               spin_unlock(&vnode->lock);
+               _leave(" = %d [vfs]", ret);
+               return ret;
+       }
+
+       /* discard the server lock only if all granted locks are gone */
+       if (list_empty(&vnode->granted_locks))
+               afs_defer_unlock(vnode, key);
+       spin_unlock(&vnode->lock);
+       _leave(" = 0");
+       return 0;
+}
+
+/*
+ * return information about a lock we currently hold, if indeed we hold one
+ */
+static int afs_do_getlk(struct file *file, struct file_lock *fl)
+{
+       struct afs_vnode *vnode = AFS_FS_I(file->f_mapping->host);
+       struct key *key = file->private_data;
+       int ret, lock_count;
+
+       _enter("");
+
+       fl->fl_type = F_UNLCK;
+
+       mutex_lock(&vnode->vfs_inode.i_mutex);
+
+       /* check local lock records first */
+       ret = 0;
+       if (posix_test_lock(file, fl) == 0) {
+               /* no local locks; consult the server */
+               ret = afs_vnode_fetch_status(vnode, NULL, key);
+               if (ret < 0)
+                       goto error;
+               lock_count = vnode->status.lock_count;
+               if (lock_count) {
+                       if (lock_count > 0)
+                               fl->fl_type = F_RDLCK;
+                       else
+                               fl->fl_type = F_WRLCK;
+                       fl->fl_start = 0;
+                       fl->fl_end = OFFSET_MAX;
+               }
+       }
+
+error:
+       mutex_unlock(&vnode->vfs_inode.i_mutex);
+       _leave(" = %d [%hd]", ret, fl->fl_type);
+       return ret;
+}
+
+/*
+ * manage POSIX locks on a file
+ */
+int afs_lock(struct file *file, int cmd, struct file_lock *fl)
+{
+       struct afs_vnode *vnode = AFS_FS_I(file->f_dentry->d_inode);
+
+       _enter("{%x:%u},%d,{t=%x,fl=%x,r=%Ld:%Ld}",
+              vnode->fid.vid, vnode->fid.vnode, cmd,
+              fl->fl_type, fl->fl_flags,
+              (long long) fl->fl_start, (long long) fl->fl_end);
+
+       /* AFS doesn't support mandatory locks */
+       if ((vnode->vfs_inode.i_mode & (S_ISGID | S_IXGRP)) == S_ISGID &&
+           fl->fl_type != F_UNLCK)
+               return -ENOLCK;
+
+       if (IS_GETLK(cmd))
+               return afs_do_getlk(file, fl);
+       if (fl->fl_type == F_UNLCK)
+               return afs_do_unlk(file, fl);
+       return afs_do_setlk(file, fl);
+}
+
+/*
+ * manage FLOCK locks on a file
+ */
+int afs_flock(struct file *file, int cmd, struct file_lock *fl)
+{
+       struct afs_vnode *vnode = AFS_FS_I(file->f_dentry->d_inode);
+
+       _enter("{%x:%u},%d,{t=%x,fl=%x}",
+              vnode->fid.vid, vnode->fid.vnode, cmd,
+              fl->fl_type, fl->fl_flags);
+
+       /*
+        * No BSD flocks over NFS allowed.
+        * Note: we could try to fake a POSIX lock request here by
+        * using ((u32) filp | 0x80000000) or some such as the pid.
+        * Not sure whether that would be unique, though, or whether
+        * that would break in other places.
+        */
+       if (!(fl->fl_flags & FL_FLOCK))
+               return -ENOLCK;
+
+       /* we're simulating flock() locks using posix locks on the server */
+       fl->fl_owner = (fl_owner_t) file;
+       fl->fl_start = 0;
+       fl->fl_end = OFFSET_MAX;
+
+       if (fl->fl_type == F_UNLCK)
+               return afs_do_unlk(file, fl);
+       return afs_do_setlk(file, fl);
+}
+
+/*
+ * the POSIX lock management core VFS code copies the lock record and adds the
+ * copy into its own list, so we need to add that copy to the vnode's lock
+ * queue in the same place as the original (which will be deleted shortly
+ * after)
+ */
+static void afs_fl_copy_lock(struct file_lock *new, struct file_lock *fl)
+{
+       _enter("");
+
+       list_add(&new->fl_u.afs.link, &fl->fl_u.afs.link);
+}
+
+/*
+ * need to remove this lock from the vnode queue when it's removed from the
+ * VFS's list
+ */
+static void afs_fl_release_private(struct file_lock *fl)
+{
+       _enter("");
+
+       list_del_init(&fl->fl_u.afs.link);
+}
index 5dff1308b6f0da5475a20701063036a78bf21b90..023b95b0d9d7612b41ef895c4a2989513fa6b47a 100644 (file)
@@ -67,7 +67,7 @@ static void xdr_decode_AFSFetchStatus(const __be32 **_bp,
        EXTRACT(status->group);
        bp++; /* sync counter */
        data_version |= (u64) ntohl(*bp++) << 32;
-       bp++; /* lock count */
+       EXTRACT(status->lock_count);
        size |= (u64) ntohl(*bp++) << 32;
        bp++; /* spare 4 */
        *_bp = bp;
@@ -1748,3 +1748,156 @@ int afs_fs_get_volume_status(struct afs_server *server,
 
        return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
 }
+
+/*
+ * deliver reply data to an FS.SetLock, FS.ExtendLock or FS.ReleaseLock
+ */
+static int afs_deliver_fs_xxxx_lock(struct afs_call *call,
+                                   struct sk_buff *skb, bool last)
+{
+       const __be32 *bp;
+
+       _enter("{%u},{%u},%d", call->unmarshall, skb->len, last);
+
+       afs_transfer_reply(call, skb);
+       if (!last)
+               return 0;
+
+       if (call->reply_size != call->reply_max)
+               return -EBADMSG;
+
+       /* unmarshall the reply once we've received all of it */
+       bp = call->buffer;
+       /* xdr_decode_AFSVolSync(&bp, call->replyX); */
+
+       _leave(" = 0 [done]");
+       return 0;
+}
+
+/*
+ * FS.SetLock operation type
+ */
+static const struct afs_call_type afs_RXFSSetLock = {
+       .name           = "FS.SetLock",
+       .deliver        = afs_deliver_fs_xxxx_lock,
+       .abort_to_error = afs_abort_to_error,
+       .destructor     = afs_flat_call_destructor,
+};
+
+/*
+ * FS.ExtendLock operation type
+ */
+static const struct afs_call_type afs_RXFSExtendLock = {
+       .name           = "FS.ExtendLock",
+       .deliver        = afs_deliver_fs_xxxx_lock,
+       .abort_to_error = afs_abort_to_error,
+       .destructor     = afs_flat_call_destructor,
+};
+
+/*
+ * FS.ReleaseLock operation type
+ */
+static const struct afs_call_type afs_RXFSReleaseLock = {
+       .name           = "FS.ReleaseLock",
+       .deliver        = afs_deliver_fs_xxxx_lock,
+       .abort_to_error = afs_abort_to_error,
+       .destructor     = afs_flat_call_destructor,
+};
+
+/*
+ * get a lock on a file
+ */
+int afs_fs_set_lock(struct afs_server *server,
+                   struct key *key,
+                   struct afs_vnode *vnode,
+                   afs_lock_type_t type,
+                   const struct afs_wait_mode *wait_mode)
+{
+       struct afs_call *call;
+       __be32 *bp;
+
+       _enter("");
+
+       call = afs_alloc_flat_call(&afs_RXFSSetLock, 5 * 4, 6 * 4);
+       if (!call)
+               return -ENOMEM;
+
+       call->key = key;
+       call->reply = vnode;
+       call->service_id = FS_SERVICE;
+       call->port = htons(AFS_FS_PORT);
+
+       /* marshall the parameters */
+       bp = call->request;
+       *bp++ = htonl(FSSETLOCK);
+       *bp++ = htonl(vnode->fid.vid);
+       *bp++ = htonl(vnode->fid.vnode);
+       *bp++ = htonl(vnode->fid.unique);
+       *bp++ = htonl(type);
+
+       return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
+}
+
+/*
+ * extend a lock on a file
+ */
+int afs_fs_extend_lock(struct afs_server *server,
+                      struct key *key,
+                      struct afs_vnode *vnode,
+                      const struct afs_wait_mode *wait_mode)
+{
+       struct afs_call *call;
+       __be32 *bp;
+
+       _enter("");
+
+       call = afs_alloc_flat_call(&afs_RXFSExtendLock, 4 * 4, 6 * 4);
+       if (!call)
+               return -ENOMEM;
+
+       call->key = key;
+       call->reply = vnode;
+       call->service_id = FS_SERVICE;
+       call->port = htons(AFS_FS_PORT);
+
+       /* marshall the parameters */
+       bp = call->request;
+       *bp++ = htonl(FSEXTENDLOCK);
+       *bp++ = htonl(vnode->fid.vid);
+       *bp++ = htonl(vnode->fid.vnode);
+       *bp++ = htonl(vnode->fid.unique);
+
+       return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
+}
+
+/*
+ * release a lock on a file
+ */
+int afs_fs_release_lock(struct afs_server *server,
+                       struct key *key,
+                       struct afs_vnode *vnode,
+                       const struct afs_wait_mode *wait_mode)
+{
+       struct afs_call *call;
+       __be32 *bp;
+
+       _enter("");
+
+       call = afs_alloc_flat_call(&afs_RXFSReleaseLock, 4 * 4, 6 * 4);
+       if (!call)
+               return -ENOMEM;
+
+       call->key = key;
+       call->reply = vnode;
+       call->service_id = FS_SERVICE;
+       call->port = htons(AFS_FS_PORT);
+
+       /* marshall the parameters */
+       bp = call->request;
+       *bp++ = htonl(FSRELEASELOCK);
+       *bp++ = htonl(vnode->fid.vid);
+       *bp++ = htonl(vnode->fid.vnode);
+       *bp++ = htonl(vnode->fid.unique);
+
+       return afs_make_call(&server->addr, call, GFP_NOFS, wait_mode);
+}
index 2c55dd94a1de573c9e4169a3cbb3c993dc6422b9..6306438f331f7b14451366dbbb04182d9dae5cc5 100644 (file)
@@ -351,10 +351,18 @@ struct afs_vnode {
 #define AFS_VNODE_ZAP_DATA     3               /* set if vnode's data should be invalidated */
 #define AFS_VNODE_DELETED      4               /* set if vnode deleted on server */
 #define AFS_VNODE_MOUNTPOINT   5               /* set if vnode is a mountpoint symlink */
+#define AFS_VNODE_LOCKING      6               /* set if waiting for lock on vnode */
+#define AFS_VNODE_READLOCKED   7               /* set if vnode is read-locked on the server */
+#define AFS_VNODE_WRITELOCKED  8               /* set if vnode is write-locked on the server */
+#define AFS_VNODE_UNLOCKING    9               /* set if vnode is being unlocked on the server */
 
        long                    acl_order;      /* ACL check count (callback break count) */
 
        struct list_head        writebacks;     /* alterations in pagecache that need writing */
+       struct list_head        pending_locks;  /* locks waiting to be granted */
+       struct list_head        granted_locks;  /* locks granted on this file */
+       struct delayed_work     lock_work;      /* work to be done in locking */
+       struct key              *unlock_key;    /* key to be used in unlocking */
 
        /* outstanding callback notification on this file */
        struct rb_node          server_rb;      /* link in server->fs_vnodes */
@@ -473,6 +481,15 @@ extern const struct file_operations afs_file_operations;
 extern int afs_open(struct inode *, struct file *);
 extern int afs_release(struct inode *, struct file *);
 
+/*
+ * flock.c
+ */
+extern void __exit afs_kill_lock_manager(void);
+extern void afs_lock_work(struct work_struct *);
+extern void afs_lock_may_be_available(struct afs_vnode *);
+extern int afs_lock(struct file *, int, struct file_lock *);
+extern int afs_flock(struct file *, int, struct file_lock *);
+
 /*
  * fsclient.c
  */
@@ -513,6 +530,15 @@ extern int afs_fs_get_volume_status(struct afs_server *, struct key *,
                                    struct afs_vnode *,
                                    struct afs_volume_status *,
                                    const struct afs_wait_mode *);
+extern int afs_fs_set_lock(struct afs_server *, struct key *,
+                          struct afs_vnode *, afs_lock_type_t,
+                          const struct afs_wait_mode *);
+extern int afs_fs_extend_lock(struct afs_server *, struct key *,
+                             struct afs_vnode *,
+                             const struct afs_wait_mode *);
+extern int afs_fs_release_lock(struct afs_server *, struct key *,
+                              struct afs_vnode *,
+                              const struct afs_wait_mode *);
 
 /*
  * inode.c
@@ -681,6 +707,10 @@ extern int afs_vnode_store_data(struct afs_writeback *, pgoff_t, pgoff_t,
 extern int afs_vnode_setattr(struct afs_vnode *, struct key *, struct iattr *);
 extern int afs_vnode_get_volume_status(struct afs_vnode *, struct key *,
                                       struct afs_volume_status *);
+extern int afs_vnode_set_lock(struct afs_vnode *, struct key *,
+                             afs_lock_type_t);
+extern int afs_vnode_extend_lock(struct afs_vnode *, struct key *);
+extern int afs_vnode_release_lock(struct afs_vnode *, struct key *);
 
 /*
  * volume.c
index cd21195bbb24bd6dfe260dfa298d578e895d17d4..0f60f6b35769acfda6cd49522a770db006a08758 100644 (file)
@@ -168,6 +168,7 @@ static void __exit afs_exit(void)
        printk(KERN_INFO "kAFS: Red Hat AFS client v0.1 unregistering.\n");
 
        afs_fs_exit();
+       afs_kill_lock_manager();
        afs_close_socket();
        afs_purge_servers();
        afs_callback_update_kill();
index d1a889c4074292b8dbf6d4f251497e681067cd1a..2d33a5f7d218ad75cf26ec973f10e5958fc5a57d 100644 (file)
@@ -35,6 +35,7 @@ int afs_abort_to_error(u32 abort_code)
        case VOVERQUOTA:        return -EDQUOT;
        case VBUSY:             return -EBUSY;
        case VMOVED:            return -ENXIO;
+       case 0x2f6df0a:         return -EWOULDBLOCK;
        case 0x2f6df0c:         return -EACCES;
        case 0x2f6df0f:         return -EBUSY;
        case 0x2f6df10:         return -EEXIST;
index 13df512aea9edf4507b29cbcc06aa5bdd0ee2ef1..6edb56683b9ab496f3834720dbb8cc12817536b7 100644 (file)
@@ -201,23 +201,9 @@ static int afs_proc_cells_open(struct inode *inode, struct file *file)
  */
 static void *afs_proc_cells_start(struct seq_file *m, loff_t *_pos)
 {
-       struct list_head *_p;
-       loff_t pos = *_pos;
-
        /* lock the list against modification */
        down_read(&afs_proc_cells_sem);
-
-       /* allow for the header line */
-       if (!pos)
-               return (void *) 1;
-       pos--;
-
-       /* find the n'th element in the list */
-       list_for_each(_p, &afs_proc_cells)
-               if (!pos--)
-                       break;
-
-       return _p != &afs_proc_cells ? _p : NULL;
+       return seq_list_start_head(&afs_proc_cells, *_pos);
 }
 
 /*
@@ -225,14 +211,7 @@ static void *afs_proc_cells_start(struct seq_file *m, loff_t *_pos)
  */
 static void *afs_proc_cells_next(struct seq_file *p, void *v, loff_t *pos)
 {
-       struct list_head *_p;
-
-       (*pos)++;
-
-       _p = v;
-       _p = v == (void *) 1 ? afs_proc_cells.next : _p->next;
-
-       return _p != &afs_proc_cells ? _p : NULL;
+       return seq_list_next(v, &afs_proc_cells, pos);
 }
 
 /*
@@ -250,7 +229,7 @@ static int afs_proc_cells_show(struct seq_file *m, void *v)
 {
        struct afs_cell *cell = list_entry(v, struct afs_cell, proc_link);
 
-       if (v == (void *) 1) {
+       if (v == &afs_proc_cells) {
                /* display header on line 1 */
                seq_puts(m, "USE NAME\n");
                return 0;
@@ -503,26 +482,13 @@ static int afs_proc_cell_volumes_release(struct inode *inode, struct file *file)
  */
 static void *afs_proc_cell_volumes_start(struct seq_file *m, loff_t *_pos)
 {
-       struct list_head *_p;
        struct afs_cell *cell = m->private;
-       loff_t pos = *_pos;
 
        _enter("cell=%p pos=%Ld", cell, *_pos);
 
        /* lock the list against modification */
        down_read(&cell->vl_sem);
-
-       /* allow for the header line */
-       if (!pos)
-               return (void *) 1;
-       pos--;
-
-       /* find the n'th element in the list */
-       list_for_each(_p, &cell->vl_list)
-               if (!pos--)
-                       break;
-
-       return _p != &cell->vl_list ? _p : NULL;
+       return seq_list_start_head(&cell->vl_list, *_pos);
 }
 
 /*
@@ -531,17 +497,10 @@ static void *afs_proc_cell_volumes_start(struct seq_file *m, loff_t *_pos)
 static void *afs_proc_cell_volumes_next(struct seq_file *p, void *v,
                                        loff_t *_pos)
 {
-       struct list_head *_p;
        struct afs_cell *cell = p->private;
 
        _enter("cell=%p pos=%Ld", cell, *_pos);
-
-       (*_pos)++;
-
-       _p = v;
-       _p = (v == (void *) 1) ? cell->vl_list.next : _p->next;
-
-       return (_p != &cell->vl_list) ? _p : NULL;
+       return seq_list_next(v, &cell->vl_list, _pos);
 }
 
 /*
@@ -569,11 +528,12 @@ const char afs_vlocation_states[][4] = {
  */
 static int afs_proc_cell_volumes_show(struct seq_file *m, void *v)
 {
+       struct afs_cell *cell = m->private;
        struct afs_vlocation *vlocation =
                list_entry(v, struct afs_vlocation, link);
 
        /* display header on line 1 */
-       if (v == (void *) 1) {
+       if (v == &cell->vl_list) {
                seq_puts(m, "USE STT VLID[0]  VLID[1]  VLID[2]  NAME\n");
                return 0;
        }
@@ -734,26 +694,13 @@ static int afs_proc_cell_servers_release(struct inode *inode,
 static void *afs_proc_cell_servers_start(struct seq_file *m, loff_t *_pos)
        __acquires(m->private->servers_lock)
 {
-       struct list_head *_p;
        struct afs_cell *cell = m->private;
-       loff_t pos = *_pos;
 
        _enter("cell=%p pos=%Ld", cell, *_pos);
 
        /* lock the list against modification */
        read_lock(&cell->servers_lock);
-
-       /* allow for the header line */
-       if (!pos)
-               return (void *) 1;
-       pos--;
-
-       /* find the n'th element in the list */
-       list_for_each(_p, &cell->servers)
-               if (!pos--)
-                       break;
-
-       return _p != &cell->servers ? _p : NULL;
+       return seq_list_start_head(&cell->servers, *_pos);
 }
 
 /*
@@ -762,17 +709,10 @@ static void *afs_proc_cell_servers_start(struct seq_file *m, loff_t *_pos)
 static void *afs_proc_cell_servers_next(struct seq_file *p, void *v,
                                        loff_t *_pos)
 {
-       struct list_head *_p;
        struct afs_cell *cell = p->private;
 
        _enter("cell=%p pos=%Ld", cell, *_pos);
-
-       (*_pos)++;
-
-       _p = v;
-       _p = v == (void *) 1 ? cell->servers.next : _p->next;
-
-       return _p != &cell->servers ? _p : NULL;
+       return seq_list_next(v, &cell->servers, _pos);
 }
 
 /*
@@ -791,11 +731,12 @@ static void afs_proc_cell_servers_stop(struct seq_file *p, void *v)
  */
 static int afs_proc_cell_servers_show(struct seq_file *m, void *v)
 {
+       struct afs_cell *cell = m->private;
        struct afs_server *server = list_entry(v, struct afs_server, link);
        char ipaddr[20];
 
        /* display header on line 1 */
-       if (v == (void *) 1) {
+       if (v == &cell->servers) {
                seq_puts(m, "USE ADDR            STATE\n");
                return 0;
        }
index 2e8496ba1205386ed2e5bc959947460688714496..993cdf1cce3a494b40a7df32166813a17756bd4d 100644 (file)
@@ -460,6 +460,9 @@ static void afs_i_init_once(void *_vnode, struct kmem_cache *cachep,
        spin_lock_init(&vnode->writeback_lock);
        spin_lock_init(&vnode->lock);
        INIT_LIST_HEAD(&vnode->writebacks);
+       INIT_LIST_HEAD(&vnode->pending_locks);
+       INIT_LIST_HEAD(&vnode->granted_locks);
+       INIT_DELAYED_WORK(&vnode->lock_work, afs_lock_work);
        INIT_WORK(&vnode->cb_broken_work, afs_broken_callback_work);
 }
 
index 232c55dc245df2dd25a273b24644961394f0fe7b..2f05c4fc2a70ad4a1e74c1712d7ba562be2f33aa 100644 (file)
@@ -561,7 +561,7 @@ no_server:
 /*
  * create a hard link
  */
-extern int afs_vnode_link(struct afs_vnode *dvnode, struct afs_vnode *vnode,
+int afs_vnode_link(struct afs_vnode *dvnode, struct afs_vnode *vnode,
                          struct key *key, const char *name)
 {
        struct afs_server *server;
@@ -887,11 +887,6 @@ int afs_vnode_get_volume_status(struct afs_vnode *vnode, struct key *key,
               vnode->fid.unique,
               key_serial(key));
 
-       /* this op will fetch the status */
-       spin_lock(&vnode->lock);
-       vnode->update_cnt++;
-       spin_unlock(&vnode->lock);
-
        do {
                /* pick a server to query */
                server = afs_volume_pick_fileserver(vnode);
@@ -905,20 +900,127 @@ int afs_vnode_get_volume_status(struct afs_vnode *vnode, struct key *key,
        } while (!afs_volume_release_fileserver(vnode, server, ret));
 
        /* adjust the flags */
-       if (ret == 0) {
-               afs_vnode_finalise_status_update(vnode, server);
+       if (ret == 0)
+               afs_put_server(server);
+
+       _leave(" = %d", ret);
+       return ret;
+
+no_server:
+       return PTR_ERR(server);
+}
+
+/*
+ * get a lock on a file
+ */
+int afs_vnode_set_lock(struct afs_vnode *vnode, struct key *key,
+                      afs_lock_type_t type)
+{
+       struct afs_server *server;
+       int ret;
+
+       _enter("%s{%x:%u.%u},%x,%u",
+              vnode->volume->vlocation->vldb.name,
+              vnode->fid.vid,
+              vnode->fid.vnode,
+              vnode->fid.unique,
+              key_serial(key), type);
+
+       do {
+               /* pick a server to query */
+               server = afs_volume_pick_fileserver(vnode);
+               if (IS_ERR(server))
+                       goto no_server;
+
+               _debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr));
+
+               ret = afs_fs_set_lock(server, key, vnode, type, &afs_sync_call);
+
+       } while (!afs_volume_release_fileserver(vnode, server, ret));
+
+       /* adjust the flags */
+       if (ret == 0)
+               afs_put_server(server);
+
+       _leave(" = %d", ret);
+       return ret;
+
+no_server:
+       return PTR_ERR(server);
+}
+
+/*
+ * extend a lock on a file
+ */
+int afs_vnode_extend_lock(struct afs_vnode *vnode, struct key *key)
+{
+       struct afs_server *server;
+       int ret;
+
+       _enter("%s{%x:%u.%u},%x",
+              vnode->volume->vlocation->vldb.name,
+              vnode->fid.vid,
+              vnode->fid.vnode,
+              vnode->fid.unique,
+              key_serial(key));
+
+       do {
+               /* pick a server to query */
+               server = afs_volume_pick_fileserver(vnode);
+               if (IS_ERR(server))
+                       goto no_server;
+
+               _debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr));
+
+               ret = afs_fs_extend_lock(server, key, vnode, &afs_sync_call);
+
+       } while (!afs_volume_release_fileserver(vnode, server, ret));
+
+       /* adjust the flags */
+       if (ret == 0)
+               afs_put_server(server);
+
+       _leave(" = %d", ret);
+       return ret;
+
+no_server:
+       return PTR_ERR(server);
+}
+
+/*
+ * release a lock on a file
+ */
+int afs_vnode_release_lock(struct afs_vnode *vnode, struct key *key)
+{
+       struct afs_server *server;
+       int ret;
+
+       _enter("%s{%x:%u.%u},%x",
+              vnode->volume->vlocation->vldb.name,
+              vnode->fid.vid,
+              vnode->fid.vnode,
+              vnode->fid.unique,
+              key_serial(key));
+
+       do {
+               /* pick a server to query */
+               server = afs_volume_pick_fileserver(vnode);
+               if (IS_ERR(server))
+                       goto no_server;
+
+               _debug("USING SERVER: %08x\n", ntohl(server->addr.s_addr));
+
+               ret = afs_fs_release_lock(server, key, vnode, &afs_sync_call);
+
+       } while (!afs_volume_release_fileserver(vnode, server, ret));
+
+       /* adjust the flags */
+       if (ret == 0)
                afs_put_server(server);
-       } else {
-               afs_vnode_status_update_failed(vnode, ret);
-       }
 
        _leave(" = %d", ret);
        return ret;
 
 no_server:
-       spin_lock(&vnode->lock);
-       vnode->update_cnt--;
-       ASSERTCMP(vnode->update_cnt, >=, 0);
-       spin_unlock(&vnode->lock);
        return PTR_ERR(server);
 }
index 40fe3a3222e499251abda536332f52a5dea2d884..a260198306c21d589b9bc1bc237c9d6f8833ff14 100644 (file)
@@ -53,7 +53,7 @@ static struct dentry_operations anon_inodefs_dentry_operations = {
 };
 
 /**
- * anon_inode_getfd - creates a new file instance by hooking it up to and
+ * anon_inode_getfd - creates a new file instance by hooking it up to an
  *                    anonymous inode, and a dentry that describe the "class"
  *                    of the file
  *
@@ -66,7 +66,7 @@ static struct dentry_operations anon_inodefs_dentry_operations = {
  *
  * Creates a new file by hooking it on a single inode. This is useful for files
  * that do not need to have a full-fledged inode in order to operate correctly.
- * All the files created with anon_inode_getfd() will share a single inode, by
+ * All the files created with anon_inode_getfd() will share a single inode,
  * hence saving memory and avoiding code duplication for the file/inode/dentry
  * setup.
  */
@@ -141,9 +141,9 @@ err_put_filp:
 }
 
 /*
- * A single inode exist for all anon_inode files. Contrary to pipes,
- * anon_inode inodes has no per-instance data associated, so we can avoid
- * the allocation of multiple of them.
+ * A single inode exists for all anon_inode files. Contrary to pipes,
+ * anon_inode inodes have no associated per-instance data, so we need
+ * only allocate one of them.
  */
 static struct inode *anon_inode_mkinode(void)
 {
index 08e4414b8374619bbf0d709893aece81877063a8..a27e42bf340030402e5905b4830e959906e875ab 100644 (file)
@@ -45,7 +45,7 @@
 
 static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs);
 static int load_elf_library(struct file *);
-static unsigned long elf_map (struct file *, unsigned long, struct elf_phdr *, int, int);
+static unsigned long elf_map (struct file *, unsigned long, struct elf_phdr *, int, int, unsigned long);
 
 /*
  * If we don't support core dumping, then supply a NULL so we
@@ -80,7 +80,7 @@ static struct linux_binfmt elf_format = {
                .hasvdso        = 1
 };
 
-#define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE)
+#define BAD_ADDR(x) IS_ERR_VALUE(x)
 
 static int set_brk(unsigned long start, unsigned long end)
 {
@@ -285,33 +285,70 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
 #ifndef elf_map
 
 static unsigned long elf_map(struct file *filep, unsigned long addr,
-               struct elf_phdr *eppnt, int prot, int type)
+               struct elf_phdr *eppnt, int prot, int type,
+               unsigned long total_size)
 {
        unsigned long map_addr;
-       unsigned long pageoffset = ELF_PAGEOFFSET(eppnt->p_vaddr);
+       unsigned long size = eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr);
+       unsigned long off = eppnt->p_offset - ELF_PAGEOFFSET(eppnt->p_vaddr);
+       addr = ELF_PAGESTART(addr);
+       size = ELF_PAGEALIGN(size);
 
-       down_write(&current->mm->mmap_sem);
        /* mmap() will return -EINVAL if given a zero size, but a
         * segment with zero filesize is perfectly valid */
-       if (eppnt->p_filesz + pageoffset)
-               map_addr = do_mmap(filep, ELF_PAGESTART(addr),
-                                  eppnt->p_filesz + pageoffset, prot, type,
-                                  eppnt->p_offset - pageoffset);
-       else
-               map_addr = ELF_PAGESTART(addr);
+       if (!size)
+               return addr;
+
+       down_write(&current->mm->mmap_sem);
+       /*
+       * total_size is the size of the ELF (interpreter) image.
+       * The _first_ mmap needs to know the full size, otherwise
+       * randomization might put this image into an overlapping
+       * position with the ELF binary image. (since size < total_size)
+       * So we first map the 'big' image - and unmap the remainder at
+       * the end. (which unmap is needed for ELF images with holes.)
+       */
+       if (total_size) {
+               total_size = ELF_PAGEALIGN(total_size);
+               map_addr = do_mmap(filep, addr, total_size, prot, type, off);
+               if (!BAD_ADDR(map_addr))
+                       do_munmap(current->mm, map_addr+size, total_size-size);
+       } else
+               map_addr = do_mmap(filep, addr, size, prot, type, off);
+
        up_write(&current->mm->mmap_sem);
        return(map_addr);
 }
 
 #endif /* !elf_map */
 
+static unsigned long total_mapping_size(struct elf_phdr *cmds, int nr)
+{
+       int i, first_idx = -1, last_idx = -1;
+
+       for (i = 0; i < nr; i++) {
+               if (cmds[i].p_type == PT_LOAD) {
+                       last_idx = i;
+                       if (first_idx == -1)
+                               first_idx = i;
+               }
+       }
+       if (first_idx == -1)
+               return 0;
+
+       return cmds[last_idx].p_vaddr + cmds[last_idx].p_memsz -
+                               ELF_PAGESTART(cmds[first_idx].p_vaddr);
+}
+
+
 /* This is much more generalized than the library routine read function,
    so we keep this separate.  Technically the library read function
    is only provided so that we can read a.out libraries that have
    an ELF header */
 
 static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
-               struct file *interpreter, unsigned long *interp_load_addr)
+               struct file *interpreter, unsigned long *interp_map_addr,
+               unsigned long no_base)
 {
        struct elf_phdr *elf_phdata;
        struct elf_phdr *eppnt;
@@ -319,6 +356,7 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
        int load_addr_set = 0;
        unsigned long last_bss = 0, elf_bss = 0;
        unsigned long error = ~0UL;
+       unsigned long total_size;
        int retval, i, size;
 
        /* First of all, some simple consistency checks */
@@ -357,6 +395,12 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
                goto out_close;
        }
 
+       total_size = total_mapping_size(elf_phdata, interp_elf_ex->e_phnum);
+       if (!total_size) {
+               error = -EINVAL;
+               goto out_close;
+       }
+
        eppnt = elf_phdata;
        for (i = 0; i < interp_elf_ex->e_phnum; i++, eppnt++) {
                if (eppnt->p_type == PT_LOAD) {
@@ -374,9 +418,14 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
                        vaddr = eppnt->p_vaddr;
                        if (interp_elf_ex->e_type == ET_EXEC || load_addr_set)
                                elf_type |= MAP_FIXED;
+                       else if (no_base && interp_elf_ex->e_type == ET_DYN)
+                               load_addr = -vaddr;
 
                        map_addr = elf_map(interpreter, load_addr + vaddr,
-                                          eppnt, elf_prot, elf_type);
+                                          eppnt, elf_prot, elf_type, total_size);
+                       total_size = 0;
+                       if (!*interp_map_addr)
+                               *interp_map_addr = map_addr;
                        error = map_addr;
                        if (BAD_ADDR(map_addr))
                                goto out_close;
@@ -442,8 +491,7 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
                        goto out_close;
        }
 
-       *interp_load_addr = load_addr;
-       error = ((unsigned long)interp_elf_ex->e_entry) + load_addr;
+       error = load_addr;
 
 out_close:
        kfree(elf_phdata);
@@ -540,7 +588,8 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
        int elf_exec_fileno;
        int retval, i;
        unsigned int size;
-       unsigned long elf_entry, interp_load_addr = 0;
+       unsigned long elf_entry;
+       unsigned long interp_load_addr = 0;
        unsigned long start_code, end_code, start_data, end_data;
        unsigned long reloc_func_desc = 0;
        char passed_fileno[6];
@@ -808,9 +857,7 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
        current->mm->start_stack = bprm->p;
 
        /* Now we do a little grungy work by mmaping the ELF image into
-          the correct location in memory.  At this point, we assume that
-          the image should be loaded at fixed address, not at a variable
-          address. */
+          the correct location in memory. */
        for(i = 0, elf_ppnt = elf_phdata;
            i < loc->elf_ex.e_phnum; i++, elf_ppnt++) {
                int elf_prot = 0, elf_flags;
@@ -864,11 +911,15 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
                         * default mmap base, as well as whatever program they
                         * might try to exec.  This is because the brk will
                         * follow the loader, and is not movable.  */
+#ifdef CONFIG_X86
+                       load_bias = 0;
+#else
                        load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr);
+#endif
                }
 
                error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt,
-                               elf_prot, elf_flags);
+                               elf_prot, elf_flags,0);
                if (BAD_ADDR(error)) {
                        send_sig(SIGKILL, current, 0);
                        retval = IS_ERR((void *)error) ?
@@ -944,13 +995,25 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs)
        }
 
        if (elf_interpreter) {
-               if (interpreter_type == INTERPRETER_AOUT)
+               if (interpreter_type == INTERPRETER_AOUT) {
                        elf_entry = load_aout_interp(&loc->interp_ex,
                                                     interpreter);
-               else
+               } else {
+                       unsigned long uninitialized_var(interp_map_addr);
+
                        elf_entry = load_elf_interp(&loc->interp_elf_ex,
                                                    interpreter,
-                                                   &interp_load_addr);
+                                                   &interp_map_addr,
+                                                   load_bias);
+                       if (!BAD_ADDR(elf_entry)) {
+                               /*
+                                * load_elf_interp() returns relocation
+                                * adjustment
+                                */
+                               interp_load_addr = elf_entry;
+                               elf_entry += loc->interp_elf_ex.e_entry;
+                       }
+               }
                if (BAD_ADDR(elf_entry)) {
                        force_sig(SIGSEGV, current);
                        retval = IS_ERR((void *)elf_entry) ?
index b3e9bfa748cf99971567913492428524aa847e2b..3635315e3b99837c4c324baddb033fc2b212a99c 100644 (file)
@@ -588,12 +588,10 @@ EXPORT_SYMBOL(bdget);
 
 long nr_blockdev_pages(void)
 {
-       struct list_head *p;
+       struct block_device *bdev;
        long ret = 0;
        spin_lock(&bdev_lock);
-       list_for_each(p, &all_bdevs) {
-               struct block_device *bdev;
-               bdev = list_entry(p, struct block_device, bd_list);
+       list_for_each_entry(bdev, &all_bdevs, bd_list) {
                ret += bdev->bd_inode->i_mapping->nrpages;
        }
        spin_unlock(&bdev_lock);
@@ -874,7 +872,7 @@ static struct bd_holder *find_bd_holder(struct block_device *bdev,
  */
 static int add_bd_holder(struct block_device *bdev, struct bd_holder *bo)
 {
-       int ret;
+       int err;
 
        if (!bo)
                return -EINVAL;
@@ -882,15 +880,18 @@ static int add_bd_holder(struct block_device *bdev, struct bd_holder *bo)
        if (!bd_holder_grab_dirs(bdev, bo))
                return -EBUSY;
 
-       ret = add_symlink(bo->sdir, bo->sdev);
-       if (ret == 0) {
-               ret = add_symlink(bo->hdir, bo->hdev);
-               if (ret)
-                       del_symlink(bo->sdir, bo->sdev);
+       err = add_symlink(bo->sdir, bo->sdev);
+       if (err)
+               return err;
+
+       err = add_symlink(bo->hdir, bo->hdev);
+       if (err) {
+               del_symlink(bo->sdir, bo->sdev);
+               return err;
        }
-       if (ret == 0)
-               list_add_tail(&bo->list, &bdev->bd_holder_list);
-       return ret;
+
+       list_add_tail(&bo->list, &bdev->bd_holder_list);
+       return 0;
 }
 
 /**
@@ -948,7 +949,7 @@ static struct bd_holder *del_bd_holder(struct block_device *bdev,
 static int bd_claim_by_kobject(struct block_device *bdev, void *holder,
                                struct kobject *kobj)
 {
-       int res;
+       int err;
        struct bd_holder *bo, *found;
 
        if (!kobj)
@@ -959,21 +960,24 @@ static int bd_claim_by_kobject(struct block_device *bdev, void *holder,
                return -ENOMEM;
 
        mutex_lock(&bdev->bd_mutex);
-       res = bd_claim(bdev, holder);
-       if (res == 0) {
-               found = find_bd_holder(bdev, bo);
-               if (found == NULL) {
-                       res = add_bd_holder(bdev, bo);
-                       if (res)
-                               bd_release(bdev);
-               }
-       }
 
-       if (res || found)
-               free_bd_holder(bo);
-       mutex_unlock(&bdev->bd_mutex);
+       err = bd_claim(bdev, holder);
+       if (err)
+               goto fail;
 
-       return res;
+       found = find_bd_holder(bdev, bo);
+       if (found)
+               goto fail;
+
+       err = add_bd_holder(bdev, bo);
+       if (err)
+               bd_release(bdev);
+       else
+               bo = NULL;
+fail:
+       mutex_unlock(&bdev->bd_mutex);
+       free_bd_holder(bo);
+       return err;
 }
 
 /**
@@ -987,15 +991,12 @@ static int bd_claim_by_kobject(struct block_device *bdev, void *holder,
 static void bd_release_from_kobject(struct block_device *bdev,
                                        struct kobject *kobj)
 {
-       struct bd_holder *bo;
-
        if (!kobj)
                return;
 
        mutex_lock(&bdev->bd_mutex);
        bd_release(bdev);
-       if ((bo = del_bd_holder(bdev, kobj)))
-               free_bd_holder(bo);
+       free_bd_holder(del_bd_holder(bdev, kobj));
        mutex_unlock(&bdev->bd_mutex);
 }
 
index aa68206bd517929ccd1a7f338889ba0575ab4c30..424165b569f80e796db474661b31170b1627a301 100644 (file)
@@ -1026,11 +1026,6 @@ failed:
 /*
  * Create buffers for the specified block device block's page.  If
  * that page was dirty, the buffers are set dirty also.
- *
- * Except that's a bug.  Attaching dirty buffers to a dirty
- * blockdev's page can result in filesystem corruption, because
- * some of those buffers may be aliases of filesystem data.
- * grow_dev_page() will go BUG() if this happens.
  */
 static int
 grow_buffers(struct block_device *bdev, sector_t block, int size)
index 6b44cdc96facd51030d8798f68e3cf68aecc0d4e..e440a7b95d0275769f5f89124c69c39259785c2f 100644 (file)
@@ -63,6 +63,7 @@
 #include <linux/wireless.h>
 #include <linux/atalk.h>
 #include <linux/blktrace_api.h>
+#include <linux/loop.h>
 
 #include <net/bluetooth/bluetooth.h>
 #include <net/bluetooth/hci.h>
@@ -3489,6 +3490,9 @@ HANDLE_IOCTL(LPSETTIMEOUT, lp_timeout_trans)
 
 IGNORE_IOCTL(VFAT_IOCTL_READDIR_BOTH32)
 IGNORE_IOCTL(VFAT_IOCTL_READDIR_SHORT32)
+
+/* loop */
+IGNORE_IOCTL(LOOP_CLR_FD)
 };
 
 #define IOCTL_HASHSIZE 256
index 03ea7696fe39435183b1b7a32770857fd39915c3..59375efcf39d6769d94a6d77ef33a06054e4f4b9 100644 (file)
@@ -20,7 +20,7 @@ static void drop_pagecache_sb(struct super_block *sb)
        list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
                if (inode->i_state & (I_FREEING|I_WILL_FREE))
                        continue;
-               invalidate_mapping_pages(inode->i_mapping, 0, -1);
+               __invalidate_mapping_pages(inode->i_mapping, 0, -1, true);
        }
        spin_unlock(&inode_lock);
 }
index 04afeecaaef31acde466b50f48ea6057ac3f98a9..ab7961260c49d9071444d9e28cf6dd619b5058df 100644 (file)
@@ -24,9 +24,9 @@
 #include "acl.h"
 
 /*
- * Called when an inode is released. Note that this is different
- * from ext2_open_file: open gets called at every open, but release
- * gets called only when /all/ the files are closed.
+ * Called when filp is released. This happens when all file descriptors
+ * for a single struct file are closed. Note that different open() calls
+ * for the same file yield different struct file structures.
  */
 static int ext2_release_file (struct inode * inode, struct file * filp)
 {
index 5de5061eb331c811c9ed0c9baab5f75655c7ae99..b2efd9083b9bbe5c7c598a07f3b235208f22c511 100644 (file)
@@ -1099,15 +1099,18 @@ static int ext2_statfs (struct dentry * dentry, struct kstatfs * buf)
        struct super_block *sb = dentry->d_sb;
        struct ext2_sb_info *sbi = EXT2_SB(sb);
        struct ext2_super_block *es = sbi->s_es;
-       unsigned long overhead;
-       int i;
        u64 fsid;
 
        if (test_opt (sb, MINIX_DF))
-               overhead = 0;
-       else {
+               sbi->s_overhead_last = 0;
+       else if (sbi->s_blocks_last != le32_to_cpu(es->s_blocks_count)) {
+               unsigned long i, overhead = 0;
+               smp_rmb();
+
                /*
-                * Compute the overhead (FS structures)
+                * Compute the overhead (FS structures). This is constant
+                * for a given filesystem unless the number of block groups
+                * changes so we cache the previous value until it does.
                 */
 
                /*
@@ -1131,17 +1134,22 @@ static int ext2_statfs (struct dentry * dentry, struct kstatfs * buf)
                 */
                overhead += (sbi->s_groups_count *
                             (2 + sbi->s_itb_per_group));
+               sbi->s_overhead_last = overhead;
+               smp_wmb();
+               sbi->s_blocks_last = le32_to_cpu(es->s_blocks_count);
        }
 
        buf->f_type = EXT2_SUPER_MAGIC;
        buf->f_bsize = sb->s_blocksize;
-       buf->f_blocks = le32_to_cpu(es->s_blocks_count) - overhead;
+       buf->f_blocks = le32_to_cpu(es->s_blocks_count) - sbi->s_overhead_last;
        buf->f_bfree = ext2_count_free_blocks(sb);
+       es->s_free_blocks_count = cpu_to_le32(buf->f_bfree);
        buf->f_bavail = buf->f_bfree - le32_to_cpu(es->s_r_blocks_count);
        if (buf->f_bfree < le32_to_cpu(es->s_r_blocks_count))
                buf->f_bavail = 0;
        buf->f_files = le32_to_cpu(es->s_inodes_count);
        buf->f_ffree = ext2_count_free_inodes(sb);
+       es->s_free_inodes_count = cpu_to_le32(buf->f_ffree);
        buf->f_namelen = EXT2_NAME_LEN;
        fsid = le64_to_cpup((void *)es->s_uuid) ^
               le64_to_cpup((void *)es->s_uuid + sizeof(u64));
index 2a85ddee4740b1d0bf292ca71cc80c5ee2b3b71e..de4e3161e4799741b8471f699d2e38d6ddfde755 100644 (file)
@@ -3195,7 +3195,7 @@ int ext3_change_inode_journal_flag(struct inode *inode, int val)
         */
 
        journal = EXT3_JOURNAL(inode);
-       if (is_journal_aborted(journal) || IS_RDONLY(inode))
+       if (is_journal_aborted(journal))
                return -EROFS;
 
        journal_lock_updates(journal);
index 9bb046df827a7a7a4d694dad36d727a71237a652..1586807b81779ef9c02008e6828c9df50d4f000c 100644 (file)
@@ -1019,6 +1019,11 @@ static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry, str
 
                if (!inode)
                        return ERR_PTR(-EACCES);
+
+               if (is_bad_inode(inode)) {
+                       iput(inode);
+                       return ERR_PTR(-ENOENT);
+               }
        }
        return d_splice_alias(inode, dentry);
 }
@@ -1054,6 +1059,11 @@ struct dentry *ext3_get_parent(struct dentry *child)
        if (!inode)
                return ERR_PTR(-EACCES);
 
+       if (is_bad_inode(inode)) {
+               iput(inode);
+               return ERR_PTR(-ENOENT);
+       }
+
        parent = d_alloc_anon(inode);
        if (!parent) {
                iput(inode);
index 6e3062913a92f52544a35169fb1ab6e9a44e7831..51d1c456cdab00aa446e0e2206427635dbb51f97 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/namei.h>
 #include <linux/quotaops.h>
 #include <linux/seq_file.h>
+#include <linux/log2.h>
 
 #include <asm/uaccess.h>
 
@@ -459,6 +460,14 @@ static struct inode *ext3_alloc_inode(struct super_block *sb)
 
 static void ext3_destroy_inode(struct inode *inode)
 {
+       if (!list_empty(&(EXT3_I(inode)->i_orphan))) {
+               printk("EXT3 Inode %p: orphan list check failed!\n",
+                       EXT3_I(inode));
+               print_hex_dump(KERN_INFO, "", DUMP_PREFIX_ADDRESS, 16, 4,
+                               EXT3_I(inode), sizeof(struct ext3_inode_info),
+                               false);
+               dump_stack();
+       }
        kmem_cache_free(ext3_inode_cachep, EXT3_I(inode));
 }
 
@@ -1566,7 +1575,7 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent)
                sbi->s_inode_size = le16_to_cpu(es->s_inode_size);
                sbi->s_first_ino = le32_to_cpu(es->s_first_ino);
                if ((sbi->s_inode_size < EXT3_GOOD_OLD_INODE_SIZE) ||
-                   (sbi->s_inode_size & (sbi->s_inode_size - 1)) ||
+                   (!is_power_of_2(sbi->s_inode_size)) ||
                    (sbi->s_inode_size > blocksize)) {
                        printk (KERN_ERR
                                "EXT3-fs: unsupported inode size: %d\n",
@@ -2075,6 +2084,7 @@ static int ext3_create_journal(struct super_block * sb,
                               unsigned int journal_inum)
 {
        journal_t *journal;
+       int err;
 
        if (sb->s_flags & MS_RDONLY) {
                printk(KERN_ERR "EXT3-fs: readonly filesystem when trying to "
@@ -2082,13 +2092,15 @@ static int ext3_create_journal(struct super_block * sb,
                return -EROFS;
        }
 
-       if (!(journal = ext3_get_journal(sb, journal_inum)))
+       journal = ext3_get_journal(sb, journal_inum);
+       if (!journal)
                return -EINVAL;
 
        printk(KERN_INFO "EXT3-fs: creating new journal on inode %u\n",
               journal_inum);
 
-       if (journal_create(journal)) {
+       err = journal_create(journal);
+       if (err) {
                printk(KERN_ERR "EXT3-fs: error creating journal.\n");
                journal_destroy(journal);
                return -EIO;
@@ -2139,12 +2151,14 @@ static void ext3_mark_recovery_complete(struct super_block * sb,
 
        journal_lock_updates(journal);
        journal_flush(journal);
+       lock_super(sb);
        if (EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER) &&
            sb->s_flags & MS_RDONLY) {
                EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER);
                sb->s_dirt = 0;
                ext3_commit_super(sb, es, 1);
        }
+       unlock_super(sb);
        journal_unlock_updates(journal);
 }
 
@@ -2333,7 +2347,13 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data)
                            (sbi->s_mount_state & EXT3_VALID_FS))
                                es->s_state = cpu_to_le16(sbi->s_mount_state);
 
+                       /*
+                        * We have to unlock super so that we can wait for
+                        * transactions.
+                        */
+                       unlock_super(sb);
                        ext3_mark_recovery_complete(sb, es);
+                       lock_super(sb);
                } else {
                        __le32 ret;
                        if ((ret = EXT3_HAS_RO_COMPAT_FEATURE(sb,
@@ -2406,19 +2426,19 @@ static int ext3_statfs (struct dentry * dentry, struct kstatfs * buf)
        struct super_block *sb = dentry->d_sb;
        struct ext3_sb_info *sbi = EXT3_SB(sb);
        struct ext3_super_block *es = sbi->s_es;
-       ext3_fsblk_t overhead;
-       int i;
        u64 fsid;
 
-       if (test_opt (sb, MINIX_DF))
-               overhead = 0;
-       else {
-               unsigned long ngroups;
-               ngroups = EXT3_SB(sb)->s_groups_count;
+       if (test_opt(sb, MINIX_DF)) {
+               sbi->s_overhead_last = 0;
+       } else if (sbi->s_blocks_last != le32_to_cpu(es->s_blocks_count)) {
+               unsigned long ngroups = sbi->s_groups_count, i;
+               ext3_fsblk_t overhead = 0;
                smp_rmb();
 
                /*
-                * Compute the overhead (FS structures)
+                * Compute the overhead (FS structures).  This is constant
+                * for a given filesystem unless the number of block groups
+                * changes so we cache the previous value until it does.
                 */
 
                /*
@@ -2442,18 +2462,23 @@ static int ext3_statfs (struct dentry * dentry, struct kstatfs * buf)
                 * Every block group has an inode bitmap, a block
                 * bitmap, and an inode table.
                 */
-               overhead += (ngroups * (2 + EXT3_SB(sb)->s_itb_per_group));
+               overhead += ngroups * (2 + sbi->s_itb_per_group);
+               sbi->s_overhead_last = overhead;
+               smp_wmb();
+               sbi->s_blocks_last = le32_to_cpu(es->s_blocks_count);
        }
 
        buf->f_type = EXT3_SUPER_MAGIC;
        buf->f_bsize = sb->s_blocksize;
-       buf->f_blocks = le32_to_cpu(es->s_blocks_count) - overhead;
+       buf->f_blocks = le32_to_cpu(es->s_blocks_count) - sbi->s_overhead_last;
        buf->f_bfree = percpu_counter_sum(&sbi->s_freeblocks_counter);
+       es->s_free_blocks_count = cpu_to_le32(buf->f_bfree);
        buf->f_bavail = buf->f_bfree - le32_to_cpu(es->s_r_blocks_count);
        if (buf->f_bfree < le32_to_cpu(es->s_r_blocks_count))
                buf->f_bavail = 0;
        buf->f_files = le32_to_cpu(es->s_inodes_count);
        buf->f_ffree = percpu_counter_sum(&sbi->s_freeinodes_counter);
+       es->s_free_inodes_count = cpu_to_le32(buf->f_ffree);
        buf->f_namelen = EXT3_NAME_LEN;
        fsid = le64_to_cpup((void *)es->s_uuid) ^
               le64_to_cpup((void *)es->s_uuid + sizeof(u64));
index 3b64bb16c727784d0a5f6b6f7c12e0ac30aa4cd2..9de54ae48dee6a2d569fbbfb99d28179ec68ba73 100644 (file)
@@ -1585,7 +1585,7 @@ allocated:
        ret_block = grp_alloc_blk + ext4_group_first_block_no(sb, group_no);
 
        if (in_range(ext4_block_bitmap(sb, gdp), ret_block, num) ||
-           in_range(ext4_block_bitmap(sb, gdp), ret_block, num) ||
+           in_range(ext4_inode_bitmap(sb, gdp), ret_block, num) ||
            in_range(ret_block, ext4_inode_table(sb, gdp),
                     EXT4_SB(sb)->s_itb_per_group) ||
            in_range(ret_block + num - 1, ext4_inode_table(sb, gdp),
index 2811e5720ad019d18e9976ac8afc21e3c885768b..2de339dd755431fdde691de2f299d5fe62a4d28a 100644 (file)
@@ -1017,6 +1017,11 @@ static struct dentry *ext4_lookup(struct inode * dir, struct dentry *dentry, str
 
                if (!inode)
                        return ERR_PTR(-EACCES);
+
+               if (is_bad_inode(inode)) {
+                       iput(inode);
+                       return ERR_PTR(-ENOENT);
+               }
        }
        return d_splice_alias(inode, dentry);
 }
@@ -1052,6 +1057,11 @@ struct dentry *ext4_get_parent(struct dentry *child)
        if (!inode)
                return ERR_PTR(-EACCES);
 
+       if (is_bad_inode(inode)) {
+               iput(inode);
+               return ERR_PTR(-ENOENT);
+       }
+
        parent = d_alloc_anon(inode);
        if (!parent) {
                iput(inode);
index 175b68c609685fb06742caf6bed160ca7a98d68b..d0d8c76c7edb0ed55a7f4d11ea2595b61e94c049 100644 (file)
@@ -510,6 +510,14 @@ static struct inode *ext4_alloc_inode(struct super_block *sb)
 
 static void ext4_destroy_inode(struct inode *inode)
 {
+       if (!list_empty(&(EXT4_I(inode)->i_orphan))) {
+               printk("EXT4 Inode %p: orphan list check failed!\n",
+                       EXT4_I(inode));
+               print_hex_dump(KERN_INFO, "", DUMP_PREFIX_ADDRESS, 16, 4,
+                               EXT4_I(inode), sizeof(struct ext4_inode_info),
+                               true);
+               dump_stack();
+       }
        kmem_cache_free(ext4_inode_cachep, EXT4_I(inode));
 }
 
@@ -2150,6 +2158,7 @@ static int ext4_create_journal(struct super_block * sb,
                               unsigned int journal_inum)
 {
        journal_t *journal;
+       int err;
 
        if (sb->s_flags & MS_RDONLY) {
                printk(KERN_ERR "EXT4-fs: readonly filesystem when trying to "
@@ -2157,13 +2166,15 @@ static int ext4_create_journal(struct super_block * sb,
                return -EROFS;
        }
 
-       if (!(journal = ext4_get_journal(sb, journal_inum)))
+       journal = ext4_get_journal(sb, journal_inum);
+       if (!journal)
                return -EINVAL;
 
        printk(KERN_INFO "EXT4-fs: creating new journal on inode %u\n",
               journal_inum);
 
-       if (jbd2_journal_create(journal)) {
+       err = jbd2_journal_create(journal);
+       if (err) {
                printk(KERN_ERR "EXT4-fs: error creating journal.\n");
                jbd2_journal_destroy(journal);
                return -EIO;
@@ -2214,12 +2225,14 @@ static void ext4_mark_recovery_complete(struct super_block * sb,
 
        jbd2_journal_lock_updates(journal);
        jbd2_journal_flush(journal);
+       lock_super(sb);
        if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER) &&
            sb->s_flags & MS_RDONLY) {
                EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER);
                sb->s_dirt = 0;
                ext4_commit_super(sb, es, 1);
        }
+       unlock_super(sb);
        jbd2_journal_unlock_updates(journal);
 }
 
@@ -2408,7 +2421,13 @@ static int ext4_remount (struct super_block * sb, int * flags, char * data)
                            (sbi->s_mount_state & EXT4_VALID_FS))
                                es->s_state = cpu_to_le16(sbi->s_mount_state);
 
+                       /*
+                        * We have to unlock super so that we can wait for
+                        * transactions.
+                        */
+                       unlock_super(sb);
                        ext4_mark_recovery_complete(sb, es);
+                       lock_super(sb);
                } else {
                        __le32 ret;
                        if ((ret = EXT4_HAS_RO_COMPAT_FEATURE(sb,
@@ -2481,19 +2500,19 @@ static int ext4_statfs (struct dentry * dentry, struct kstatfs * buf)
        struct super_block *sb = dentry->d_sb;
        struct ext4_sb_info *sbi = EXT4_SB(sb);
        struct ext4_super_block *es = sbi->s_es;
-       ext4_fsblk_t overhead;
-       int i;
        u64 fsid;
 
-       if (test_opt (sb, MINIX_DF))
-               overhead = 0;
-       else {
-               unsigned long ngroups;
-               ngroups = EXT4_SB(sb)->s_groups_count;
+       if (test_opt(sb, MINIX_DF)) {
+               sbi->s_overhead_last = 0;
+       } else if (sbi->s_blocks_last != le32_to_cpu(es->s_blocks_count)) {
+               unsigned long ngroups = sbi->s_groups_count, i;
+               ext4_fsblk_t overhead = 0;
                smp_rmb();
 
                /*
-                * Compute the overhead (FS structures)
+                * Compute the overhead (FS structures).  This is constant
+                * for a given filesystem unless the number of block groups
+                * changes so we cache the previous value until it does.
                 */
 
                /*
@@ -2517,18 +2536,23 @@ static int ext4_statfs (struct dentry * dentry, struct kstatfs * buf)
                 * Every block group has an inode bitmap, a block
                 * bitmap, and an inode table.
                 */
-               overhead += (ngroups * (2 + EXT4_SB(sb)->s_itb_per_group));
+               overhead += ngroups * (2 + sbi->s_itb_per_group);
+               sbi->s_overhead_last = overhead;
+               smp_wmb();
+               sbi->s_blocks_last = le32_to_cpu(es->s_blocks_count);
        }
 
        buf->f_type = EXT4_SUPER_MAGIC;
        buf->f_bsize = sb->s_blocksize;
-       buf->f_blocks = ext4_blocks_count(es) - overhead;
+       buf->f_blocks = ext4_blocks_count(es) - sbi->s_overhead_last;
        buf->f_bfree = percpu_counter_sum(&sbi->s_freeblocks_counter);
+       es->s_free_blocks_count = cpu_to_le32(buf->f_bfree);
        buf->f_bavail = buf->f_bfree - ext4_r_blocks_count(es);
        if (buf->f_bfree < ext4_r_blocks_count(es))
                buf->f_bavail = 0;
        buf->f_files = le32_to_cpu(es->s_inodes_count);
        buf->f_ffree = percpu_counter_sum(&sbi->s_freeinodes_counter);
+       es->s_free_inodes_count = cpu_to_le32(buf->f_ffree);
        buf->f_namelen = EXT4_NAME_LEN;
        fsid = le64_to_cpup((void *)es->s_uuid) ^
               le64_to_cpup((void *)es->s_uuid + sizeof(u64));
index ccf161dffb63de4f9798f4b04dd61b176f40bcd3..72cbcd61bd951268fa49eb18faf42d516606b6dd 100644 (file)
@@ -313,7 +313,7 @@ int fat_search_long(struct inode *inode, const unsigned char *name,
        wchar_t bufuname[14];
        unsigned char xlate_len, nr_slots;
        wchar_t *unicode = NULL;
-       unsigned char work[8], bufname[260];    /* 256 + 4 */
+       unsigned char work[MSDOS_NAME], bufname[260];   /* 256 + 4 */
        int uni_xlate = sbi->options.unicode_xlate;
        int utf8 = sbi->options.utf8;
        int anycase = (sbi->options.name_check != 's');
@@ -351,7 +351,8 @@ parse_record:
                if (work[0] == 0x05)
                        work[0] = 0xE5;
                for (i = 0, j = 0, last_u = 0; i < 8;) {
-                       if (!work[i]) break;
+                       if (!work[i])
+                               break;
                        chl = fat_shortname2uni(nls_disk, &work[i], 8 - i,
                                                &bufuname[j++], opt_shortname,
                                                de->lcase & CASE_LOWER_BASE);
@@ -365,13 +366,15 @@ parse_record:
                }
                j = last_u;
                fat_short2uni(nls_disk, ".", 1, &bufuname[j++]);
-               for (i = 0; i < 3;) {
-                       if (!de->ext[i]) break;
-                       chl = fat_shortname2uni(nls_disk, &de->ext[i], 3 - i,
+               for (i = 8; i < MSDOS_NAME;) {
+                       if (!work[i])
+                               break;
+                       chl = fat_shortname2uni(nls_disk, &work[i],
+                                               MSDOS_NAME - i,
                                                &bufuname[j++], opt_shortname,
                                                de->lcase & CASE_LOWER_EXT);
                        if (chl <= 1) {
-                               if (de->ext[i] != ' ')
+                               if (work[i] != ' ')
                                        last_u = j;
                        } else {
                                last_u = j;
@@ -445,7 +448,7 @@ static int __fat_readdir(struct inode *inode, struct file *filp, void *dirent,
        int fill_len;
        wchar_t bufuname[14];
        wchar_t *unicode = NULL;
-       unsigned char c, work[8], bufname[56], *ptname = bufname;
+       unsigned char c, work[MSDOS_NAME], bufname[56], *ptname = bufname;
        unsigned long lpos, dummy, *furrfu = &lpos;
        int uni_xlate = sbi->options.unicode_xlate;
        int isvfat = sbi->options.isvfat;
@@ -527,7 +530,8 @@ parse_record:
        if (work[0] == 0x05)
                work[0] = 0xE5;
        for (i = 0, j = 0, last = 0, last_u = 0; i < 8;) {
-               if (!(c = work[i])) break;
+               if (!(c = work[i]))
+                       break;
                chl = fat_shortname2uni(nls_disk, &work[i], 8 - i,
                                        &bufuname[j++], opt_shortname,
                                        de->lcase & CASE_LOWER_BASE);
@@ -549,9 +553,10 @@ parse_record:
        j = last_u;
        fat_short2uni(nls_disk, ".", 1, &bufuname[j++]);
        ptname[i++] = '.';
-       for (i2 = 0; i2 < 3;) {
-               if (!(c = de->ext[i2])) break;
-               chl = fat_shortname2uni(nls_disk, &de->ext[i2], 3 - i2,
+       for (i2 = 8; i2 < MSDOS_NAME;) {
+               if (!(c = work[i2]))
+                       break;
+               chl = fat_shortname2uni(nls_disk, &work[i2], MSDOS_NAME - i2,
                                        &bufuname[j++], opt_shortname,
                                        de->lcase & CASE_LOWER_EXT);
                if (chl <= 1) {
@@ -563,8 +568,8 @@ parse_record:
                        }
                } else {
                        last_u = j;
-                       for (chi = 0; chi < chl && i2 < 3; chi++) {
-                               ptname[i++] = de->ext[i2++];
+                       for (chi = 0; chi < chl && i2 < MSDOS_NAME; chi++) {
+                               ptname[i++] = work[i2++];
                                last = i;
                        }
                }
index ab171ea8e869b2cc9da6369abad3a83c970d2a96..2c1b73fb82ae29f5a135342c75c2d73fe0d5d931 100644 (file)
@@ -17,6 +17,8 @@ struct fatent_operations {
        int (*ent_next)(struct fat_entry *);
 };
 
+static DEFINE_SPINLOCK(fat12_entry_lock);
+
 static void fat12_ent_blocknr(struct super_block *sb, int entry,
                              int *offset, sector_t *blocknr)
 {
@@ -116,10 +118,13 @@ static int fat12_ent_get(struct fat_entry *fatent)
        u8 **ent12_p = fatent->u.ent12_p;
        int next;
 
+       spin_lock(&fat12_entry_lock);
        if (fatent->entry & 1)
                next = (*ent12_p[0] >> 4) | (*ent12_p[1] << 4);
        else
                next = (*ent12_p[1] << 8) | *ent12_p[0];
+       spin_unlock(&fat12_entry_lock);
+
        next &= 0x0fff;
        if (next >= BAD_FAT12)
                next = FAT_ENT_EOF;
@@ -151,6 +156,7 @@ static void fat12_ent_put(struct fat_entry *fatent, int new)
        if (new == FAT_ENT_EOF)
                new = EOF_FAT12;
 
+       spin_lock(&fat12_entry_lock);
        if (fatent->entry & 1) {
                *ent12_p[0] = (new << 4) | (*ent12_p[0] & 0x0f);
                *ent12_p[1] = new >> 4;
@@ -158,6 +164,7 @@ static void fat12_ent_put(struct fat_entry *fatent, int new)
                *ent12_p[0] = new & 0xff;
                *ent12_p[1] = (*ent12_p[1] & 0xf0) | (new >> 8);
        }
+       spin_unlock(&fat12_entry_lock);
 
        mark_buffer_dirty(fatent->bhs[0]);
        if (fatent->nr_bhs == 2)
index 479722d8966734cbd9bb64f82dc89940a075eedd..cfaf5877d98bf2da19fa54f1f487a1288ce18c61 100644 (file)
@@ -354,8 +354,7 @@ static int fat_fill_inode(struct inode *inode, struct msdos_dir_entry *de)
        } else { /* not a directory */
                inode->i_generation |= 1;
                inode->i_mode = MSDOS_MKMODE(de->attr,
-                   ((sbi->options.showexec &&
-                       !is_exec(de->ext))
+                   ((sbi->options.showexec && !is_exec(de->name + 8))
                        ? S_IRUGO|S_IWUGO : S_IRWXUGO)
                    & ~sbi->options.fs_fmask) | S_IFREG;
                MSDOS_I(inode)->i_start = le16_to_cpu(de->start);
index 8a4dfef1ddad7720a38343ec21ee695cd8584a09..3c96d6e6397868e28550c986a35ee6f4df5beefc 100644 (file)
@@ -80,7 +80,7 @@ struct vxfs_direct {
  *     a d_name with size len.
  */
 #define VXFS_DIRPAD            4
-#define VXFS_NAMEMIN           ((int)((struct vxfs_direct *)0)->d_name)
+#define VXFS_NAMEMIN           offsetof(struct vxfs_direct, d_name)
 #define VXFS_DIRROUND(len)     ((VXFS_DIRPAD + (len) - 1) & ~(VXFS_DIRPAD -1))
 #define VXFS_DIRLEN(len)       (VXFS_DIRROUND(VXFS_NAMEMIN + (len)))
 
index c1f44009853f26a65930e28536055f406660494f..1ab3e9d73886b19ada397b91516e5d39cff1f5bd 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/spinlock.h>
 #include <linux/completion.h>
 #include <linux/buffer_head.h>
+#include <linux/capability.h>
 #include <linux/xattr.h>
 #include <linux/gfs2_ondisk.h>
 #include <linux/lm_interface.h>
index 90ebab753d306d8da95227644ab24480ef8649ca..050d29c0a5b58fae09cfa94c5ae1316f17de8a6a 100644 (file)
@@ -62,8 +62,10 @@ struct hfs_btree *hfs_btree_open(struct super_block *sb, u32 id)
                if ((HFSPLUS_SB(sb).flags & HFSPLUS_SB_HFSX) &&
                    (head->key_type == HFSPLUS_KEY_BINARY))
                        tree->keycmp = hfsplus_cat_bin_cmp_key;
-               else
+               else {
                        tree->keycmp = hfsplus_cat_case_cmp_key;
+                       HFSPLUS_SB(sb).flags |= HFSPLUS_SB_CASEFOLD;
+               }
        } else {
                printk(KERN_ERR "hfs: unknown B*Tree requested\n");
                goto fail_page;
index 80b5682a2273446f72ba062bd744f31800f1f36a..1955ee61251c670780ecae64b716c95f5653fa59 100644 (file)
@@ -36,6 +36,8 @@ static struct dentry *hfsplus_lookup(struct inode *dir, struct dentry *dentry,
        u16 type;
 
        sb = dir->i_sb;
+
+       dentry->d_op = &hfsplus_dentry_operations;
        dentry->d_fsdata = NULL;
        hfs_find_init(HFSPLUS_SB(sb).cat_tree, &fd);
        hfsplus_cat_build_key(sb, fd.search_key, dir->i_ino, &dentry->d_name);
index 3915635b4470bcaa29ce094acb10b9620bf8d2c9..d9f5eda6d039096170beec302d94b5ed6b30dc2f 100644 (file)
@@ -150,6 +150,7 @@ struct hfsplus_sb_info {
 #define HFSPLUS_SB_NODECOMPOSE 0x0002
 #define HFSPLUS_SB_FORCE       0x0004
 #define HFSPLUS_SB_HFSX                0x0008
+#define HFSPLUS_SB_CASEFOLD    0x0010
 
 
 struct hfsplus_inode_info {
@@ -321,6 +322,7 @@ void hfsplus_file_truncate(struct inode *);
 /* inode.c */
 extern const struct address_space_operations hfsplus_aops;
 extern const struct address_space_operations hfsplus_btree_aops;
+extern struct dentry_operations hfsplus_dentry_operations;
 
 void hfsplus_inode_read_fork(struct inode *, struct hfsplus_fork_raw *);
 void hfsplus_inode_write_fork(struct inode *, struct hfsplus_fork_raw *);
@@ -353,6 +355,8 @@ int hfsplus_strcasecmp(const struct hfsplus_unistr *, const struct hfsplus_unist
 int hfsplus_strcmp(const struct hfsplus_unistr *, const struct hfsplus_unistr *);
 int hfsplus_uni2asc(struct super_block *, const struct hfsplus_unistr *, char *, int *);
 int hfsplus_asc2uni(struct super_block *, struct hfsplus_unistr *, const char *, int);
+int hfsplus_hash_dentry(struct dentry *dentry, struct qstr *str);
+int hfsplus_compare_dentry(struct dentry *dentry, struct qstr *s1, struct qstr *s2);
 
 /* wrapper.c */
 int hfsplus_read_wrapper(struct super_block *);
index 409ce5429c91ccb8b53d5a9fff6ef0118546722d..6f7c662174dbb5f3ffc3e832088b5efe79f67312 100644 (file)
@@ -131,6 +131,11 @@ const struct address_space_operations hfsplus_aops = {
        .writepages     = hfsplus_writepages,
 };
 
+struct dentry_operations hfsplus_dentry_operations = {
+       .d_hash       = hfsplus_hash_dentry,
+       .d_compare    = hfsplus_compare_dentry,
+};
+
 static struct dentry *hfsplus_file_lookup(struct inode *dir, struct dentry *dentry,
                                          struct nameidata *nd)
 {
index ebd1b380cbbc9d7dc839ca7337efb5073da8cd86..6d87a2a9534d4baa56dbd466016106b78d87daa9 100644 (file)
@@ -283,11 +283,10 @@ static int hfsplus_fill_super(struct super_block *sb, void *data, int silent)
        struct nls_table *nls = NULL;
        int err = -EINVAL;
 
-       sbi = kmalloc(sizeof(struct hfsplus_sb_info), GFP_KERNEL);
+       sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
        if (!sbi)
                return -ENOMEM;
 
-       memset(sbi, 0, sizeof(HFSPLUS_SB(sb)));
        sb->s_fs_info = sbi;
        INIT_HLIST_HEAD(&sbi->rsrc_inodes);
        hfsplus_fill_defaults(sbi);
@@ -381,6 +380,7 @@ static int hfsplus_fill_super(struct super_block *sb, void *data, int silent)
                iput(root);
                goto cleanup;
        }
+       sb->s_root->d_op = &hfsplus_dentry_operations;
 
        str.len = sizeof(HFSP_HIDDENDIR_NAME) - 1;
        str.name = HFSP_HIDDENDIR_NAME;
index 689c8bd721fb9231fa9d71853c033edaecbb365e..9e10f9444b648fde00d0cfe8086c8189d5a9eba7 100644 (file)
@@ -239,61 +239,201 @@ out:
        return res;
 }
 
-int hfsplus_asc2uni(struct super_block *sb, struct hfsplus_unistr *ustr, const char *astr, int len)
+/*
+ * Convert one or more ASCII characters into a single unicode character.
+ * Returns the number of ASCII characters corresponding to the unicode char.
+ */
+static inline int asc2unichar(struct super_block *sb, const char *astr, int len,
+                             wchar_t *uc)
 {
-       struct nls_table *nls = HFSPLUS_SB(sb).nls;
-       int size, off, decompose;
+       int size = HFSPLUS_SB(sb).nls->char2uni(astr, len, uc);
+       if (size <= 0) {
+               *uc = '?';
+               size = 1;
+       }
+       switch (*uc) {
+       case 0x2400:
+               *uc = 0;
+               break;
+       case ':':
+               *uc = '/';
+               break;
+       }
+       return size;
+}
+
+/* Decomposes a single unicode character. */
+static inline u16 *decompose_unichar(wchar_t uc, int *size)
+{
+       int off;
+
+       off = hfsplus_decompose_table[(uc >> 12) & 0xf];
+       if (off == 0 || off == 0xffff)
+               return NULL;
+
+       off = hfsplus_decompose_table[off + ((uc >> 8) & 0xf)];
+       if (!off)
+               return NULL;
+
+       off = hfsplus_decompose_table[off + ((uc >> 4) & 0xf)];
+       if (!off)
+               return NULL;
+
+       off = hfsplus_decompose_table[off + (uc & 0xf)];
+       *size = off & 3;
+       if (*size == 0)
+               return NULL;
+       return hfsplus_decompose_table + (off / 4);
+}
+
+int hfsplus_asc2uni(struct super_block *sb, struct hfsplus_unistr *ustr,
+                   const char *astr, int len)
+{
+       int size, dsize, decompose;
+       u16 *dstr, outlen = 0;
        wchar_t c;
-       u16 outlen = 0;
 
        decompose = !(HFSPLUS_SB(sb).flags & HFSPLUS_SB_NODECOMPOSE);
-
        while (outlen < HFSPLUS_MAX_STRLEN && len > 0) {
-               size = nls->char2uni(astr, len, &c);
-               if (size <= 0) {
-                       c = '?';
-                       size = 1;
-               }
-               astr += size;
-               len -= size;
-               switch (c) {
-               case 0x2400:
-                       c = 0;
-                       break;
-               case ':':
-                       c = '/';
-                       break;
-               }
-               if (c >= 0xc0 && decompose) {
-                       off = hfsplus_decompose_table[(c >> 12) & 0xf];
-                       if (!off)
-                               goto done;
-                       if (off == 0xffff) {
-                               goto done;
-                       }
-                       off = hfsplus_decompose_table[off + ((c >> 8) & 0xf)];
-                       if (!off)
-                               goto done;
-                       off = hfsplus_decompose_table[off + ((c >> 4) & 0xf)];
-                       if (!off)
-                               goto done;
-                       off = hfsplus_decompose_table[off + (c & 0xf)];
-                       size = off & 3;
-                       if (!size)
-                               goto done;
-                       off /= 4;
-                       if (outlen + size > HFSPLUS_MAX_STRLEN)
+               size = asc2unichar(sb, astr, len, &c);
+
+               if (decompose && (dstr = decompose_unichar(c, &dsize))) {
+                       if (outlen + dsize > HFSPLUS_MAX_STRLEN)
                                break;
                        do {
-                               ustr->unicode[outlen++] = cpu_to_be16(hfsplus_decompose_table[off++]);
-                       } while (--size > 0);
-                       continue;
-               }
-       done:
-               ustr->unicode[outlen++] = cpu_to_be16(c);
+                               ustr->unicode[outlen++] = cpu_to_be16(*dstr++);
+                       } while (--dsize > 0);
+               } else
+                       ustr->unicode[outlen++] = cpu_to_be16(c);
+
+               astr += size;
+               len -= size;
        }
        ustr->length = cpu_to_be16(outlen);
        if (len > 0)
                return -ENAMETOOLONG;
        return 0;
 }
+
+/*
+ * Hash a string to an integer as appropriate for the HFS+ filesystem.
+ * Composed unicode characters are decomposed and case-folding is performed
+ * if the appropriate bits are (un)set on the superblock.
+ */
+int hfsplus_hash_dentry(struct dentry *dentry, struct qstr *str)
+{
+       struct super_block *sb = dentry->d_sb;
+       const char *astr;
+       const u16 *dstr;
+       int casefold, decompose, size, dsize, len;
+       unsigned long hash;
+       wchar_t c;
+       u16 c2;
+
+       casefold = (HFSPLUS_SB(sb).flags & HFSPLUS_SB_CASEFOLD);
+       decompose = !(HFSPLUS_SB(sb).flags & HFSPLUS_SB_NODECOMPOSE);
+       hash = init_name_hash();
+       astr = str->name;
+       len = str->len;
+       while (len > 0) {
+               size = asc2unichar(sb, astr, len, &c);
+               astr += size;
+               len -= size;
+
+               if (decompose && (dstr = decompose_unichar(c, &dsize))) {
+                       do {
+                               c2 = *dstr++;
+                               if (!casefold || (c2 = case_fold(c2)))
+                                       hash = partial_name_hash(c2, hash);
+                       } while (--dsize > 0);
+               } else {
+                       c2 = c;
+                       if (!casefold || (c2 = case_fold(c2)))
+                               hash = partial_name_hash(c2, hash);
+               }
+       }
+       str->hash = end_name_hash(hash);
+
+       return 0;
+}
+
+/*
+ * Compare strings with HFS+ filename ordering.
+ * Composed unicode characters are decomposed and case-folding is performed
+ * if the appropriate bits are (un)set on the superblock.
+ */
+int hfsplus_compare_dentry(struct dentry *dentry, struct qstr *s1, struct qstr *s2)
+{
+       struct super_block *sb = dentry->d_sb;
+       int casefold, decompose, size;
+       int dsize1, dsize2, len1, len2;
+       const u16 *dstr1, *dstr2;
+       const char *astr1, *astr2;
+       u16 c1, c2;
+       wchar_t c;
+
+       casefold = (HFSPLUS_SB(sb).flags & HFSPLUS_SB_CASEFOLD);
+       decompose = !(HFSPLUS_SB(sb).flags & HFSPLUS_SB_NODECOMPOSE);
+       astr1 = s1->name;
+       len1 = s1->len;
+       astr2 = s2->name;
+       len2 = s2->len;
+       dsize1 = dsize2 = 0;
+       dstr1 = dstr2 = NULL;
+
+       while (len1 > 0 && len2 > 0) {
+               if (!dsize1) {
+                       size = asc2unichar(sb, astr1, len1, &c);
+                       astr1 += size;
+                       len1 -= size;
+
+                       if (!decompose || !(dstr1 = decompose_unichar(c, &dsize1))) {
+                               c1 = c;
+                               dstr1 = &c1;
+                               dsize1 = 1;
+                       }
+               }
+
+               if (!dsize2) {
+                       size = asc2unichar(sb, astr2, len2, &c);
+                       astr2 += size;
+                       len2 -= size;
+
+                       if (!decompose || !(dstr2 = decompose_unichar(c, &dsize2))) {
+                               c2 = c;
+                               dstr2 = &c2;
+                               dsize2 = 1;
+                       }
+               }
+
+               c1 = *dstr1;
+               c2 = *dstr2;
+               if (casefold) {
+                       if  (!(c1 = case_fold(c1))) {
+                               dstr1++;
+                               dsize1--;
+                               continue;
+                       }
+                       if (!(c2 = case_fold(c2))) {
+                               dstr2++;
+                               dsize2--;
+                               continue;
+                       }
+               }
+               if (c1 < c2)
+                       return -1;
+               else if (c1 > c2)
+                       return 1;
+
+               dstr1++;
+               dsize1--;
+               dstr2++;
+               dsize2--;
+       }
+
+       if (len1 < len2)
+               return -1;
+       if (len1 > len2)
+               return 1;
+       return 0;
+}
index e6b46b3ac2fe6b6402502b0f0bda2c84400ceb94..d145cb79c30a4dd3caea5f328737e3418e96548f 100644 (file)
 #include <linux/fs.h>
 #include <linux/mount.h>
 #include <linux/file.h>
+#include <linux/kernel.h>
 #include <linux/writeback.h>
 #include <linux/pagemap.h>
 #include <linux/highmem.h>
 #include <linux/init.h>
 #include <linux/string.h>
 #include <linux/capability.h>
+#include <linux/ctype.h>
 #include <linux/backing-dev.h>
 #include <linux/hugetlb.h>
 #include <linux/pagevec.h>
+#include <linux/parser.h>
 #include <linux/mman.h>
 #include <linux/quotaops.h>
 #include <linux/slab.h>
@@ -47,6 +50,21 @@ static struct backing_dev_info hugetlbfs_backing_dev_info = {
 
 int sysctl_hugetlb_shm_group;
 
+enum {
+       Opt_size, Opt_nr_inodes,
+       Opt_mode, Opt_uid, Opt_gid,
+       Opt_err,
+};
+
+static match_table_t tokens = {
+       {Opt_size,      "size=%s"},
+       {Opt_nr_inodes, "nr_inodes=%s"},
+       {Opt_mode,      "mode=%o"},
+       {Opt_uid,       "uid=%u"},
+       {Opt_gid,       "gid=%u"},
+       {Opt_err,       NULL},
+};
+
 static void huge_pagevec_release(struct pagevec *pvec)
 {
        int i;
@@ -594,46 +612,73 @@ static const struct super_operations hugetlbfs_ops = {
 static int
 hugetlbfs_parse_options(char *options, struct hugetlbfs_config *pconfig)
 {
-       char *opt, *value, *rest;
+       char *p, *rest;
+       substring_t args[MAX_OPT_ARGS];
+       int option;
 
        if (!options)
                return 0;
-       while ((opt = strsep(&options, ",")) != NULL) {
-               if (!*opt)
+
+       while ((p = strsep(&options, ",")) != NULL) {
+               int token;
+               if (!*p)
                        continue;
 
-               value = strchr(opt, '=');
-               if (!value || !*value)
-                       return -EINVAL;
-               else
-                       *value++ = '\0';
-
-               if (!strcmp(opt, "uid"))
-                       pconfig->uid = simple_strtoul(value, &value, 0);
-               else if (!strcmp(opt, "gid"))
-                       pconfig->gid = simple_strtoul(value, &value, 0);
-               else if (!strcmp(opt, "mode"))
-                       pconfig->mode = simple_strtoul(value,&value,0) & 0777U;
-               else if (!strcmp(opt, "size")) {
-                       unsigned long long size = memparse(value, &rest);
+               token = match_token(p, tokens, args);
+               switch (token) {
+               case Opt_uid:
+                       if (match_int(&args[0], &option))
+                               goto bad_val;
+                       pconfig->uid = option;
+                       break;
+
+               case Opt_gid:
+                       if (match_int(&args[0], &option))
+                               goto bad_val;
+                       pconfig->gid = option;
+                       break;
+
+               case Opt_mode:
+                       if (match_octal(&args[0], &option))
+                               goto bad_val;
+                       pconfig->mode = option & 0777U;
+                       break;
+
+               case Opt_size: {
+                       unsigned long long size;
+                       /* memparse() will accept a K/M/G without a digit */
+                       if (!isdigit(*args[0].from))
+                               goto bad_val;
+                       size = memparse(args[0].from, &rest);
                        if (*rest == '%') {
                                size <<= HPAGE_SHIFT;
                                size *= max_huge_pages;
                                do_div(size, 100);
-                               rest++;
                        }
                        pconfig->nr_blocks = (size >> HPAGE_SHIFT);
-                       value = rest;
-               } else if (!strcmp(opt,"nr_inodes")) {
-                       pconfig->nr_inodes = memparse(value, &rest);
-                       value = rest;
-               } else
-                       return -EINVAL;
+                       break;
+               }
+
+               case Opt_nr_inodes:
+                       /* memparse() will accept a K/M/G without a digit */
+                       if (!isdigit(*args[0].from))
+                               goto bad_val;
+                       pconfig->nr_inodes = memparse(args[0].from, &rest);
+                       break;
 
-               if (*value)
+               default:
+                       printk(KERN_ERR "hugetlbfs: Bad mount option: \"%s\"\n",
+                                p);
                        return -EINVAL;
+                       break;
+               }
        }
        return 0;
+
+bad_val:
+       printk(KERN_ERR "hugetlbfs: Bad value '%s' for mount option '%s'\n",
+              args[0].from, p);
+       return 1;
 }
 
 static int
@@ -651,7 +696,6 @@ hugetlbfs_fill_super(struct super_block *sb, void *data, int silent)
        config.gid = current->fsgid;
        config.mode = 0755;
        ret = hugetlbfs_parse_options(data, &config);
-
        if (ret)
                return ret;
 
index 8c90cbc903fa812e562984dab11ccc4e9212f2d2..c2a773e8620bdd307db7ce16d074f5b4ada2b5b1 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/fs.h>
 #include <linux/security.h>
 #include <linux/module.h>
-#include <linux/kallsyms.h>
 
 #include <asm/uaccess.h>
 #include <asm/ioctls.h>
@@ -21,7 +20,6 @@ static long do_ioctl(struct file *filp, unsigned int cmd,
                unsigned long arg)
 {
        int error = -ENOTTY;
-       void *f;
 
        if (!filp->f_op)
                goto out;
@@ -31,16 +29,10 @@ static long do_ioctl(struct file *filp, unsigned int cmd,
                if (error == -ENOIOCTLCMD)
                        error = -EINVAL;
                goto out;
-       } else if ((f = filp->f_op->ioctl)) {
+       } else if (filp->f_op->ioctl) {
                lock_kernel();
-               if (!filp->f_op->ioctl) {
-                       printk("%s: ioctl %p disappeared\n", __FUNCTION__, f);
-                       print_symbol("symbol: %s\n", (unsigned long)f);
-                       dump_stack();
-               } else {
-                       error = filp->f_op->ioctl(filp->f_path.dentry->d_inode,
-                                                 filp, cmd, arg);
-               }
+               error = filp->f_op->ioctl(filp->f_path.dentry->d_inode,
+                                         filp, cmd, arg);
                unlock_kernel();
        }
 
@@ -182,11 +174,3 @@ asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
  out:
        return error;
 }
-
-/*
- * Platforms implementing 32 bit compatibility ioctl handlers in
- * modules need this exported
- */
-#ifdef CONFIG_COMPAT
-EXPORT_SYMBOL(sys_ioctl);
-#endif
index 0e94c31cad9bca5879cda7784c57a33a0a55f4ae..1ba407c64df1fed39edbe1470538dd49da171a61 100644 (file)
@@ -7,34 +7,18 @@
  *
  *  Steve Beynon                      : Missing last directory entries fixed
  *  (stephen@askone.demon.co.uk)      : 21st June 1996
- * 
+ *
  *  isofs directory handling functions
  */
 #include <linux/smp_lock.h>
 #include "isofs.h"
 
-static int isofs_readdir(struct file *, void *, filldir_t);
-
-const struct file_operations isofs_dir_operations =
-{
-       .read           = generic_read_dir,
-       .readdir        = isofs_readdir,
-};
-
-/*
- * directories can handle most operations...
- */
-const struct inode_operations isofs_dir_inode_operations =
-{
-       .lookup         = isofs_lookup,
-};
-
 int isofs_name_translate(struct iso_directory_record *de, char *new, struct inode *inode)
 {
        char * old = de->name;
        int len = de->name_len[0];
        int i;
-                       
+
        for (i = 0; i < len; i++) {
                unsigned char c = old[i];
                if (!c)
@@ -62,22 +46,27 @@ int isofs_name_translate(struct iso_directory_record *de, char *new, struct inod
 }
 
 /* Acorn extensions written by Matthew Wilcox <willy@bofh.ai> 1998 */
-int get_acorn_filename(struct iso_directory_record * de,
-                           char * retname, struct inode * inode)
+int get_acorn_filename(struct iso_directory_record *de,
+                           char *retname, struct inode *inode)
 {
        int std;
-       unsigned char * chr;
+       unsigned char *chr;
        int retnamlen = isofs_name_translate(de, retname, inode);
-       if (retnamlen == 0) return 0;
+
+       if (retnamlen == 0)
+               return 0;
        std = sizeof(struct iso_directory_record) + de->name_len[0];
-       if (std & 1) std++;
-       if ((*((unsigned char *) de) - std) != 32) return retnamlen;
+       if (std & 1)
+               std++;
+       if ((*((unsigned char *) de) - std) != 32)
+               return retnamlen;
        chr = ((unsigned char *) de) + std;
-       if (strncmp(chr, "ARCHIMEDES", 10)) return retnamlen;
-       if ((*retname == '_') && ((chr[19] & 1) == 1)) *retname = '!';
+       if (strncmp(chr, "ARCHIMEDES", 10))
+               return retnamlen;
+       if ((*retname == '_') && ((chr[19] & 1) == 1))
+               *retname = '!';
        if (((de->flags[0] & 2) == 0) && (chr[13] == 0xff)
-               && ((chr[12] & 0xf0) == 0xf0))
-       {
+               && ((chr[12] & 0xf0) == 0xf0)) {
                retname[retnamlen] = ',';
                sprintf(retname+retnamlen+1, "%3.3x",
                        ((chr[12] & 0xf) << 8) | chr[11]);
@@ -91,7 +80,7 @@ int get_acorn_filename(struct iso_directory_record * de,
  */
 static int do_isofs_readdir(struct inode *inode, struct file *filp,
                void *dirent, filldir_t filldir,
-               char * tmpname, struct iso_directory_record * tmpde)
+               char *tmpname, struct iso_directory_record *tmpde)
 {
        unsigned long bufsize = ISOFS_BUFFER_SIZE(inode);
        unsigned char bufbits = ISOFS_BUFFER_BITS(inode);
@@ -121,9 +110,11 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
 
                de_len = *(unsigned char *) de;
 
-               /* If the length byte is zero, we should move on to the next
-                  CDROM sector.  If we are at the end of the directory, we
-                  kick out of the while loop. */
+               /*
+                * If the length byte is zero, we should move on to the next
+                * CDROM sector.  If we are at the end of the directory, we
+                * kick out of the while loop.
+                */
 
                if (de_len == 0) {
                        brelse(bh);
@@ -157,11 +148,10 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
 
                if (first_de) {
                        isofs_normalize_block_and_offset(de,
-                                                        &block_saved,
-                                                        &offset_saved);
+                                                       &block_saved,
+                                                       &offset_saved);
                        inode_number = isofs_get_ino(block_saved,
-                                                    offset_saved,
-                                                    bufbits);
+                                                       offset_saved, bufbits);
                }
 
                if (de->flags[-sbi->s_high_sierra] & 0x80) {
@@ -199,7 +189,7 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
                 */
                if ((sbi->s_hide == 'y' &&
                                (de->flags[-sbi->s_high_sierra] & 1)) ||
-                     (sbi->s_showassoc =='n' &&
+                               (sbi->s_showassoc =='n' &&
                                (de->flags[-sbi->s_high_sierra] & 4))) {
                        filp->f_pos += de_len;
                        continue;
@@ -240,7 +230,8 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
 
                continue;
        }
-       if (bh) brelse(bh);
+       if (bh)
+               brelse(bh);
        return 0;
 }
 
@@ -253,8 +244,8 @@ static int isofs_readdir(struct file *filp,
                void *dirent, filldir_t filldir)
 {
        int result;
-       char * tmpname;
-       struct iso_directory_record * tmpde;
+       char *tmpname;
+       struct iso_directory_record *tmpde;
        struct inode *inode = filp->f_path.dentry->d_inode;
 
        tmpname = (char *)__get_free_page(GFP_KERNEL);
@@ -270,3 +261,19 @@ static int isofs_readdir(struct file *filp,
        unlock_kernel();
        return result;
 }
+
+const struct file_operations isofs_dir_operations =
+{
+       .read = generic_read_dir,
+       .readdir = isofs_readdir,
+};
+
+/*
+ * directories can handle most operations...
+ */
+const struct inode_operations isofs_dir_inode_operations =
+{
+       .lookup = isofs_lookup,
+};
+
+
index 5c3eecf7542ee0cebc0e0c2e8d68c988214df87d..4f5418be0590ed6d484fd628a31fc65c9c7bea71 100644 (file)
@@ -73,20 +73,20 @@ static void isofs_destroy_inode(struct inode *inode)
        kmem_cache_free(isofs_inode_cachep, ISOFS_I(inode));
 }
 
-static void init_once(void *foo, struct kmem_cache * cachep, unsigned long flags)
+static void init_once(void *foo, struct kmem_cache *cachep, unsigned long flags)
 {
        struct iso_inode_info *ei = foo;
 
        inode_init_once(&ei->vfs_inode);
 }
+
 static int init_inodecache(void)
 {
        isofs_inode_cachep = kmem_cache_create("isofs_inode_cache",
-                                            sizeof(struct iso_inode_info),
-                                            0, (SLAB_RECLAIM_ACCOUNT|
-                                               SLAB_MEM_SPREAD),
-                                            init_once, NULL);
+                                       sizeof(struct iso_inode_info),
+                                       0, (SLAB_RECLAIM_ACCOUNT|
+                                       SLAB_MEM_SPREAD),
+                                       init_once, NULL);
        if (isofs_inode_cachep == NULL)
                return -ENOMEM;
        return 0;
@@ -150,9 +150,9 @@ struct iso9660_options{
        uid_t uid;
        char *iocharset;
        unsigned char utf8;
-        /* LVE */
-        s32 session;
-        s32 sbsector;
+       /* LVE */
+       s32 session;
+       s32 sbsector;
 };
 
 /*
@@ -197,7 +197,7 @@ isofs_hashi_common(struct dentry *dentry, struct qstr *qstr, int ms)
        hash = init_name_hash();
        while (len--) {
                c = tolower(*name++);
-               hash = partial_name_hash(tolower(c), hash);
+               hash = partial_name_hash(c, hash);
        }
        qstr->hash = end_name_hash(hash);
 
@@ -360,10 +360,12 @@ static int parse_options(char *options, struct iso9660_options *popt)
        popt->check = 'u';              /* unset */
        popt->nocompress = 0;
        popt->blocksize = 1024;
-       popt->mode = S_IRUGO | S_IXUGO; /* r-x for all.  The disc could
-                                          be shared with DOS machines so
-                                          virtually anything could be
-                                          a valid executable. */
+       popt->mode = S_IRUGO | S_IXUGO; /*
+                                        * r-x for all.  The disc could
+                                        * be shared with DOS machines so
+                                        * virtually anything could be
+                                        * a valid executable.
+                                        */
        popt->gid = 0;
        popt->uid = 0;
        popt->iocharset = NULL;
@@ -503,30 +505,30 @@ static unsigned int isofs_get_last_session(struct super_block *sb, s32 session)
                Te.cdte_format=CDROM_LBA;
                i = ioctl_by_bdev(bdev, CDROMREADTOCENTRY, (unsigned long) &Te);
                if (!i) {
-                       printk(KERN_DEBUG "Session %d start %d type %d\n",
-                              session, Te.cdte_addr.lba,
-                              Te.cdte_ctrl&CDROM_DATA_TRACK);
+                       printk(KERN_DEBUG "ISOFS: Session %d start %d type %d\n",
+                               session, Te.cdte_addr.lba,
+                               Te.cdte_ctrl&CDROM_DATA_TRACK);
                        if ((Te.cdte_ctrl&CDROM_DATA_TRACK) == 4)
                                return Te.cdte_addr.lba;
                }
-                       
-               printk(KERN_ERR "Invalid session number or type of track\n");
+
+               printk(KERN_ERR "ISOFS: Invalid session number or type of track\n");
        }
        i = ioctl_by_bdev(bdev, CDROMMULTISESSION, (unsigned long) &ms_info);
        if (session > 0)
-               printk(KERN_ERR "Invalid session number\n");
+               printk(KERN_ERR "ISOFS: Invalid session number\n");
 #if 0
-       printk("isofs.inode: CDROMMULTISESSION: rc=%d\n",i);
+       printk(KERN_DEBUG "isofs.inode: CDROMMULTISESSION: rc=%d\n",i);
        if (i==0) {
-               printk("isofs.inode: XA disk: %s\n",ms_info.xa_flag?"yes":"no");
-               printk("isofs.inode: vol_desc_start = %d\n", ms_info.addr.lba);
+               printk(KERN_DEBUG "isofs.inode: XA disk: %s\n",ms_info.xa_flag?"yes":"no");
+               printk(KERN_DEBUG "isofs.inode: vol_desc_start = %d\n", ms_info.addr.lba);
        }
 #endif
        if (i==0)
 #if WE_OBEY_THE_WRITTEN_STANDARDS
-        if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */
+               if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */
 #endif
-               vol_desc_start=ms_info.addr.lba;
+                       vol_desc_start=ms_info.addr.lba;
        return vol_desc_start;
 }
 
@@ -538,20 +540,20 @@ static unsigned int isofs_get_last_session(struct super_block *sb, s32 session)
  */
 static int isofs_fill_super(struct super_block *s, void *data, int silent)
 {
-       struct buffer_head            * bh = NULL, *pri_bh = NULL;
-       struct hs_primary_descriptor  * h_pri = NULL;
-       struct iso_primary_descriptor * pri = NULL;
+       struct buffer_head *bh = NULL, *pri_bh = NULL;
+       struct hs_primary_descriptor *h_pri = NULL;
+       struct iso_primary_descriptor *pri = NULL;
        struct iso_supplementary_descriptor *sec = NULL;
-       struct iso_directory_record   * rootp;
-       int                             joliet_level = 0;
-       int                             iso_blknum, block;
-       int                             orig_zonesize;
-       int                             table;
-       unsigned int                    vol_desc_start;
-       unsigned long                   first_data_zone;
-       struct inode                  * inode;
-       struct iso9660_options          opt;
-       struct isofs_sb_info          * sbi;
+       struct iso_directory_record *rootp;
+       struct inode *inode;
+       struct iso9660_options opt;
+       struct isofs_sb_info *sbi;
+       unsigned long first_data_zone;
+       int joliet_level = 0;
+       int iso_blknum, block;
+       int orig_zonesize;
+       int table;
+       unsigned int vol_desc_start;
 
        sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
        if (!sbi)
@@ -577,72 +579,73 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
        vol_desc_start = (opt.sbsector != -1) ?
                opt.sbsector : isofs_get_last_session(s,opt.session);
 
-       for (iso_blknum = vol_desc_start+16;
-             iso_blknum < vol_desc_start+100; iso_blknum++)
-       {
-           struct hs_volume_descriptor   * hdp;
-           struct iso_volume_descriptor  * vdp;
-
-           block = iso_blknum << (ISOFS_BLOCK_BITS - s->s_blocksize_bits);
-           if (!(bh = sb_bread(s, block)))
-               goto out_no_read;
-
-           vdp = (struct iso_volume_descriptor *)bh->b_data;
-           hdp = (struct hs_volume_descriptor *)bh->b_data;
-           
-           /* Due to the overlapping physical location of the descriptors, 
-            * ISO CDs can match hdp->id==HS_STANDARD_ID as well. To ensure 
-            * proper identification in this case, we first check for ISO.
-            */
-           if (strncmp (vdp->id, ISO_STANDARD_ID, sizeof vdp->id) == 0) {
-               if (isonum_711 (vdp->type) == ISO_VD_END)
-                   break;
-               if (isonum_711 (vdp->type) == ISO_VD_PRIMARY) {
-                   if (pri == NULL) {
-                       pri = (struct iso_primary_descriptor *)vdp;
-                       /* Save the buffer in case we need it ... */
-                       pri_bh = bh;
-                       bh = NULL;
-                   }
-               }
+       for (iso_blknum = vol_desc_start+16;
+               iso_blknum < vol_desc_start+100; iso_blknum++) {
+               struct hs_volume_descriptor *hdp;
+               struct iso_volume_descriptor  *vdp;
+
+               block = iso_blknum << (ISOFS_BLOCK_BITS - s->s_blocksize_bits);
+               if (!(bh = sb_bread(s, block)))
+                       goto out_no_read;
+
+               vdp = (struct iso_volume_descriptor *)bh->b_data;
+               hdp = (struct hs_volume_descriptor *)bh->b_data;
+
+               /*
+                * Due to the overlapping physical location of the descriptors,
+                * ISO CDs can match hdp->id==HS_STANDARD_ID as well. To ensure
+                * proper identification in this case, we first check for ISO.
+                */
+               if (strncmp (vdp->id, ISO_STANDARD_ID, sizeof vdp->id) == 0) {
+                       if (isonum_711(vdp->type) == ISO_VD_END)
+                               break;
+                       if (isonum_711(vdp->type) == ISO_VD_PRIMARY) {
+                               if (pri == NULL) {
+                                       pri = (struct iso_primary_descriptor *)vdp;
+                                       /* Save the buffer in case we need it ... */
+                                       pri_bh = bh;
+                                       bh = NULL;
+                               }
+                       }
 #ifdef CONFIG_JOLIET
-               else if (isonum_711 (vdp->type) == ISO_VD_SUPPLEMENTARY) {
-                   sec = (struct iso_supplementary_descriptor *)vdp;
-                   if (sec->escape[0] == 0x25 && sec->escape[1] == 0x2f) {
-                       if (opt.joliet == 'y') {
-                           if (sec->escape[2] == 0x40) {
-                               joliet_level = 1;
-                           } else if (sec->escape[2] == 0x43) {
-                               joliet_level = 2;
-                           } else if (sec->escape[2] == 0x45) {
-                               joliet_level = 3;
-                           }
-                           printk(KERN_DEBUG"ISO 9660 Extensions: Microsoft Joliet Level %d\n",
-                                  joliet_level);
+                       else if (isonum_711(vdp->type) == ISO_VD_SUPPLEMENTARY) {
+                               sec = (struct iso_supplementary_descriptor *)vdp;
+                               if (sec->escape[0] == 0x25 && sec->escape[1] == 0x2f) {
+                                       if (opt.joliet == 'y') {
+                                               if (sec->escape[2] == 0x40)
+                                                       joliet_level = 1;
+                                               else if (sec->escape[2] == 0x43)
+                                                       joliet_level = 2;
+                                               else if (sec->escape[2] == 0x45)
+                                                       joliet_level = 3;
+
+                                               printk(KERN_DEBUG "ISO 9660 Extensions: "
+                                                       "Microsoft Joliet Level %d\n",
+                                                       joliet_level);
+                                       }
+                                       goto root_found;
+                               } else {
+                               /* Unknown supplementary volume descriptor */
+                               sec = NULL;
+                               }
                        }
-                       goto root_found;
-                   } else {
-                       /* Unknown supplementary volume descriptor */
-                       sec = NULL;
-                   }
-               }
 #endif
-           } else {
-               if (strncmp (hdp->id, HS_STANDARD_ID, sizeof hdp->id) == 0) {
-                   if (isonum_711 (hdp->type) != ISO_VD_PRIMARY)
-                       goto out_freebh;
-               
-                   sbi->s_high_sierra = 1;
-                   opt.rock = 'n';
-                   h_pri = (struct hs_primary_descriptor *)vdp;
-                   goto root_found;
+               } else {
+                       if (strncmp (hdp->id, HS_STANDARD_ID, sizeof hdp->id) == 0) {
+                               if (isonum_711(hdp->type) != ISO_VD_PRIMARY)
+                                       goto out_freebh;
+
+                               sbi->s_high_sierra = 1;
+                               opt.rock = 'n';
+                               h_pri = (struct hs_primary_descriptor *)vdp;
+                               goto root_found;
+                       }
                }
-           }
 
-            /* Just skip any volume descriptors we don't recognize */
+               /* Just skip any volume descriptors we don't recognize */
 
-           brelse(bh);
-           bh = NULL;
+               brelse(bh);
+               bh = NULL;
        }
        /*
         * If we fall through, either no volume descriptor was found,
@@ -657,24 +660,24 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
 root_found:
 
        if (joliet_level && (pri == NULL || opt.rock == 'n')) {
-           /* This is the case of Joliet with the norock mount flag.
-            * A disc with both Joliet and Rock Ridge is handled later
-            */
-           pri = (struct iso_primary_descriptor *) sec;
+               /* This is the case of Joliet with the norock mount flag.
+                * A disc with both Joliet and Rock Ridge is handled later
+                */
+               pri = (struct iso_primary_descriptor *) sec;
        }
 
        if(sbi->s_high_sierra){
-         rootp = (struct iso_directory_record *) h_pri->root_directory_record;
-         sbi->s_nzones = isonum_733 (h_pri->volume_space_size);
-         sbi->s_log_zone_size = isonum_723 (h_pri->logical_block_size);
-         sbi->s_max_size = isonum_733(h_pri->volume_space_size);
+               rootp = (struct iso_directory_record *) h_pri->root_directory_record;
+               sbi->s_nzones = isonum_733(h_pri->volume_space_size);
+               sbi->s_log_zone_size = isonum_723(h_pri->logical_block_size);
+               sbi->s_max_size = isonum_733(h_pri->volume_space_size);
        } else {
-         if (!pri)
-           goto out_freebh;
-         rootp = (struct iso_directory_record *) pri->root_directory_record;
-         sbi->s_nzones = isonum_733 (pri->volume_space_size);
-         sbi->s_log_zone_size = isonum_723 (pri->logical_block_size);
-         sbi->s_max_size = isonum_733(pri->volume_space_size);
+               if (!pri)
+                       goto out_freebh;
+               rootp = (struct iso_directory_record *) pri->root_directory_record;
+               sbi->s_nzones = isonum_733(pri->volume_space_size);
+               sbi->s_log_zone_size = isonum_723(pri->logical_block_size);
+               sbi->s_max_size = isonum_733(pri->volume_space_size);
        }
 
        sbi->s_ninodes = 0; /* No way to figure this out easily */
@@ -687,42 +690,43 @@ root_found:
         * blocks that were 512 bytes (which should only very rarely
         * happen.)
         */
-       if(orig_zonesize < opt.blocksize)
+       if (orig_zonesize < opt.blocksize)
                goto out_bad_size;
 
        /* RDE: convert log zone size to bit shift */
-       switch (sbi->s_log_zone_size)
-         { case  512: sbi->s_log_zone_size =  9; break;
-           case 1024: sbi->s_log_zone_size = 10; break;
-           case 2048: sbi->s_log_zone_size = 11; break;
+       switch (sbi->s_log_zone_size) {
+       case  512: sbi->s_log_zone_size =  9; break;
+       case 1024: sbi->s_log_zone_size = 10; break;
+       case 2048: sbi->s_log_zone_size = 11; break;
 
-           default:
+       default:
                goto out_bad_zone_size;
-         }
+       }
 
        s->s_magic = ISOFS_SUPER_MAGIC;
        s->s_maxbytes = 0xffffffff; /* We can handle files up to 4 GB */
 
-       /* The CDROM is read-only, has no nodes (devices) on it, and since
-          all of the files appear to be owned by root, we really do not want
-          to allow suid.  (suid or devices will not show up unless we have
-          Rock Ridge extensions) */
+       /*
+        * The CDROM is read-only, has no nodes (devices) on it, and since
+        * all of the files appear to be owned by root, we really do not want
+        * to allow suid.  (suid or devices will not show up unless we have
+        * Rock Ridge extensions)
+        */
 
        s->s_flags |= MS_RDONLY /* | MS_NODEV | MS_NOSUID */;
 
        /* Set this for reference. Its not currently used except on write
           which we don't have .. */
-          
-       first_data_zone = isonum_733 (rootp->extent) +
-                         isonum_711 (rootp->ext_attr_length);
+
+       first_data_zone = isonum_733(rootp->extent) +
+                         isonum_711(rootp->ext_attr_length);
        sbi->s_firstdatazone = first_data_zone;
 #ifndef BEQUIET
-       printk(KERN_DEBUG "Max size:%ld   Log zone size:%ld\n",
-              sbi->s_max_size,
-              1UL << sbi->s_log_zone_size);
-       printk(KERN_DEBUG "First datazone:%ld\n", sbi->s_firstdatazone);
+       printk(KERN_DEBUG "ISOFS: Max size:%ld   Log zone size:%ld\n",
+               sbi->s_max_size, 1UL << sbi->s_log_zone_size);
+       printk(KERN_DEBUG "ISOFS: First datazone:%ld\n", sbi->s_firstdatazone);
        if(sbi->s_high_sierra)
-               printk(KERN_DEBUG "Disc in High Sierra format.\n");
+               printk(KERN_DEBUG "ISOFS: Disc in High Sierra format.\n");
 #endif
 
        /*
@@ -737,8 +741,8 @@ root_found:
                pri = (struct iso_primary_descriptor *) sec;
                rootp = (struct iso_directory_record *)
                        pri->root_directory_record;
-               first_data_zone = isonum_733 (rootp->extent) +
-                               isonum_711 (rootp->ext_attr_length);
+               first_data_zone = isonum_733(rootp->extent) +
+                               isonum_711(rootp->ext_attr_length);
        }
 
        /*
@@ -771,7 +775,7 @@ root_found:
 
 #ifdef CONFIG_JOLIET
        if (joliet_level && opt.utf8 == 0) {
-               char * p = opt.iocharset ? opt.iocharset : CONFIG_NLS_DEFAULT;
+               char *p = opt.iocharset ? opt.iocharset : CONFIG_NLS_DEFAULT;
                sbi->s_nls_iocharset = load_nls(p);
                if (! sbi->s_nls_iocharset) {
                        /* Fail only if explicit charset specified */
@@ -821,7 +825,7 @@ root_found:
                sbi->s_rock = 0;
                if (sbi->s_firstdatazone != first_data_zone) {
                        sbi->s_firstdatazone = first_data_zone;
-                       printk(KERN_DEBUG 
+                       printk(KERN_DEBUG
                                "ISOFS: changing to secondary root\n");
                        iput(inode);
                        inode = isofs_iget(s, sbi->s_firstdatazone, 0);
@@ -830,8 +834,10 @@ root_found:
 
        if (opt.check == 'u') {
                /* Only Joliet is case insensitive by default */
-               if (joliet_level) opt.check = 'r';
-               else opt.check = 's';
+               if (joliet_level)
+                       opt.check = 'r';
+               else
+                       opt.check = 's';
        }
        sbi->s_joliet_level = joliet_level;
 
@@ -846,8 +852,10 @@ root_found:
                goto out_no_root;
 
        table = 0;
-       if (joliet_level) table += 2;
-       if (opt.check == 'r') table++;
+       if (joliet_level)
+               table += 2;
+       if (opt.check == 'r')
+               table++;
        s->s_root->d_op = &isofs_dentry_ops[table];
 
        kfree(opt.iocharset);
@@ -858,10 +866,10 @@ root_found:
         * Display error messages and free resources.
         */
 out_bad_root:
-       printk(KERN_WARNING "isofs_fill_super: root inode not initialized\n");
+       printk(KERN_WARNING "%s: root inode not initialized\n", __func__);
        goto out_iput;
 out_no_root:
-       printk(KERN_WARNING "isofs_fill_super: get root inode failed\n");
+       printk(KERN_WARNING "%s: get root inode failed\n", __func__);
 out_iput:
        iput(inode);
 #ifdef CONFIG_JOLIET
@@ -870,21 +878,20 @@ out_iput:
 #endif
        goto out_freesbi;
 out_no_read:
-       printk(KERN_WARNING "isofs_fill_super: "
-               "bread failed, dev=%s, iso_blknum=%d, block=%d\n",
-               s->s_id, iso_blknum, block);
+       printk(KERN_WARNING "%s: bread failed, dev=%s, iso_blknum=%d, block=%d\n",
+               __func__, s->s_id, iso_blknum, block);
        goto out_freesbi;
 out_bad_zone_size:
-       printk(KERN_WARNING "Bad logical zone size %ld\n",
+       printk(KERN_WARNING "ISOFS: Bad logical zone size %ld\n",
                sbi->s_log_zone_size);
        goto out_freebh;
 out_bad_size:
-       printk(KERN_WARNING "Logical zone size(%d) < hardware blocksize(%u)\n",
+       printk(KERN_WARNING "ISOFS: Logical zone size(%d) < hardware blocksize(%u)\n",
                orig_zonesize, opt.blocksize);
        goto out_freebh;
 out_unknown_format:
        if (!silent)
-               printk(KERN_WARNING "Unable to identify CD-ROM format.\n");
+               printk(KERN_WARNING "ISOFS: Unable to identify CD-ROM format.\n");
 
 out_freebh:
        brelse(bh);
@@ -902,7 +909,7 @@ static int isofs_statfs (struct dentry *dentry, struct kstatfs *buf)
        buf->f_type = ISOFS_SUPER_MAGIC;
        buf->f_bsize = sb->s_blocksize;
        buf->f_blocks = (ISOFS_SB(sb)->s_nzones
-                  << (ISOFS_SB(sb)->s_log_zone_size - sb->s_blocksize_bits));
+               << (ISOFS_SB(sb)->s_log_zone_size - sb->s_blocksize_bits));
        buf->f_bfree = 0;
        buf->f_bavail = 0;
        buf->f_files = ISOFS_SB(sb)->s_ninodes;
@@ -931,20 +938,20 @@ int isofs_get_blocks(struct inode *inode, sector_t iblock_s,
 
        rv = 0;
        if (iblock < 0 || iblock != iblock_s) {
-               printk("isofs_get_blocks: block number too large\n");
+               printk(KERN_DEBUG "%s: block number too large\n", __func__);
                goto abort;
        }
 
        b_off = iblock;
-       
-       offset    = 0;
-       firstext  = ei->i_first_extent;
+
+       offset = 0;
+       firstext = ei->i_first_extent;
        sect_size = ei->i_section_size >> ISOFS_BUFFER_BITS(inode);
-       nextblk   = ei->i_next_section_block;
-       nextoff   = ei->i_next_section_offset;
-       section   = 0;
+       nextblk = ei->i_next_section_block;
+       nextoff = ei->i_next_section_offset;
+       section = 0;
 
-       while ( nblocks ) {
+       while (nblocks) {
                /* If we are *way* beyond the end of the file, print a message.
                 * Access beyond the end of the file up to the next page boundary
                 * is normal, however because of the way the page cache works.
@@ -953,11 +960,11 @@ int isofs_get_blocks(struct inode *inode, sector_t iblock_s,
                 * I/O errors.
                 */
                if (b_off > ((inode->i_size + PAGE_CACHE_SIZE - 1) >> ISOFS_BUFFER_BITS(inode))) {
-                       printk("isofs_get_blocks: block >= EOF (%ld, %ld)\n",
-                              iblock, (unsigned long) inode->i_size);
+                       printk(KERN_DEBUG "%s: block >= EOF (%ld, %ld)\n",
+                               __func__, iblock, (unsigned long) inode->i_size);
                        goto abort;
                }
-               
+
                /* On the last section, nextblk == 0, section size is likely to
                 * exceed sect_size by a partial block, and access beyond the
                 * end of the file will reach beyond the section size, too.
@@ -976,20 +983,21 @@ int isofs_get_blocks(struct inode *inode, sector_t iblock_s,
                        iput(ninode);
 
                        if (++section > 100) {
-                               printk("isofs_get_blocks: More than 100 file sections ?!?, aborting...\n");
-                               printk("isofs_get_blocks: block=%ld firstext=%u sect_size=%u "
-                                      "nextblk=%lu nextoff=%lu\n",
-                                      iblock, firstext, (unsigned) sect_size,
-                                      nextblk, nextoff);
+                               printk(KERN_DEBUG "%s: More than 100 file sections ?!?"
+                                       " aborting...\n", __func__);
+                               printk(KERN_DEBUG "%s: block=%ld firstext=%u sect_size=%u "
+                                       "nextblk=%lu nextoff=%lu\n", __func__,
+                                       iblock, firstext, (unsigned) sect_size,
+                                       nextblk, nextoff);
                                goto abort;
                        }
                }
-               
-               if ( *bh ) {
+
+               if (*bh) {
                        map_bh(*bh, inode->i_sb, firstext + b_off - offset);
                } else {
                        *bh = sb_getblk(inode->i_sb, firstext+b_off-offset);
-                       if ( !*bh )
+                       if (!*bh)
                                goto abort;
                }
                bh++;   /* Next buffer head */
@@ -1010,7 +1018,7 @@ static int isofs_get_block(struct inode *inode, sector_t iblock,
                    struct buffer_head *bh_result, int create)
 {
        if (create) {
-               printk("isofs_get_block: Kernel tries to allocate a block\n");
+               printk(KERN_DEBUG "%s: Kernel tries to allocate a block\n", __func__);
                return -EROFS;
        }
 
@@ -1070,11 +1078,11 @@ static int isofs_read_level3_size(struct inode *inode)
 {
        unsigned long bufsize = ISOFS_BUFFER_SIZE(inode);
        int high_sierra = ISOFS_SB(inode->i_sb)->s_high_sierra;
-       struct buffer_head * bh = NULL;
+       struct buffer_head *bh = NULL;
        unsigned long block, offset, block_saved, offset_saved;
        int i = 0;
        int more_entries = 0;
-       struct iso_directory_record * tmpde = NULL;
+       struct iso_directory_record *tmpde = NULL;
        struct iso_inode_info *ei = ISOFS_I(inode);
 
        inode->i_size = 0;
@@ -1089,7 +1097,7 @@ static int isofs_read_level3_size(struct inode *inode)
        offset = ei->i_iget5_offset;
 
        do {
-               struct iso_directory_record * de;
+               struct iso_directory_record *de;
                unsigned int de_len;
 
                if (!bh) {
@@ -1163,10 +1171,9 @@ out_noread:
        return -EIO;
 
 out_toomany:
-       printk(KERN_INFO "isofs_read_level3_size: "
-               "More than 100 file sections ?!?, aborting...\n"
-               "isofs_read_level3_size: inode=%lu\n",
-               inode->i_ino);
+       printk(KERN_INFO "%s: More than 100 file sections ?!?, aborting...\n"
+               "isofs_read_level3_size: inode=%lu\n",
+               __func__, inode->i_ino);
        goto out;
 }
 
@@ -1177,9 +1184,9 @@ static void isofs_read_inode(struct inode *inode)
        unsigned long bufsize = ISOFS_BUFFER_SIZE(inode);
        unsigned long block;
        int high_sierra = sbi->s_high_sierra;
-       struct buffer_head * bh = NULL;
-       struct iso_directory_record * de;
-       struct iso_directory_record * tmpde = NULL;
+       struct buffer_head *bh = NULL;
+       struct iso_directory_record *de;
+       struct iso_directory_record *tmpde = NULL;
        unsigned int de_len;
        unsigned long offset;
        struct iso_inode_info *ei = ISOFS_I(inode);
@@ -1199,7 +1206,7 @@ static void isofs_read_inode(struct inode *inode)
 
                tmpde = kmalloc(de_len, GFP_KERNEL);
                if (tmpde == NULL) {
-                       printk(KERN_INFO "isofs_read_inode: out of memory\n");
+                       printk(KERN_INFO "%s: out of memory\n", __func__);
                        goto fail;
                }
                memcpy(tmpde, bh->b_data + offset, frag1);
@@ -1212,24 +1219,26 @@ static void isofs_read_inode(struct inode *inode)
        }
 
        inode->i_ino = isofs_get_ino(ei->i_iget5_block,
-                                    ei->i_iget5_offset,
-                                    ISOFS_BUFFER_BITS(inode));
+                                       ei->i_iget5_offset,
+                                       ISOFS_BUFFER_BITS(inode));
 
        /* Assume it is a normal-format file unless told otherwise */
        ei->i_file_format = isofs_file_normal;
 
        if (de->flags[-high_sierra] & 2) {
                inode->i_mode = S_IRUGO | S_IXUGO | S_IFDIR;
-               inode->i_nlink = 1; /* Set to 1.  We know there are 2, but
-                                      the find utility tries to optimize
-                                      if it is 2, and it screws up.  It is
-                                      easier to give 1 which tells find to
-                                      do it the hard way. */
+               inode->i_nlink = 1;     /*
+                                        * Set to 1.  We know there are 2, but
+                                        * the find utility tries to optimize
+                                        * if it is 2, and it screws up.  It is
+                                        * easier to give 1 which tells find to
+                                        * do it the hard way.
+                                        */
        } else {
-               /* Everybody gets to read the file. */
+               /* Everybody gets to read the file. */
                inode->i_mode = sbi->s_mode;
                inode->i_nlink = 1;
-               inode->i_mode |= S_IFREG;
+               inode->i_mode |= S_IFREG;
        }
        inode->i_uid = sbi->s_uid;
        inode->i_gid = sbi->s_gid;
@@ -1239,13 +1248,14 @@ static void isofs_read_inode(struct inode *inode)
        ei->i_format_parm[1] = 0;
        ei->i_format_parm[2] = 0;
 
-       ei->i_section_size = isonum_733 (de->size);
+       ei->i_section_size = isonum_733(de->size);
        if (de->flags[-high_sierra] & 0x80) {
-               if(isofs_read_level3_size(inode)) goto fail;
+               if(isofs_read_level3_size(inode))
+                       goto fail;
        } else {
                ei->i_next_section_block = 0;
                ei->i_next_section_offset = 0;
-               inode->i_size = isonum_733 (de->size);
+               inode->i_size = isonum_733(de->size);
        }
 
        /*
@@ -1258,23 +1268,24 @@ static void isofs_read_inode(struct inode *inode)
                inode->i_size &= 0x00ffffff;
 
        if (de->interleave[0]) {
-               printk("Interleaved files not (yet) supported.\n");
+               printk(KERN_DEBUG "ISOFS: Interleaved files not (yet) supported.\n");
                inode->i_size = 0;
        }
 
        /* I have no idea what file_unit_size is used for, so
           we will flag it for now */
        if (de->file_unit_size[0] != 0) {
-               printk("File unit size != 0 for ISO file (%ld).\n",
-                      inode->i_ino);
+               printk(KERN_DEBUG "ISOFS: File unit size != 0 for ISO file (%ld).\n",
+                       inode->i_ino);
        }
 
        /* I have no idea what other flag bits are used for, so
           we will flag it for now */
 #ifdef DEBUG
        if((de->flags[-high_sierra] & ~2)!= 0){
-               printk("Unusual flag settings for ISO file (%ld %x).\n",
-                      inode->i_ino, de->flags[-high_sierra]);
+               printk(KERN_DEBUG "ISOFS: Unusual flag settings for ISO file "
+                               "(%ld %x).\n",
+                       inode->i_ino, de->flags[-high_sierra]);
        }
 #endif
 
@@ -1285,11 +1296,11 @@ static void isofs_read_inode(struct inode *inode)
        inode->i_atime.tv_nsec =
        inode->i_ctime.tv_nsec = 0;
 
-       ei->i_first_extent = (isonum_733 (de->extent) +
-                             isonum_711 (de->ext_attr_length));
+       ei->i_first_extent = (isonum_733(de->extent) +
+                       isonum_711(de->ext_attr_length));
 
        /* Set the number of blocks for stat() - should be done before RR */
-       inode->i_blocks  = (inode->i_size + 511) >> 9;
+       inode->i_blocks = (inode->i_size + 511) >> 9;
 
        /*
         * Now test for possible Rock Ridge extensions which will override
@@ -1306,7 +1317,7 @@ static void isofs_read_inode(struct inode *inode)
        /* Install the inode operations vector */
        if (S_ISREG(inode->i_mode)) {
                inode->i_fop = &generic_ro_fops;
-               switch ( ei->i_file_format ) {
+               switch (ei->i_file_format) {
 #ifdef CONFIG_ZISOFS
                case isofs_file_compressed:
                        inode->i_data.a_ops = &zisofs_aops;
@@ -1350,7 +1361,7 @@ static int isofs_iget5_test(struct inode *ino, void *data)
        struct isofs_iget5_callback_data *d =
                (struct isofs_iget5_callback_data*)data;
        return (i->i_iget5_block == d->block)
-              && (i->i_iget5_offset == d->offset);
+               && (i->i_iget5_offset == d->offset);
 }
 
 static int isofs_iget5_set(struct inode *ino, void *data)
@@ -1384,7 +1395,7 @@ struct inode *isofs_iget(struct super_block *sb,
        hashval = (block << sb->s_blocksize_bits) | offset;
 
        inode = iget5_locked(sb, hashval, &isofs_iget5_test,
-                            &isofs_iget5_set, &data);
+                               &isofs_iget5_set, &data);
 
        if (inode && (inode->i_state & I_NEW)) {
                sb->s_op->read_inode(inode);
@@ -1398,7 +1409,7 @@ static int isofs_get_sb(struct file_system_type *fs_type,
        int flags, const char *dev_name, void *data, struct vfsmount *mnt)
 {
        return get_sb_bdev(fs_type, flags, dev_name, data, isofs_fill_super,
-                          mnt);
+                               mnt);
 }
 
 static struct file_system_type iso9660_fs_type = {
index fb8fe7a9ddc6cf6aee6a8a80542505985c069a34..92c14b850e9cadeaf2179ca012130cfa6b744204 100644 (file)
@@ -80,22 +80,20 @@ get_joliet_filename(struct iso_directory_record * de, unsigned char *outname, st
 
        if (utf8) {
                len = wcsntombs_be(outname, de->name,
-                                  de->name_len[0] >> 1, PAGE_SIZE);
+                               de->name_len[0] >> 1, PAGE_SIZE);
        } else {
                len = uni16_to_x8(outname, (__be16 *) de->name,
-                                 de->name_len[0] >> 1, nls);
+                               de->name_len[0] >> 1, nls);
        }
-       if ((len > 2) && (outname[len-2] == ';') && (outname[len-1] == '1')) {
+       if ((len > 2) && (outname[len-2] == ';') && (outname[len-1] == '1'))
                len -= 2;
-       }
 
        /*
         * Windows doesn't like periods at the end of a name,
         * so neither do we
         */
-       while (len >= 2 && (outname[len-1] == '.')) {
+       while (len >= 2 && (outname[len-1] == '.'))
                len--;
-       }
 
        return len;
 }
index c04b3a14a3e94b07744214a18de0a9452d35b3b7..c8c7e5138a017da3085d1cbfdd4f0ab6ee4f03b7 100644 (file)
@@ -15,7 +15,7 @@
  * some sanity tests.
  */
 static int
-isofs_cmp(struct dentry * dentry, const char * compare, int dlen)
+isofs_cmp(struct dentry *dentry, const char *compare, int dlen)
 {
        struct qstr qstr;
 
@@ -48,24 +48,24 @@ isofs_cmp(struct dentry * dentry, const char * compare, int dlen)
  */
 static unsigned long
 isofs_find_entry(struct inode *dir, struct dentry *dentry,
-       unsigned long *block_rv, unsigned longoffset_rv,
-       char * tmpname, struct iso_directory_record * tmpde)
+       unsigned long *block_rv, unsigned long *offset_rv,
+       char *tmpname, struct iso_directory_record *tmpde)
 {
        unsigned long bufsize = ISOFS_BUFFER_SIZE(dir);
        unsigned char bufbits = ISOFS_BUFFER_BITS(dir);
        unsigned long block, f_pos, offset, block_saved, offset_saved;
-       struct buffer_head * bh = NULL;
+       struct buffer_head *bh = NULL;
        struct isofs_sb_info *sbi = ISOFS_SB(dir->i_sb);
 
        if (!ISOFS_I(dir)->i_first_extent)
                return 0;
-  
+
        f_pos = 0;
        offset = 0;
        block = 0;
 
        while (f_pos < dir->i_size) {
-               struct iso_directory_record * de;
+               struct iso_directory_record *de;
                int de_len, match, i, dlen;
                char *dpnt;
 
@@ -114,7 +114,7 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry,
 
                if (sbi->s_rock &&
                    ((i = get_rock_ridge_filename(de, tmpname, dir)))) {
-                       dlen = i;       /* possibly -1 */
+                       dlen = i;       /* possibly -1 */
                        dpnt = tmpname;
 #ifdef CONFIG_JOLIET
                } else if (sbi->s_joliet_level) {
@@ -145,8 +145,8 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry,
                        isofs_normalize_block_and_offset(de,
                                                         &block_saved,
                                                         &offset_saved);
-                        *block_rv = block_saved;
-                        *offset_rv = offset_saved;
+                       *block_rv = block_saved;
+                       *offset_rv = offset_saved;
                        brelse(bh);
                        return 1;
                }
@@ -155,7 +155,7 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry,
        return 0;
 }
 
-struct dentry *isofs_lookup(struct inode * dir, struct dentry * dentry, struct nameidata *nd)
+struct dentry *isofs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
 {
        int found;
        unsigned long block, offset;
@@ -170,9 +170,9 @@ struct dentry *isofs_lookup(struct inode * dir, struct dentry * dentry, struct n
 
        lock_kernel();
        found = isofs_find_entry(dir, dentry,
-                                &block, &offset,
-                                page_address(page),
-                                1024 + page_address(page));
+                               &block, &offset,
+                               page_address(page),
+                               1024 + page_address(page));
        __free_page(page);
 
        inode = NULL;
index 1facfaff97cbe42e46a251b045b49e51fda772a9..a003d50edcdbdc1fe45a7627e83191cd55df378c 100644 (file)
@@ -887,7 +887,8 @@ restart_loop:
        journal->j_committing_transaction = NULL;
        spin_unlock(&journal->j_state_lock);
 
-       if (commit_transaction->t_checkpoint_list == NULL) {
+       if (commit_transaction->t_checkpoint_list == NULL &&
+           commit_transaction->t_checkpoint_io_list == NULL) {
                __journal_drop_transaction(journal, commit_transaction);
        } else {
                if (journal->j_checkpoint_transactions == NULL) {
index 824e3b7d4ec15266e9f0825cccaeeb2231e5b54c..8db2fa25170b7ae55cfd6625ec78fca127920578 100644 (file)
@@ -68,6 +68,7 @@
 #include <linux/list.h>
 #include <linux/init.h>
 #endif
+#include <linux/log2.h>
 
 static struct kmem_cache *revoke_record_cache;
 static struct kmem_cache *revoke_table_cache;
@@ -211,7 +212,7 @@ int journal_init_revoke(journal_t *journal, int hash_size)
        journal->j_revoke = journal->j_revoke_table[0];
 
        /* Check that the hash_size is a power of two */
-       J_ASSERT ((hash_size & (hash_size-1)) == 0);
+       J_ASSERT(is_power_of_2(hash_size));
 
        journal->j_revoke->hash_size = hash_size;
 
@@ -238,7 +239,7 @@ int journal_init_revoke(journal_t *journal, int hash_size)
        journal->j_revoke = journal->j_revoke_table[1];
 
        /* Check that the hash_size is a power of two */
-       J_ASSERT ((hash_size & (hash_size-1)) == 0);
+       J_ASSERT(is_power_of_2(hash_size));
 
        journal->j_revoke->hash_size = hash_size;
 
index 2856e1100a5fc302a3582991c081aa3bc3d1c316..c0f59d1b13dc336f82e490810f928f5e7b6b1a70 100644 (file)
@@ -896,7 +896,8 @@ restart_loop:
        journal->j_committing_transaction = NULL;
        spin_unlock(&journal->j_state_lock);
 
-       if (commit_transaction->t_checkpoint_list == NULL) {
+       if (commit_transaction->t_checkpoint_list == NULL &&
+           commit_transaction->t_checkpoint_io_list == NULL) {
                __jbd2_journal_drop_transaction(journal, commit_transaction);
        } else {
                if (journal->j_checkpoint_transactions == NULL) {
index 9246e763da78f1491d53b9f0ae12d89579494eaf..28cac049a56bfafebb7714389576aabdd2d52e17 100644 (file)
@@ -68,6 +68,7 @@
 #include <linux/list.h>
 #include <linux/init.h>
 #endif
+#include <linux/log2.h>
 
 static struct kmem_cache *jbd2_revoke_record_cache;
 static struct kmem_cache *jbd2_revoke_table_cache;
@@ -212,7 +213,7 @@ int jbd2_journal_init_revoke(journal_t *journal, int hash_size)
        journal->j_revoke = journal->j_revoke_table[0];
 
        /* Check that the hash_size is a power of two */
-       J_ASSERT ((hash_size & (hash_size-1)) == 0);
+       J_ASSERT(is_power_of_2(hash_size));
 
        journal->j_revoke->hash_size = hash_size;
 
@@ -239,7 +240,7 @@ int jbd2_journal_init_revoke(journal_t *journal, int hash_size)
        journal->j_revoke = journal->j_revoke_table[1];
 
        /* Check that the hash_size is a power of two */
-       J_ASSERT ((hash_size & (hash_size-1)) == 0);
+       J_ASSERT(is_power_of_2(hash_size));
 
        journal->j_revoke->hash_size = hash_size;
 
index b696e3a0d18fcf2d4bb017dcaa36dacb39c565e6..4198003d7e18a79228ebf5a8a7f9d06cca86be21 100644 (file)
@@ -28,6 +28,7 @@
 #include <asm/uaccess.h>
 #include <asm/unistd.h>
 #include "pnode.h"
+#include "internal.h"
 
 /* spinlock for vfsmount related operations, inplace of dcache_lock */
 __cacheline_aligned_in_smp DEFINE_SPINLOCK(vfsmount_lock);
@@ -320,22 +321,16 @@ EXPORT_SYMBOL(mnt_unpin);
 static void *m_start(struct seq_file *m, loff_t *pos)
 {
        struct mnt_namespace *n = m->private;
-       struct list_head *p;
-       loff_t l = *pos;
 
        down_read(&namespace_sem);
-       list_for_each(p, &n->list)
-               if (!l--)
-                       return list_entry(p, struct vfsmount, mnt_list);
-       return NULL;
+       return seq_list_start(&n->list, *pos);
 }
 
 static void *m_next(struct seq_file *m, void *v, loff_t *pos)
 {
        struct mnt_namespace *n = m->private;
-       struct list_head *p = ((struct vfsmount *)v)->mnt_list.next;
-       (*pos)++;
-       return p == &n->list ? NULL : list_entry(p, struct vfsmount, mnt_list);
+
+       return seq_list_next(v, &n->list, pos);
 }
 
 static void m_stop(struct seq_file *m, void *v)
@@ -350,7 +345,7 @@ static inline void mangle(struct seq_file *m, const char *s)
 
 static int show_vfsmnt(struct seq_file *m, void *v)
 {
-       struct vfsmount *mnt = v;
+       struct vfsmount *mnt = list_entry(v, struct vfsmount, mnt_list);
        int err = 0;
        static struct proc_fs_info {
                int flag;
@@ -405,7 +400,7 @@ struct seq_operations mounts_op = {
 
 static int show_vfsstat(struct seq_file *m, void *v)
 {
-       struct vfsmount *mnt = v;
+       struct vfsmount *mnt = list_entry(v, struct vfsmount, mnt_list);
        int err = 0;
 
        /* device */
@@ -1457,7 +1452,7 @@ static struct mnt_namespace *dup_mnt_ns(struct mnt_namespace *mnt_ns,
 
        new_ns = kmalloc(sizeof(struct mnt_namespace), GFP_KERNEL);
        if (!new_ns)
-               return NULL;
+               return ERR_PTR(-ENOMEM);
 
        atomic_set(&new_ns->count, 1);
        INIT_LIST_HEAD(&new_ns->list);
@@ -1471,7 +1466,7 @@ static struct mnt_namespace *dup_mnt_ns(struct mnt_namespace *mnt_ns,
        if (!new_ns->root) {
                up_write(&namespace_sem);
                kfree(new_ns);
-               return NULL;
+               return ERR_PTR(-ENOMEM);;
        }
        spin_lock(&vfsmount_lock);
        list_add_tail(&new_ns->list, &new_ns->root->mnt_list);
@@ -1515,7 +1510,7 @@ static struct mnt_namespace *dup_mnt_ns(struct mnt_namespace *mnt_ns,
        return new_ns;
 }
 
-struct mnt_namespace *copy_mnt_ns(int flags, struct mnt_namespace *ns,
+struct mnt_namespace *copy_mnt_ns(unsigned long flags, struct mnt_namespace *ns,
                struct fs_struct *new_fs)
 {
        struct mnt_namespace *new_ns;
index d3152f8d95c6221495f014dbd00c15ab285cb58e..2b145de45b39147ce8e4ab9a53fd709c614050de 100644 (file)
@@ -203,7 +203,6 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t *
 
        if (pos + count > MAX_NON_LFS && !(file->f_flags&O_LARGEFILE)) {
                if (pos >= MAX_NON_LFS) {
-                       send_sig(SIGXFSZ, current, 0);
                        return -EFBIG;
                }
                if (count > MAX_NON_LFS - (u32)pos) {
@@ -212,7 +211,6 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t *
        }
        if (pos >= inode->i_sb->s_maxbytes) {
                if (count || pos > inode->i_sb->s_maxbytes) {
-                       send_sig(SIGXFSZ, current, 0);
                        return -EFBIG;
                }
        }
index ccb455053ee48090ab21b4bdd55294d3f4694010..a49f9feff776253f99ffd167246a5fc2b77d79d5 100644 (file)
@@ -1206,23 +1206,9 @@ static int nfs_server_list_open(struct inode *inode, struct file *file)
  */
 static void *nfs_server_list_start(struct seq_file *m, loff_t *_pos)
 {
-       struct list_head *_p;
-       loff_t pos = *_pos;
-
        /* lock the list against modification */
        spin_lock(&nfs_client_lock);
-
-       /* allow for the header line */
-       if (!pos)
-               return SEQ_START_TOKEN;
-       pos--;
-
-       /* find the n'th element in the list */
-       list_for_each(_p, &nfs_client_list)
-               if (!pos--)
-                       break;
-
-       return _p != &nfs_client_list ? _p : NULL;
+       return seq_list_start_head(&nfs_client_list, *_pos);
 }
 
 /*
@@ -1230,14 +1216,7 @@ static void *nfs_server_list_start(struct seq_file *m, loff_t *_pos)
  */
 static void *nfs_server_list_next(struct seq_file *p, void *v, loff_t *pos)
 {
-       struct list_head *_p;
-
-       (*pos)++;
-
-       _p = v;
-       _p = (v == SEQ_START_TOKEN) ? nfs_client_list.next : _p->next;
-
-       return _p != &nfs_client_list ? _p : NULL;
+       return seq_list_next(v, &nfs_client_list, pos);
 }
 
 /*
@@ -1256,7 +1235,7 @@ static int nfs_server_list_show(struct seq_file *m, void *v)
        struct nfs_client *clp;
 
        /* display header on line 1 */
-       if (v == SEQ_START_TOKEN) {
+       if (v == &nfs_client_list) {
                seq_puts(m, "NV SERVER   PORT USE HOSTNAME\n");
                return 0;
        }
@@ -1297,23 +1276,9 @@ static int nfs_volume_list_open(struct inode *inode, struct file *file)
  */
 static void *nfs_volume_list_start(struct seq_file *m, loff_t *_pos)
 {
-       struct list_head *_p;
-       loff_t pos = *_pos;
-
        /* lock the list against modification */
        spin_lock(&nfs_client_lock);
-
-       /* allow for the header line */
-       if (!pos)
-               return SEQ_START_TOKEN;
-       pos--;
-
-       /* find the n'th element in the list */
-       list_for_each(_p, &nfs_volume_list)
-               if (!pos--)
-                       break;
-
-       return _p != &nfs_volume_list ? _p : NULL;
+       return seq_list_start_head(&nfs_volume_list, *_pos);
 }
 
 /*
@@ -1321,14 +1286,7 @@ static void *nfs_volume_list_start(struct seq_file *m, loff_t *_pos)
  */
 static void *nfs_volume_list_next(struct seq_file *p, void *v, loff_t *pos)
 {
-       struct list_head *_p;
-
-       (*pos)++;
-
-       _p = v;
-       _p = (v == SEQ_START_TOKEN) ? nfs_volume_list.next : _p->next;
-
-       return _p != &nfs_volume_list ? _p : NULL;
+       return seq_list_next(v, &nfs_volume_list, pos);
 }
 
 /*
@@ -1349,7 +1307,7 @@ static int nfs_volume_list_show(struct seq_file *m, void *v)
        char dev[8], fsid[17];
 
        /* display header on line 1 */
-       if (v == SEQ_START_TOKEN) {
+       if (v == &nfs_volume_list) {
                seq_puts(m, "NV SERVER   PORT DEV     FSID\n");
                return 0;
        }
index a7ade138d684eddf54efcfa907e0e0c94eba60e7..f499dd7c3905bfcee723ab86bf231b13dc27300a 100644 (file)
@@ -36,11 +36,9 @@ obj-$(CONFIG_NLS_ISO8859_6)  += nls_iso8859-6.o
 obj-$(CONFIG_NLS_ISO8859_7)    += nls_iso8859-7.o
 obj-$(CONFIG_NLS_ISO8859_8)    += nls_cp1255.o
 obj-$(CONFIG_NLS_ISO8859_9)    += nls_iso8859-9.o
-obj-$(CONFIG_NLS_ISO8859_10)   += nls_iso8859-10.o
 obj-$(CONFIG_NLS_ISO8859_13)   += nls_iso8859-13.o
 obj-$(CONFIG_NLS_ISO8859_14)   += nls_iso8859-14.o
 obj-$(CONFIG_NLS_ISO8859_15)   += nls_iso8859-15.o
 obj-$(CONFIG_NLS_KOI8_R)       += nls_koi8-r.o
 obj-$(CONFIG_NLS_KOI8_U)       += nls_koi8-u.o nls_koi8-ru.o
-obj-$(CONFIG_NLS_ABC)          += nls_abc.o
 obj-$(CONFIG_NLS_UTF8)         += nls_utf8.o
index 0d515d1619747b00e724471a407f2a6cf6ea51d7..be6a457f4226374b9d462cd8ee4332326ea22097 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -855,7 +855,7 @@ EXPORT_SYMBOL(dentry_open);
 /*
  * Find an empty file descriptor entry, and mark it busy.
  */
-int get_unused_fd(void)
+int get_unused_fd_flags(int flags)
 {
        struct files_struct * files = current->files;
        int fd, error;
@@ -891,7 +891,10 @@ repeat:
        }
 
        FD_SET(fd, fdt->open_fds);
-       FD_CLR(fd, fdt->close_on_exec);
+       if (flags & O_CLOEXEC)
+               FD_SET(fd, fdt->close_on_exec);
+       else
+               FD_CLR(fd, fdt->close_on_exec);
        files->next_fd = fd + 1;
 #if 1
        /* Sanity check */
@@ -907,6 +910,11 @@ out:
        return error;
 }
 
+int get_unused_fd(void)
+{
+       return get_unused_fd_flags(0);
+}
+
 EXPORT_SYMBOL(get_unused_fd);
 
 static void __put_unused_fd(struct files_struct *files, unsigned int fd)
@@ -959,7 +967,7 @@ long do_sys_open(int dfd, const char __user *filename, int flags, int mode)
        int fd = PTR_ERR(tmp);
 
        if (!IS_ERR(tmp)) {
-               fd = get_unused_fd();
+               fd = get_unused_fd_flags(flags);
                if (fd >= 0) {
                        struct file *f = do_filp_open(dfd, tmp, flags, mode);
                        if (IS_ERR(f)) {
index e3491328596bccaf75d89e7208fda194cddf289a..3d3e16631472212bca09147967724161e2f4022d 100644 (file)
@@ -25,6 +25,8 @@
 #define PARTITION_RISCIX_SCSI  2
 #define PARTITION_LINUX                9
 
+#if defined(CONFIG_ACORN_PARTITION_CUMANA) || \
+       defined(CONFIG_ACORN_PARTITION_ADFS)
 static struct adfs_discrecord *
 adfs_partition(struct parsed_partitions *state, char *name, char *data,
               unsigned long first_sector, int slot)
@@ -48,6 +50,7 @@ adfs_partition(struct parsed_partitions *state, char *name, char *data,
        put_partition(state, slot, first_sector, nr_sects);
        return dr;
 }
+#endif
 
 #ifdef CONFIG_ACORN_PARTITION_RISCIX
 
@@ -65,6 +68,8 @@ struct riscix_record {
        struct riscix_part part[8];
 };
 
+#if defined(CONFIG_ACORN_PARTITION_CUMANA) || \
+       defined(CONFIG_ACORN_PARTITION_ADFS)
 static int
 riscix_partition(struct parsed_partitions *state, struct block_device *bdev,
                unsigned long first_sect, int slot, unsigned long nr_sects)
@@ -105,6 +110,7 @@ riscix_partition(struct parsed_partitions *state, struct block_device *bdev,
        return slot;
 }
 #endif
+#endif
 
 #define LINUX_NATIVE_MAGIC 0xdeafa1de
 #define LINUX_SWAP_MAGIC   0xdeafab1e
@@ -115,6 +121,8 @@ struct linux_part {
        __le32 nr_sects;
 };
 
+#if defined(CONFIG_ACORN_PARTITION_CUMANA) || \
+       defined(CONFIG_ACORN_PARTITION_ADFS)
 static int
 linux_partition(struct parsed_partitions *state, struct block_device *bdev,
                unsigned long first_sect, int slot, unsigned long nr_sects)
@@ -146,6 +154,7 @@ linux_partition(struct parsed_partitions *state, struct block_device *bdev,
        put_dev_sector(sect);
        return slot;
 }
+#endif
 
 #ifdef CONFIG_ACORN_PARTITION_CUMANA
 int
index 98e78e2f18d66cb4331d394c8543c3e8db4445a4..9cbab7e93557693dce3e83c6d4b3f8c2b3a6c2c6 100644 (file)
@@ -289,6 +289,15 @@ static inline char *task_cap(struct task_struct *p, char *buffer)
                            cap_t(p->cap_effective));
 }
 
+static inline char *task_context_switch_counts(struct task_struct *p,
+                                               char *buffer)
+{
+       return buffer + sprintf(buffer, "voluntary_ctxt_switches:\t%lu\n"
+                           "nonvoluntary_ctxt_switches:\t%lu\n",
+                           p->nvcsw,
+                           p->nivcsw);
+}
+
 int proc_pid_status(struct task_struct *task, char * buffer)
 {
        char * orig = buffer;
@@ -307,6 +316,7 @@ int proc_pid_status(struct task_struct *task, char * buffer)
 #if defined(CONFIG_S390)
        buffer = task_show_regs(task, buffer);
 #endif
+       buffer = task_context_switch_counts(task, buffer);
        return buffer - orig;
 }
 
@@ -440,8 +450,9 @@ static int do_task_stat(struct task_struct *task, char * buffer, int whole)
 
        /* Temporary variable needed for gcc-2.96 */
        /* convert timespec -> nsec*/
-       start_time = (unsigned long long)task->start_time.tv_sec * NSEC_PER_SEC
-                               + task->start_time.tv_nsec;
+       start_time =
+               (unsigned long long)task->real_start_time.tv_sec * NSEC_PER_SEC
+                               + task->real_start_time.tv_nsec;
        /* convert nsec -> ticks */
        start_time = nsec_to_clock_t(start_time);
 
index 46ea5d56e1bb9bd7a3cf60e163d2e9951832d50d..ae3627337a924acd9d2a0281fd11614900036353 100644 (file)
@@ -67,7 +67,6 @@
 #include <linux/mount.h>
 #include <linux/security.h>
 #include <linux/ptrace.h>
-#include <linux/seccomp.h>
 #include <linux/cpuset.h>
 #include <linux/audit.h>
 #include <linux/poll.h>
@@ -204,12 +203,17 @@ static int proc_pid_environ(struct task_struct *task, char * buffer)
        int res = 0;
        struct mm_struct *mm = get_task_mm(task);
        if (mm) {
-               unsigned int len = mm->env_end - mm->env_start;
+               unsigned int len;
+
+               res = -ESRCH;
+               if (!ptrace_may_attach(task))
+                       goto out;
+
+               len  = mm->env_end - mm->env_start;
                if (len > PAGE_SIZE)
                        len = PAGE_SIZE;
                res = access_process_vm(task, mm->env_start, buffer, len, 0);
-               if (!ptrace_may_attach(task))
-                       res = -ESRCH;
+out:
                mmput(mm);
        }
        return res;
@@ -812,71 +816,6 @@ static const struct file_operations proc_loginuid_operations = {
 };
 #endif
 
-#ifdef CONFIG_SECCOMP
-static ssize_t seccomp_read(struct file *file, char __user *buf,
-                           size_t count, loff_t *ppos)
-{
-       struct task_struct *tsk = get_proc_task(file->f_dentry->d_inode);
-       char __buf[20];
-       size_t len;
-
-       if (!tsk)
-               return -ESRCH;
-       /* no need to print the trailing zero, so use only len */
-       len = sprintf(__buf, "%u\n", tsk->seccomp.mode);
-       put_task_struct(tsk);
-
-       return simple_read_from_buffer(buf, count, ppos, __buf, len);
-}
-
-static ssize_t seccomp_write(struct file *file, const char __user *buf,
-                            size_t count, loff_t *ppos)
-{
-       struct task_struct *tsk = get_proc_task(file->f_dentry->d_inode);
-       char __buf[20], *end;
-       unsigned int seccomp_mode;
-       ssize_t result;
-
-       result = -ESRCH;
-       if (!tsk)
-               goto out_no_task;
-
-       /* can set it only once to be even more secure */
-       result = -EPERM;
-       if (unlikely(tsk->seccomp.mode))
-               goto out;
-
-       result = -EFAULT;
-       memset(__buf, 0, sizeof(__buf));
-       count = min(count, sizeof(__buf) - 1);
-       if (copy_from_user(__buf, buf, count))
-               goto out;
-
-       seccomp_mode = simple_strtoul(__buf, &end, 0);
-       if (*end == '\n')
-               end++;
-       result = -EINVAL;
-       if (seccomp_mode && seccomp_mode <= NR_SECCOMP_MODES) {
-               tsk->seccomp.mode = seccomp_mode;
-               set_tsk_thread_flag(tsk, TIF_SECCOMP);
-       } else
-               goto out;
-       result = -EIO;
-       if (unlikely(!(end - __buf)))
-               goto out;
-       result = end - __buf;
-out:
-       put_task_struct(tsk);
-out_no_task:
-       return result;
-}
-
-static const struct file_operations proc_seccomp_operations = {
-       .read           = seccomp_read,
-       .write          = seccomp_write,
-};
-#endif /* CONFIG_SECCOMP */
-
 #ifdef CONFIG_FAULT_INJECTION
 static ssize_t proc_fault_inject_read(struct file * file, char __user * buf,
                                      size_t count, loff_t *ppos)
@@ -2037,9 +1976,6 @@ static const struct pid_entry tgid_base_stuff[] = {
        REG("numa_maps",  S_IRUGO, numa_maps),
 #endif
        REG("mem",        S_IRUSR|S_IWUSR, mem),
-#ifdef CONFIG_SECCOMP
-       REG("seccomp",    S_IRUSR|S_IWUSR, seccomp),
-#endif
        LNK("cwd",        cwd),
        LNK("root",       root),
        LNK("exe",        exe),
@@ -2324,9 +2260,6 @@ static const struct pid_entry tid_base_stuff[] = {
        REG("numa_maps", S_IRUGO, numa_maps),
 #endif
        REG("mem",       S_IRUSR|S_IWUSR, mem),
-#ifdef CONFIG_SECCOMP
-       REG("seccomp",   S_IRUSR|S_IWUSR, seccomp),
-#endif
        LNK("cwd",       cwd),
        LNK("root",      root),
        LNK("exe",       exe),
index 8a40e15f5ecb90333f7eca84ede39c40e7adb945..b5e7155d30d8e60724dc3807507a1b67f7acbd56 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/namei.h>
 #include <linux/bitops.h>
 #include <linux/spinlock.h>
+#include <linux/completion.h>
 #include <asm/uaccess.h>
 
 #include "internal.h"
@@ -529,12 +530,6 @@ static int proc_register(struct proc_dir_entry * dir, struct proc_dir_entry * dp
                return -EAGAIN;
        dp->low_ino = i;
 
-       spin_lock(&proc_subdir_lock);
-       dp->next = dir->subdir;
-       dp->parent = dir;
-       dir->subdir = dp;
-       spin_unlock(&proc_subdir_lock);
-
        if (S_ISDIR(dp->mode)) {
                if (dp->proc_iops == NULL) {
                        dp->proc_fops = &proc_dir_operations;
@@ -550,6 +545,13 @@ static int proc_register(struct proc_dir_entry * dir, struct proc_dir_entry * dp
                if (dp->proc_iops == NULL)
                        dp->proc_iops = &proc_file_inode_operations;
        }
+
+       spin_lock(&proc_subdir_lock);
+       dp->next = dir->subdir;
+       dp->parent = dir;
+       dir->subdir = dp;
+       spin_unlock(&proc_subdir_lock);
+
        return 0;
 }
 
@@ -613,6 +615,9 @@ static struct proc_dir_entry *proc_create(struct proc_dir_entry **parent,
        ent->namelen = len;
        ent->mode = mode;
        ent->nlink = nlink;
+       ent->pde_users = 0;
+       spin_lock_init(&ent->pde_unload_lock);
+       ent->pde_unload_completion = NULL;
  out:
        return ent;
 }
@@ -649,9 +654,6 @@ struct proc_dir_entry *proc_mkdir_mode(const char *name, mode_t mode,
 
        ent = proc_create(&parent, name, S_IFDIR | mode, 2);
        if (ent) {
-               ent->proc_fops = &proc_dir_operations;
-               ent->proc_iops = &proc_dir_inode_operations;
-
                if (proc_register(parent, ent) < 0) {
                        kfree(ent);
                        ent = NULL;
@@ -686,10 +688,6 @@ struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,
 
        ent = proc_create(&parent,name,mode,nlink);
        if (ent) {
-               if (S_ISDIR(mode)) {
-                       ent->proc_fops = &proc_dir_operations;
-                       ent->proc_iops = &proc_dir_inode_operations;
-               }
                if (proc_register(parent, ent) < 0) {
                        kfree(ent);
                        ent = NULL;
@@ -734,9 +732,35 @@ void remove_proc_entry(const char *name, struct proc_dir_entry *parent)
                de = *p;
                *p = de->next;
                de->next = NULL;
+
+               spin_lock(&de->pde_unload_lock);
+               /*
+                * Stop accepting new callers into module. If you're
+                * dynamically allocating ->proc_fops, save a pointer somewhere.
+                */
+               de->proc_fops = NULL;
+               /* Wait until all existing callers into module are done. */
+               if (de->pde_users > 0) {
+                       DECLARE_COMPLETION_ONSTACK(c);
+
+                       if (!de->pde_unload_completion)
+                               de->pde_unload_completion = &c;
+
+                       spin_unlock(&de->pde_unload_lock);
+                       spin_unlock(&proc_subdir_lock);
+
+                       wait_for_completion(de->pde_unload_completion);
+
+                       spin_lock(&proc_subdir_lock);
+                       goto continue_removing;
+               }
+               spin_unlock(&de->pde_unload_lock);
+
+continue_removing:
                if (S_ISDIR(de->mode))
                        parent->nlink--;
-               proc_kill_inodes(de);
+               if (!S_ISREG(de->mode))
+                       proc_kill_inodes(de);
                de->nlink = 0;
                WARN_ON(de->subdir);
                if (!atomic_read(&de->count))
index d5ce65c68d7b2b538a87c0a58de0863941db6ff3..dd28e86ab422fe23e06969cebf14c3677a6c8902 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/mm.h>
 #include <linux/string.h>
 #include <linux/stat.h>
+#include <linux/completion.h>
 #include <linux/file.h>
 #include <linux/limits.h>
 #include <linux/init.h>
@@ -140,6 +141,251 @@ static const struct super_operations proc_sops = {
        .remount_fs     = proc_remount,
 };
 
+static void pde_users_dec(struct proc_dir_entry *pde)
+{
+       spin_lock(&pde->pde_unload_lock);
+       pde->pde_users--;
+       if (pde->pde_unload_completion && pde->pde_users == 0)
+               complete(pde->pde_unload_completion);
+       spin_unlock(&pde->pde_unload_lock);
+}
+
+static loff_t proc_reg_llseek(struct file *file, loff_t offset, int whence)
+{
+       struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode);
+       loff_t rv = -EINVAL;
+       loff_t (*llseek)(struct file *, loff_t, int);
+
+       spin_lock(&pde->pde_unload_lock);
+       /*
+        * remove_proc_entry() is going to delete PDE (as part of module
+        * cleanup sequence). No new callers into module allowed.
+        */
+       if (!pde->proc_fops) {
+               spin_unlock(&pde->pde_unload_lock);
+               return rv;
+       }
+       /*
+        * Bump refcount so that remove_proc_entry will wail for ->llseek to
+        * complete.
+        */
+       pde->pde_users++;
+       /*
+        * Save function pointer under lock, to protect against ->proc_fops
+        * NULL'ifying right after ->pde_unload_lock is dropped.
+        */
+       llseek = pde->proc_fops->llseek;
+       spin_unlock(&pde->pde_unload_lock);
+
+       if (!llseek)
+               llseek = default_llseek;
+       rv = llseek(file, offset, whence);
+
+       pde_users_dec(pde);
+       return rv;
+}
+
+static ssize_t proc_reg_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
+{
+       struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode);
+       ssize_t rv = -EIO;
+       ssize_t (*read)(struct file *, char __user *, size_t, loff_t *);
+
+       spin_lock(&pde->pde_unload_lock);
+       if (!pde->proc_fops) {
+               spin_unlock(&pde->pde_unload_lock);
+               return rv;
+       }
+       pde->pde_users++;
+       read = pde->proc_fops->read;
+       spin_unlock(&pde->pde_unload_lock);
+
+       if (read)
+               rv = read(file, buf, count, ppos);
+
+       pde_users_dec(pde);
+       return rv;
+}
+
+static ssize_t proc_reg_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
+{
+       struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode);
+       ssize_t rv = -EIO;
+       ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *);
+
+       spin_lock(&pde->pde_unload_lock);
+       if (!pde->proc_fops) {
+               spin_unlock(&pde->pde_unload_lock);
+               return rv;
+       }
+       pde->pde_users++;
+       write = pde->proc_fops->write;
+       spin_unlock(&pde->pde_unload_lock);
+
+       if (write)
+               rv = write(file, buf, count, ppos);
+
+       pde_users_dec(pde);
+       return rv;
+}
+
+static unsigned int proc_reg_poll(struct file *file, struct poll_table_struct *pts)
+{
+       struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode);
+       unsigned int rv = 0;
+       unsigned int (*poll)(struct file *, struct poll_table_struct *);
+
+       spin_lock(&pde->pde_unload_lock);
+       if (!pde->proc_fops) {
+               spin_unlock(&pde->pde_unload_lock);
+               return rv;
+       }
+       pde->pde_users++;
+       poll = pde->proc_fops->poll;
+       spin_unlock(&pde->pde_unload_lock);
+
+       if (poll)
+               rv = poll(file, pts);
+
+       pde_users_dec(pde);
+       return rv;
+}
+
+static long proc_reg_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+       struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode);
+       long rv = -ENOTTY;
+       long (*unlocked_ioctl)(struct file *, unsigned int, unsigned long);
+       int (*ioctl)(struct inode *, struct file *, unsigned int, unsigned long);
+
+       spin_lock(&pde->pde_unload_lock);
+       if (!pde->proc_fops) {
+               spin_unlock(&pde->pde_unload_lock);
+               return rv;
+       }
+       pde->pde_users++;
+       unlocked_ioctl = pde->proc_fops->unlocked_ioctl;
+       ioctl = pde->proc_fops->ioctl;
+       spin_unlock(&pde->pde_unload_lock);
+
+       if (unlocked_ioctl) {
+               rv = unlocked_ioctl(file, cmd, arg);
+               if (rv == -ENOIOCTLCMD)
+                       rv = -EINVAL;
+       } else if (ioctl) {
+               lock_kernel();
+               rv = ioctl(file->f_path.dentry->d_inode, file, cmd, arg);
+               unlock_kernel();
+       }
+
+       pde_users_dec(pde);
+       return rv;
+}
+
+#ifdef CONFIG_COMPAT
+static long proc_reg_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+       struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode);
+       long rv = -ENOTTY;
+       long (*compat_ioctl)(struct file *, unsigned int, unsigned long);
+
+       spin_lock(&pde->pde_unload_lock);
+       if (!pde->proc_fops) {
+               spin_unlock(&pde->pde_unload_lock);
+               return rv;
+       }
+       pde->pde_users++;
+       compat_ioctl = pde->proc_fops->compat_ioctl;
+       spin_unlock(&pde->pde_unload_lock);
+
+       if (compat_ioctl)
+               rv = compat_ioctl(file, cmd, arg);
+
+       pde_users_dec(pde);
+       return rv;
+}
+#endif
+
+static int proc_reg_mmap(struct file *file, struct vm_area_struct *vma)
+{
+       struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode);
+       int rv = -EIO;
+       int (*mmap)(struct file *, struct vm_area_struct *);
+
+       spin_lock(&pde->pde_unload_lock);
+       if (!pde->proc_fops) {
+               spin_unlock(&pde->pde_unload_lock);
+               return rv;
+       }
+       pde->pde_users++;
+       mmap = pde->proc_fops->mmap;
+       spin_unlock(&pde->pde_unload_lock);
+
+       if (mmap)
+               rv = mmap(file, vma);
+
+       pde_users_dec(pde);
+       return rv;
+}
+
+static int proc_reg_open(struct inode *inode, struct file *file)
+{
+       struct proc_dir_entry *pde = PDE(inode);
+       int rv = 0;
+       int (*open)(struct inode *, struct file *);
+
+       spin_lock(&pde->pde_unload_lock);
+       if (!pde->proc_fops) {
+               spin_unlock(&pde->pde_unload_lock);
+               return rv;
+       }
+       pde->pde_users++;
+       open = pde->proc_fops->open;
+       spin_unlock(&pde->pde_unload_lock);
+
+       if (open)
+               rv = open(inode, file);
+
+       pde_users_dec(pde);
+       return rv;
+}
+
+static int proc_reg_release(struct inode *inode, struct file *file)
+{
+       struct proc_dir_entry *pde = PDE(inode);
+       int rv = 0;
+       int (*release)(struct inode *, struct file *);
+
+       spin_lock(&pde->pde_unload_lock);
+       if (!pde->proc_fops) {
+               spin_unlock(&pde->pde_unload_lock);
+               return rv;
+       }
+       pde->pde_users++;
+       release = pde->proc_fops->release;
+       spin_unlock(&pde->pde_unload_lock);
+
+       if (release)
+               rv = release(inode, file);
+
+       pde_users_dec(pde);
+       return rv;
+}
+
+static const struct file_operations proc_reg_file_ops = {
+       .llseek         = proc_reg_llseek,
+       .read           = proc_reg_read,
+       .write          = proc_reg_write,
+       .poll           = proc_reg_poll,
+       .unlocked_ioctl = proc_reg_unlocked_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl   = proc_reg_compat_ioctl,
+#endif
+       .mmap           = proc_reg_mmap,
+       .open           = proc_reg_open,
+       .release        = proc_reg_release,
+};
+
 struct inode *proc_get_inode(struct super_block *sb, unsigned int ino,
                                struct proc_dir_entry *de)
 {
@@ -166,8 +412,12 @@ struct inode *proc_get_inode(struct super_block *sb, unsigned int ino,
                        inode->i_nlink = de->nlink;
                if (de->proc_iops)
                        inode->i_op = de->proc_iops;
-               if (de->proc_fops)
-                       inode->i_fop = de->proc_fops;
+               if (de->proc_fops) {
+                       if (S_ISREG(inode->i_mode))
+                               inode->i_fop = &proc_reg_file_ops;
+                       else
+                               inode->i_fop = de->proc_fops;
+               }
        }
 
        return inode;
index 5fd49e47f83a7c8a1d20ee07d6d6e13d0df9d6ab..d24b8d46059a4e284b1af8f194a8b328bfb15fbb 100644 (file)
@@ -105,6 +105,7 @@ static int uptime_read_proc(char *page, char **start, off_t off,
        cputime_t idletime = cputime_add(init_task.utime, init_task.stime);
 
        do_posix_clock_monotonic_gettime(&uptime);
+       monotonic_to_bootbased(&uptime);
        cputime_to_timespec(idletime, &idle);
        len = sprintf(page,"%lu.%02lu %lu.%02lu\n",
                        (unsigned long) uptime.tv_sec,
@@ -443,12 +444,12 @@ static int show_stat(struct seq_file *p, void *v)
        unsigned long jif;
        cputime64_t user, nice, system, idle, iowait, irq, softirq, steal;
        u64 sum = 0;
+       struct timespec boottime;
 
        user = nice = system = idle = iowait =
                irq = softirq = steal = cputime64_zero;
-       jif = - wall_to_monotonic.tv_sec;
-       if (wall_to_monotonic.tv_nsec)
-               --jif;
+       getboottime(&boottime);
+       jif = boottime.tv_sec;
 
        for_each_possible_cpu(i) {
                int j;
index b3a473b0a191a41d9b27fab13b9990fdc7c9463f..22846225acfaa933b992ed4e787199960b601757 100644 (file)
@@ -69,7 +69,7 @@ static void show_tty_range(struct seq_file *m, struct tty_driver *p,
 
 static int show_tty_driver(struct seq_file *m, void *v)
 {
-       struct tty_driver *p = v;
+       struct tty_driver *p = list_entry(v, struct tty_driver, tty_drivers);
        dev_t from = MKDEV(p->major, p->minor_start);
        dev_t to = from + p->num;
 
@@ -106,22 +106,13 @@ static int show_tty_driver(struct seq_file *m, void *v)
 /* iterator */
 static void *t_start(struct seq_file *m, loff_t *pos)
 {
-       struct list_head *p;
-       loff_t l = *pos;
-
        mutex_lock(&tty_mutex);
-       list_for_each(p, &tty_drivers)
-               if (!l--)
-                       return list_entry(p, struct tty_driver, tty_drivers);
-       return NULL;
+       return seq_list_start(&tty_drivers, *pos);
 }
 
 static void *t_next(struct seq_file *m, void *v, loff_t *pos)
 {
-       struct list_head *p = ((struct tty_driver *)v)->tty_drivers.next;
-       (*pos)++;
-       return p==&tty_drivers ? NULL :
-                       list_entry(p, struct tty_driver, tty_drivers);
+       return seq_list_next(v, &tty_drivers, pos);
 }
 
 static void t_stop(struct seq_file *m, void *v)
index 9f237d6182c90e10129f6810279da32259fab6fe..e6577ac15a6cd1e2df52890e1338b0392c321f44 100644 (file)
 #include <linux/slab.h>
 #include <asm/current.h>
 #include <asm/uaccess.h>
+#include <linux/compat.h>
 #include <linux/kernel.h>
 #include <linux/security.h>
 #include <linux/syscalls.h>
 #include <linux/buffer_head.h>
 #include <linux/capability.h>
 #include <linux/quotaops.h>
+#include <linux/types.h>
 
 /* Check validity of generic quotactl commands */
 static int generic_quotactl_valid(struct super_block *sb, int type, int cmd, qid_t id)
@@ -384,3 +386,119 @@ asmlinkage long sys_quotactl(unsigned int cmd, const char __user *special, qid_t
 
        return ret;
 }
+
+#if defined(CONFIG_X86_64) || defined(CONFIG_IA64)
+/*
+ * This code works only for 32 bit quota tools over 64 bit OS (x86_64, ia64)
+ * and is necessary due to alignment problems.
+ */
+struct compat_if_dqblk {
+       compat_u64 dqb_bhardlimit;
+       compat_u64 dqb_bsoftlimit;
+       compat_u64 dqb_curspace;
+       compat_u64 dqb_ihardlimit;
+       compat_u64 dqb_isoftlimit;
+       compat_u64 dqb_curinodes;
+       compat_u64 dqb_btime;
+       compat_u64 dqb_itime;
+       compat_uint_t dqb_valid;
+};
+
+/* XFS structures */
+struct compat_fs_qfilestat {
+       compat_u64 dqb_bhardlimit;
+       compat_u64 qfs_nblks;
+       compat_uint_t qfs_nextents;
+};
+
+struct compat_fs_quota_stat {
+       __s8            qs_version;
+       __u16           qs_flags;
+       __s8            qs_pad;
+       struct compat_fs_qfilestat      qs_uquota;
+       struct compat_fs_qfilestat      qs_gquota;
+       compat_uint_t   qs_incoredqs;
+       compat_int_t    qs_btimelimit;
+       compat_int_t    qs_itimelimit;
+       compat_int_t    qs_rtbtimelimit;
+       __u16           qs_bwarnlimit;
+       __u16           qs_iwarnlimit;
+};
+
+asmlinkage long sys32_quotactl(unsigned int cmd, const char __user *special,
+                                               qid_t id, void __user *addr)
+{
+       unsigned int cmds;
+       struct if_dqblk __user *dqblk;
+       struct compat_if_dqblk __user *compat_dqblk;
+       struct fs_quota_stat __user *fsqstat;
+       struct compat_fs_quota_stat __user *compat_fsqstat;
+       compat_uint_t data;
+       u16 xdata;
+       long ret;
+
+       cmds = cmd >> SUBCMDSHIFT;
+
+       switch (cmds) {
+       case Q_GETQUOTA:
+               dqblk = compat_alloc_user_space(sizeof(struct if_dqblk));
+               compat_dqblk = addr;
+               ret = sys_quotactl(cmd, special, id, dqblk);
+               if (ret)
+                       break;
+               if (copy_in_user(compat_dqblk, dqblk, sizeof(*compat_dqblk)) ||
+                       get_user(data, &dqblk->dqb_valid) ||
+                       put_user(data, &compat_dqblk->dqb_valid))
+                       ret = -EFAULT;
+               break;
+       case Q_SETQUOTA:
+               dqblk = compat_alloc_user_space(sizeof(struct if_dqblk));
+               compat_dqblk = addr;
+               ret = -EFAULT;
+               if (copy_in_user(dqblk, compat_dqblk, sizeof(*compat_dqblk)) ||
+                       get_user(data, &compat_dqblk->dqb_valid) ||
+                       put_user(data, &dqblk->dqb_valid))
+                       break;
+               ret = sys_quotactl(cmd, special, id, dqblk);
+               break;
+       case Q_XGETQSTAT:
+               fsqstat = compat_alloc_user_space(sizeof(struct fs_quota_stat));
+               compat_fsqstat = addr;
+               ret = sys_quotactl(cmd, special, id, fsqstat);
+               if (ret)
+                       break;
+               ret = -EFAULT;
+               /* Copying qs_version, qs_flags, qs_pad */
+               if (copy_in_user(compat_fsqstat, fsqstat,
+                       offsetof(struct compat_fs_quota_stat, qs_uquota)))
+                       break;
+               /* Copying qs_uquota */
+               if (copy_in_user(&compat_fsqstat->qs_uquota,
+                       &fsqstat->qs_uquota,
+                       sizeof(compat_fsqstat->qs_uquota)) ||
+                       get_user(data, &fsqstat->qs_uquota.qfs_nextents) ||
+                       put_user(data, &compat_fsqstat->qs_uquota.qfs_nextents))
+                       break;
+               /* Copying qs_gquota */
+               if (copy_in_user(&compat_fsqstat->qs_gquota,
+                       &fsqstat->qs_gquota,
+                       sizeof(compat_fsqstat->qs_gquota)) ||
+                       get_user(data, &fsqstat->qs_gquota.qfs_nextents) ||
+                       put_user(data, &compat_fsqstat->qs_gquota.qfs_nextents))
+                       break;
+               /* Copying the rest */
+               if (copy_in_user(&compat_fsqstat->qs_incoredqs,
+                       &fsqstat->qs_incoredqs,
+                       sizeof(struct compat_fs_quota_stat) -
+                       offsetof(struct compat_fs_quota_stat, qs_incoredqs)) ||
+                       get_user(xdata, &fsqstat->qs_iwarnlimit) ||
+                       put_user(xdata, &compat_fsqstat->qs_iwarnlimit))
+                       break;
+               ret = 0;
+               break;
+       default:
+               ret = sys_quotactl(cmd, special, id, addr);
+       }
+       return ret;
+}
+#endif
index 30eebfb1b2d8d7e9cf26474329d28fd28f401665..2070aeee2a521f7c106ba3fd68601a99b6807532 100644 (file)
@@ -1305,7 +1305,6 @@ static ssize_t reiserfs_file_write(struct file *file,     /* the file we are going t
        if (get_inode_item_key_version (inode) == KEY_FORMAT_3_5 &&
            *ppos + count > MAX_NON_LFS) {
                if (*ppos >= MAX_NON_LFS) {
-                       send_sig(SIGXFSZ, current, 0);
                        return -EFBIG;
                }
                if (count > MAX_NON_LFS - (unsigned long)*ppos)
index 49194a4e6b91ba9dcd22c3aa7fe81f794aca4413..bbb19be260ced1be701c3651f8e5b6a94a0bb593 100644 (file)
@@ -177,21 +177,23 @@ EXPORT_SYMBOL(seq_read);
 
 static int traverse(struct seq_file *m, loff_t offset)
 {
-       loff_t pos = 0;
+       loff_t pos = 0, index;
        int error = 0;
        void *p;
 
        m->version = 0;
-       m->index = 0;
+       index = 0;
        m->count = m->from = 0;
-       if (!offset)
+       if (!offset) {
+               m->index = index;
                return 0;
+       }
        if (!m->buf) {
                m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL);
                if (!m->buf)
                        return -ENOMEM;
        }
-       p = m->op->start(m, &m->index);
+       p = m->op->start(m, &index);
        while (p) {
                error = PTR_ERR(p);
                if (IS_ERR(p))
@@ -204,15 +206,17 @@ static int traverse(struct seq_file *m, loff_t offset)
                if (pos + m->count > offset) {
                        m->from = offset - pos;
                        m->count -= m->from;
+                       m->index = index;
                        break;
                }
                pos += m->count;
                m->count = 0;
                if (pos == offset) {
-                       m->index++;
+                       index++;
+                       m->index = index;
                        break;
                }
-               p = m->op->next(m, p, &m->index);
+               p = m->op->next(m, p, &index);
        }
        m->op->stop(m, p);
        return error;
@@ -260,8 +264,8 @@ loff_t seq_lseek(struct file *file, loff_t offset, int origin)
                                }
                        }
        }
-       mutex_unlock(&m->lock);
        file->f_version = m->version;
+       mutex_unlock(&m->lock);
        return retval;
 }
 EXPORT_SYMBOL(seq_lseek);
index 5260d620c555fbd987eed1642649c0372670ace9..fc8ebedc6bed1aa901e24ebf8e34fd397cc6361e 100644 (file)
@@ -884,6 +884,7 @@ vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void
        error = type->get_sb(type, flags, name, data, mnt);
        if (error < 0)
                goto out_free_secdata;
+       BUG_ON(!mnt->mnt_sb);
 
        error = security_sb_kern_mount(mnt->mnt_sb, secdata);
        if (error)
index 1b82a4adc2f7594ae11cc9151200be3135449f8d..ef2bfaa19d75be46edff821d6db7fbc604f248e3 100644 (file)
@@ -106,8 +106,8 @@ int main(void)
 {
        unsigned short x;
 
-       x = udf_crc16(bytes, sizeof bytes);
-       printf("udf_crc16: calculated = %4.4x, correct = %4.4x\n", x, 0x3299U);
+       x = udf_crc(bytes, sizeof bytes);
+       printf("udf_crc: calculated = %4.4x, correct = %4.4x\n", x, 0x3299U);
 
        return 0;
 }
index 8206983f2ebf924c1bf91629206fbc518d014c69..10f3188738af3694331d8ff803586165b7a2b338 100644 (file)
@@ -50,7 +50,7 @@ void udf_free_inode(struct inode * inode)
                else
                        UDF_SB_LVIDIU(sb)->numFiles =
                                cpu_to_le32(le32_to_cpu(UDF_SB_LVIDIU(sb)->numFiles) - 1);
-               
+
                mark_buffer_dirty(sbi->s_lvidbh);
        }
        mutex_unlock(&sbi->s_alloc_mutex);
@@ -136,6 +136,13 @@ struct inode * udf_new_inode (struct inode *dir, int mode, int * err)
                UDF_I_EFE(inode) = 0;
                UDF_I_DATA(inode) = kzalloc(inode->i_sb->s_blocksize - sizeof(struct fileEntry), GFP_KERNEL);
        }
+       if (!UDF_I_DATA(inode))
+       {
+               iput(inode);
+               *err = -ENOMEM;
+               mutex_unlock(&sbi->s_alloc_mutex);
+               return NULL;
+       }
        if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_AD_IN_ICB))
                UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_IN_ICB;
        else if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
index bf7de0bdbab3b6554cbf7ba3eb20dc8ad92a7183..5b82e489af7851f476ad2ecf381c6466b77edf48 100644 (file)
@@ -49,6 +49,7 @@ MODULE_LICENSE("GPL");
 static mode_t udf_convert_permissions(struct fileEntry *);
 static int udf_update_inode(struct inode *, int);
 static void udf_fill_inode(struct inode *, struct buffer_head *);
+static int udf_alloc_i_data(struct inode *inode, size_t size);
 static struct buffer_head *inode_getblk(struct inode *, sector_t, int *,
        long *, int *);
 static int8_t udf_insert_aext(struct inode *, struct extent_position,
@@ -734,7 +735,7 @@ static void udf_split_extents(struct inode *inode, int *c, int offset, int newbl
                        (*c) ++;
                        (*endnum) ++;
                }
-               
+
                laarr[curr].extLocation.logicalBlockNum = newblocknum;
                if (etype == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
                        laarr[curr].extLocation.partitionReferenceNum =
@@ -836,7 +837,7 @@ static void udf_prealloc_extents(struct inode *inode, int c, int lastblock,
                                {
                                        numalloc -= elen;
                                        if (*endnum > (i+1))
-                                               memmove(&laarr[i], &laarr[i+1], 
+                                               memmove(&laarr[i], &laarr[i+1],
                                                        sizeof(long_ad) * (*endnum - (i+1)));
                                        i --;
                                        (*endnum) --;
@@ -1024,7 +1025,7 @@ void udf_truncate(struct inode * inode)
        {
                block_truncate_page(inode->i_mapping, inode->i_size, udf_get_block);
                udf_truncate_extents(inode);
-       }       
+       }
 
        inode->i_mtime = inode->i_ctime = current_fs_time(inode->i_sb);
        if (IS_SYNC(inode))
@@ -1087,10 +1088,10 @@ __udf_read_inode(struct inode *inode)
                        {
                                kernel_lb_addr loc;
                                ie = (struct indirectEntry *)ibh->b_data;
-       
+
                                loc = lelb_to_cpu(ie->indirectICB.extLocation);
-       
-                               if (ie->indirectICB.extLength && 
+
+                               if (ie->indirectICB.extLength &&
                                        (nbh = udf_read_ptagged(inode->i_sb, loc, 0, &ident)))
                                {
                                        if (ident == TAG_IDENT_FE ||
@@ -1156,14 +1157,22 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
        {
                UDF_I_EFE(inode) = 1;
                UDF_I_USE(inode) = 0;
-               UDF_I_DATA(inode) = kmalloc(inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry), GFP_KERNEL);
+               if (udf_alloc_i_data(inode, inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry)))
+               {
+                       make_bad_inode(inode);
+                       return;
+               }
                memcpy(UDF_I_DATA(inode), bh->b_data + sizeof(struct extendedFileEntry), inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry));
        }
        else if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_FE)
        {
                UDF_I_EFE(inode) = 0;
                UDF_I_USE(inode) = 0;
-               UDF_I_DATA(inode) = kmalloc(inode->i_sb->s_blocksize - sizeof(struct fileEntry), GFP_KERNEL);
+               if (udf_alloc_i_data(inode, inode->i_sb->s_blocksize - sizeof(struct fileEntry)))
+               {
+                       make_bad_inode(inode);
+                       return;
+               }
                memcpy(UDF_I_DATA(inode), bh->b_data + sizeof(struct fileEntry), inode->i_sb->s_blocksize - sizeof(struct fileEntry));
        }
        else if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_USE)
@@ -1173,7 +1182,11 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
                UDF_I_LENALLOC(inode) =
                        le32_to_cpu(
                                ((struct unallocSpaceEntry *)bh->b_data)->lengthAllocDescs);
-               UDF_I_DATA(inode) = kmalloc(inode->i_sb->s_blocksize - sizeof(struct unallocSpaceEntry), GFP_KERNEL);
+               if (udf_alloc_i_data(inode, inode->i_sb->s_blocksize - sizeof(struct unallocSpaceEntry)))
+               {
+                       make_bad_inode(inode);
+                       return;
+               }
                memcpy(UDF_I_DATA(inode), bh->b_data + sizeof(struct unallocSpaceEntry), inode->i_sb->s_blocksize - sizeof(struct unallocSpaceEntry));
                return;
        }
@@ -1191,7 +1204,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
        inode->i_nlink = le16_to_cpu(fe->fileLinkCount);
        if (!inode->i_nlink)
                inode->i_nlink = 1;
-       
+
        inode->i_size = le64_to_cpu(fe->informationLength);
        UDF_I_LENEXTENTS(inode) = inode->i_size;
 
@@ -1243,7 +1256,7 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
        }
        else
        {
-               inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) << 
+               inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) <<
                        (inode->i_sb->s_blocksize_bits - 9);
 
                if ( udf_stamp_to_time(&convtime, &convtime_usec,
@@ -1374,6 +1387,20 @@ static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
        }
 }
 
+static int udf_alloc_i_data(struct inode *inode, size_t size)
+{
+       UDF_I_DATA(inode) = kmalloc(size, GFP_KERNEL);
+
+       if (!UDF_I_DATA(inode))
+       {
+               printk(KERN_ERR "udf:udf_alloc_i_data (ino %ld) no free memory\n",
+                      inode->i_ino);
+               return -ENOMEM;
+       }
+
+       return 0;
+}
+
 static mode_t
 udf_convert_permissions(struct fileEntry *fe)
 {
@@ -2072,7 +2099,7 @@ int8_t udf_delete_aext(struct inode *inode, struct extent_position epos,
                        mark_buffer_dirty_inode(oepos.bh, inode);
                }
        }
-       
+
        brelse(epos.bh);
        brelse(oepos.bh);
        return (elen >> 30);
index 22ff6ed55ce9a2d685024bfadf3aabb1eed68fa5..2b3011689e89e4aff651b3f3f8ca05775d3d4a78 100644 (file)
@@ -87,6 +87,7 @@
 #include <linux/smp_lock.h>
 #include <linux/buffer_head.h>
 #include <linux/vfs.h>
+#include <linux/log2.h>
 
 #include "swab.h"
 #include "util.h"
@@ -854,7 +855,7 @@ magic_found:
        uspi->s_fmask = fs32_to_cpu(sb, usb1->fs_fmask);
        uspi->s_fshift = fs32_to_cpu(sb, usb1->fs_fshift);
 
-       if (uspi->s_fsize & (uspi->s_fsize - 1)) {
+       if (!is_power_of_2(uspi->s_fsize)) {
                printk(KERN_ERR "ufs_read_super: fragment size %u is not a power of 2\n",
                        uspi->s_fsize);
                        goto failed;
@@ -869,7 +870,7 @@ magic_found:
                        uspi->s_fsize);
                goto failed;
        }
-       if (uspi->s_bsize & (uspi->s_bsize - 1)) {
+       if (!is_power_of_2(uspi->s_bsize)) {
                printk(KERN_ERR "ufs_read_super: block size %u is not a power of 2\n",
                        uspi->s_bsize);
                goto failed;
index 21a86f1a05b30d88d8d15b4792a194e83080ba71..ab5b60dcef19f5b3ea7bf17ed2cdfaea1ddf42f4 100644 (file)
@@ -4,6 +4,7 @@
 #ifdef __KERNEL__
 
 #include <linux/kernel.h>
+#include <linux/mm.h>
 #include <asm/compiler.h>
 #include <asm/system.h>
 #include <asm/pgtable.h>
@@ -90,6 +91,11 @@ static inline void * phys_to_virt(unsigned long address)
 
 #define page_to_phys(page)     page_to_pa(page)
 
+static inline dma_addr_t __deprecated isa_page_to_bus(struct page *page)
+{
+       return page_to_phys(page);
+}
+
 /* This depends on working iommu.  */
 #define BIO_VMERGE_BOUNDARY    (alpha_mv.mv_pci_tbi ? PAGE_SIZE : 0)
 
@@ -102,12 +108,12 @@ static inline void * phys_to_virt(unsigned long address)
  *
  * Note that this only works for a limited range of kernel addresses,
  * and very well may not span all memory.  Consider this interface 
- * deprecated in favour of the mapping functions in <asm/pci.h>.
+ * deprecated in favour of the DMA-mapping API.
  */
 extern unsigned long __direct_map_base;
 extern unsigned long __direct_map_size;
 
-static inline unsigned long virt_to_bus(void *address)
+static inline unsigned long __deprecated virt_to_bus(void *address)
 {
        unsigned long phys = virt_to_phys(address);
        unsigned long bus = phys + __direct_map_base;
@@ -115,7 +121,7 @@ static inline unsigned long virt_to_bus(void *address)
 }
 #define isa_virt_to_bus virt_to_bus
 
-static inline void *bus_to_virt(unsigned long address)
+static inline void * __deprecated bus_to_virt(unsigned long address)
 {
        void *virt;
 
@@ -126,6 +132,7 @@ static inline void *bus_to_virt(unsigned long address)
        virt = phys_to_virt(address);
        return (long)address <= 0 ? NULL : virt;
 }
+#define isa_bus_to_virt bus_to_virt
 
 /*
  * There are different chipsets to interface the Alpha CPUs to the world.
index 616d20662ff343cec53dbd069487cae7013f7298..99037b0323570c1e4831e1ec2228bc455fcabef0 100644 (file)
@@ -264,21 +264,15 @@ extern inline void pgd_clear(pgd_t * pgdp)        { pgd_val(*pgdp) = 0; }
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
  */
-extern inline int pte_read(pte_t pte)          { return !(pte_val(pte) & _PAGE_FOR); }
 extern inline int pte_write(pte_t pte)         { return !(pte_val(pte) & _PAGE_FOW); }
-extern inline int pte_exec(pte_t pte)          { return !(pte_val(pte) & _PAGE_FOE); }
 extern inline int pte_dirty(pte_t pte)         { return pte_val(pte) & _PAGE_DIRTY; }
 extern inline int pte_young(pte_t pte)         { return pte_val(pte) & _PAGE_ACCESSED; }
 extern inline int pte_file(pte_t pte)          { return pte_val(pte) & _PAGE_FILE; }
 
 extern inline pte_t pte_wrprotect(pte_t pte)   { pte_val(pte) |= _PAGE_FOW; return pte; }
-extern inline pte_t pte_rdprotect(pte_t pte)   { pte_val(pte) |= _PAGE_FOR; return pte; }
-extern inline pte_t pte_exprotect(pte_t pte)   { pte_val(pte) |= _PAGE_FOE; return pte; }
 extern inline pte_t pte_mkclean(pte_t pte)     { pte_val(pte) &= ~(__DIRTY_BITS); return pte; }
 extern inline pte_t pte_mkold(pte_t pte)       { pte_val(pte) &= ~(__ACCESS_BITS); return pte; }
 extern inline pte_t pte_mkwrite(pte_t pte)     { pte_val(pte) &= ~_PAGE_FOW; return pte; }
-extern inline pte_t pte_mkread(pte_t pte)      { pte_val(pte) &= ~_PAGE_FOR; return pte; }
-extern inline pte_t pte_mkexec(pte_t pte)      { pte_val(pte) &= ~_PAGE_FOE; return pte; }
 extern inline pte_t pte_mkdirty(pte_t pte)     { pte_val(pte) |= __DIRTY_BITS; return pte; }
 extern inline pte_t pte_mkyoung(pte_t pte)     { pte_val(pte) |= __ACCESS_BITS; return pte; }
 
index 21dec9f258d822d081a0e7da9251de908f5e0462..cb4c2c9d000a11b3a7f4db387657743fa44c5d55 100644 (file)
@@ -257,9 +257,7 @@ extern struct page *empty_zero_page;
  * Undefined behaviour if not..
  */
 #define pte_present(pte)       (pte_val(pte) & L_PTE_PRESENT)
-#define pte_read(pte)          (pte_val(pte) & L_PTE_USER)
 #define pte_write(pte)         (pte_val(pte) & L_PTE_WRITE)
-#define pte_exec(pte)          (pte_val(pte) & L_PTE_EXEC)
 #define pte_dirty(pte)         (pte_val(pte) & L_PTE_DIRTY)
 #define pte_young(pte)         (pte_val(pte) & L_PTE_YOUNG)
 
@@ -275,12 +273,8 @@ extern struct page *empty_zero_page;
 #define PTE_BIT_FUNC(fn,op) \
 static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; }
 
-/*PTE_BIT_FUNC(rdprotect, &= ~L_PTE_USER);*/
-/*PTE_BIT_FUNC(mkread,    |= L_PTE_USER);*/
 PTE_BIT_FUNC(wrprotect, &= ~L_PTE_WRITE);
 PTE_BIT_FUNC(mkwrite,   |= L_PTE_WRITE);
-PTE_BIT_FUNC(exprotect, &= ~L_PTE_EXEC);
-PTE_BIT_FUNC(mkexec,    |= L_PTE_EXEC);
 PTE_BIT_FUNC(mkclean,   &= ~L_PTE_DIRTY);
 PTE_BIT_FUNC(mkdirty,   |= L_PTE_DIRTY);
 PTE_BIT_FUNC(mkold,     &= ~L_PTE_YOUNG);
diff --git a/include/asm-arm26/dma-mapping.h b/include/asm-arm26/dma-mapping.h
deleted file mode 100644 (file)
index a95eae0..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#include <asm-generic/dma-mapping-broken.h>
-
index ba9c7d81d24e2575f3602a3f4c096b2d87da7a82..8a3296200be1bca7a6af2f44c5fc57157bde89cb 100644 (file)
 #define TIOCSBRK       0x5427  /* BSD compatibility */
 #define TIOCCBRK       0x5428  /* BSD compatibility */
 #define TIOCGSID       0x5429  /* Return the session ID of FD */
+#define TCGETS2                _IOR('T',0x2A, struct termios2)
+#define TCSETS2                _IOW('T',0x2B, struct termios2)
+#define TCSETSW2       _IOW('T',0x2C, struct termios2)
+#define TCSETSF2       _IOW('T',0x2D, struct termios2)
 #define TIOCGPTN       _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
 #define TIOCSPTLCK     _IOW('T',0x31, int)  /* Lock/unlock Pty */
 
index 2b20e9f08857483a100b81fd25751c732682d247..55a1a697d12b350e8c7d3c58e3865cbe3b3ab89f 100644 (file)
@@ -218,9 +218,7 @@ extern struct page *empty_zero_page;
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
  */
-#define pte_read(pte)                   (!(pte_val(pte) & _PAGE_NOT_USER))
 #define pte_write(pte)                  (!(pte_val(pte) & _PAGE_READONLY))
-#define pte_exec(pte)                   (!(pte_val(pte) & _PAGE_NOT_USER))
 #define pte_dirty(pte)                  (!(pte_val(pte) & _PAGE_CLEAN))
 #define pte_young(pte)                  (!(pte_val(pte) & _PAGE_OLD))
 //ONLY when !pte_present() I think. nicked from arm32 (FIXME!)
@@ -231,8 +229,6 @@ static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; }
 
 PTE_BIT_FUNC(wrprotect, |=  _PAGE_READONLY);
 PTE_BIT_FUNC(mkwrite,   &= ~_PAGE_READONLY);
-PTE_BIT_FUNC(exprotect, |=  _PAGE_NOT_USER);
-PTE_BIT_FUNC(mkexec,    &= ~_PAGE_NOT_USER);
 PTE_BIT_FUNC(mkclean,   |=  _PAGE_CLEAN);
 PTE_BIT_FUNC(mkdirty,   &= ~_PAGE_CLEAN);
 PTE_BIT_FUNC(mkold,     |=  _PAGE_OLD);
index f66b51804736988e4323ec4f299f41aa272a66dd..48d2f5c7bcb8ba8cdf4f3fc0489c87f7f9544b3a 100644 (file)
@@ -138,6 +138,7 @@ struct ktermios {
 #define HUPCL  0002000
 #define CLOCAL 0004000
 #define CBAUDEX 0010000
+#define   BOTHER  0010000
 #define    B57600 0010001
 #define   B115200 0010002
 #define   B230400 0010003
@@ -153,10 +154,12 @@ struct ktermios {
 #define  B3000000 0010015
 #define  B3500000 0010016
 #define  B4000000 0010017
-#define CIBAUD   002003600000  /* input baud rate (not used) */
+#define CIBAUD   002003600000          /* input baud rate */
 #define CMSPAR    010000000000         /* mark or space (stick) parity */
 #define CRTSCTS          020000000000          /* flow control */
 
+#define IBSHIFT          16            /* Shift from CBAUD to CIBAUD */
+
 /* c_lflag bits */
 #define ISIG   0000001
 #define ICANON 0000002
index 329c324c4040c9c3fcb0a1302465a4ed88d49209..293e3f1bc3f22c3c41e0ffd62d77ce9f9c66da70 100644 (file)
@@ -82,8 +82,10 @@ struct termio {
        copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
 })
 
-#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios))
-#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios))
+#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2))
+#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2))
+#define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios))
+#define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios))
 
 #endif /* __KERNEL__ */
 
index f6cc2b0f75c3118ce0b7adb3e4f989da042c5d83..c07bdd10b8911733ce4c3fd7ebb3816db36951f6 100644 (file)
@@ -201,18 +201,10 @@ extern struct page *empty_zero_page;
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
  */
-static inline int pte_read(pte_t pte)
-{
-       return pte_val(pte) & _PAGE_USER;
-}
 static inline int pte_write(pte_t pte)
 {
        return pte_val(pte) & _PAGE_RW;
 }
-static inline int pte_exec(pte_t pte)
-{
-       return pte_val(pte) & _PAGE_EXECUTE;
-}
 static inline int pte_dirty(pte_t pte)
 {
        return pte_val(pte) & _PAGE_DIRTY;
@@ -231,21 +223,11 @@ static inline int pte_file(pte_t pte)
 }
 
 /* Mutator functions for PTE bits */
-static inline pte_t pte_rdprotect(pte_t pte)
-{
-       set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_USER));
-       return pte;
-}
 static inline pte_t pte_wrprotect(pte_t pte)
 {
        set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_RW));
        return pte;
 }
-static inline pte_t pte_exprotect(pte_t pte)
-{
-       set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_EXECUTE));
-       return pte;
-}
 static inline pte_t pte_mkclean(pte_t pte)
 {
        set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_DIRTY));
@@ -256,21 +238,11 @@ static inline pte_t pte_mkold(pte_t pte)
        set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_ACCESSED));
        return pte;
 }
-static inline pte_t pte_mkread(pte_t pte)
-{
-       set_pte(&pte, __pte(pte_val(pte) | _PAGE_USER));
-       return pte;
-}
 static inline pte_t pte_mkwrite(pte_t pte)
 {
        set_pte(&pte, __pte(pte_val(pte) | _PAGE_RW));
        return pte;
 }
-static inline pte_t pte_mkexec(pte_t pte)
-{
-       set_pte(&pte, __pte(pte_val(pte) | _PAGE_EXECUTE));
-       return pte;
-}
 static inline pte_t pte_mkdirty(pte_t pte)
 {
        set_pte(&pte, __pte(pte_val(pte) | _PAGE_DIRTY));
index 97787c3c575f5d0e3a8a5147d6a452a1d128c5e6..4f4e52531fa0bc7a07433caace232cdd4f053145 100644 (file)
 #define TIOCSBRK       0x5427  /* BSD compatibility */
 #define TIOCCBRK       0x5428  /* BSD compatibility */
 #define TIOCGSID       0x5429  /* Return the session ID of FD */
+#define TCGETS2                _IOR('T',0x2A, struct termios2)
+#define TCSETS2                _IOW('T',0x2B, struct termios2)
+#define TCSETSW2       _IOW('T',0x2C, struct termios2)
+#define TCSETSF2       _IOW('T',0x2D, struct termios2)
 #define TIOCGPTN       _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
 #define TIOCSPTLCK     _IOW('T',0x31, int)  /* Lock/unlock Pty */
 
index c94a7107019c353086b2493065e13e3159709132..417f71116215d5c80ef84cd5ee828070b4f785cb 100644 (file)
@@ -111,9 +111,7 @@ extern unsigned long empty_zero_page;
  * Undefined behaviour if not..
  */
 
-static inline int pte_read(pte_t pte)           { return pte_val(pte) & _PAGE_READ; }
 static inline int pte_write(pte_t pte)          { return pte_val(pte) & _PAGE_WRITE; }
-static inline int pte_exec(pte_t pte)           { return pte_val(pte) & _PAGE_READ; }
 static inline int pte_dirty(pte_t pte)          { return pte_val(pte) & _PAGE_MODIFIED; }
 static inline int pte_young(pte_t pte)          { return pte_val(pte) & _PAGE_ACCESSED; }
 static inline int pte_file(pte_t pte)           { return pte_val(pte) & _PAGE_FILE; }
@@ -124,18 +122,6 @@ static inline pte_t pte_wrprotect(pte_t pte)
         return pte;
 }
 
-static inline pte_t pte_rdprotect(pte_t pte)
-{
-        pte_val(pte) &= ~(_PAGE_READ | _PAGE_SILENT_READ);
-       return pte;
-}
-
-static inline pte_t pte_exprotect(pte_t pte)
-{
-        pte_val(pte) &= ~(_PAGE_READ | _PAGE_SILENT_READ);
-       return pte;
-}
-
 static inline pte_t pte_mkclean(pte_t pte)
 {
        pte_val(pte) &= ~(_PAGE_MODIFIED | _PAGE_SILENT_WRITE); 
@@ -156,22 +142,6 @@ static inline pte_t pte_mkwrite(pte_t pte)
         return pte;
 }
 
-static inline pte_t pte_mkread(pte_t pte)
-{
-        pte_val(pte) |= _PAGE_READ;
-        if (pte_val(pte) & _PAGE_ACCESSED)
-                pte_val(pte) |= _PAGE_SILENT_READ;
-        return pte;
-}
-
-static inline pte_t pte_mkexec(pte_t pte)
-{
-        pte_val(pte) |= _PAGE_READ;
-        if (pte_val(pte) & _PAGE_ACCESSED)
-                pte_val(pte) |= _PAGE_SILENT_READ;
-        return pte;
-}
-
 static inline pte_t pte_mkdirty(pte_t pte)
 {
         pte_val(pte) |= _PAGE_MODIFIED;
index 6cc2e2736f7ba307c8a7153663f838ba02caeab5..71c1b36269b8b490915e8550183fc79aeff98ba4 100644 (file)
@@ -166,6 +166,7 @@ struct ktermios {
 #define HUPCL  0002000
 #define CLOCAL 0004000
 #define CBAUDEX 0010000
+#define  BOTHER  0010000
 #define  B57600  0010001
 #define  B115200 0010002
 #define  B230400 0010003
index c9dbd4d43368c897c73408d5bfff4a5334351a0c..b0124e6c2e416d7273fe274a9b36d7d7fb65d093 100644 (file)
@@ -81,8 +81,10 @@ struct termio {
        copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
 })
 
-#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios))
-#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios))
+#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2))
+#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2))
+#define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios))
+#define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios))
 
 #endif /* __KERNEL__ */
 
index 114aefae2701fc83914f3114918e55ecbaa160bf..adde699852556e83d19334f7af1cb9e9ab72dab2 100644 (file)
@@ -377,19 +377,13 @@ static inline pmd_t *pmd_offset(pud_t *dir, unsigned long address)
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
  */
-static inline int pte_read(pte_t pte)          { return !((pte).pte & _PAGE_SUPER); }
-static inline int pte_exec(pte_t pte)          { return !((pte).pte & _PAGE_SUPER); }
 static inline int pte_dirty(pte_t pte)         { return (pte).pte & _PAGE_DIRTY; }
 static inline int pte_young(pte_t pte)         { return (pte).pte & _PAGE_ACCESSED; }
 static inline int pte_write(pte_t pte)         { return !((pte).pte & _PAGE_WP); }
 
-static inline pte_t pte_rdprotect(pte_t pte)   { (pte).pte |= _PAGE_SUPER; return pte; }
-static inline pte_t pte_exprotect(pte_t pte)   { (pte).pte |= _PAGE_SUPER; return pte; }
 static inline pte_t pte_mkclean(pte_t pte)     { (pte).pte &= ~_PAGE_DIRTY; return pte; }
 static inline pte_t pte_mkold(pte_t pte)       { (pte).pte &= ~_PAGE_ACCESSED; return pte; }
 static inline pte_t pte_wrprotect(pte_t pte)   { (pte).pte |= _PAGE_WP; return pte; }
-static inline pte_t pte_mkread(pte_t pte)      { (pte).pte &= ~_PAGE_SUPER; return pte; }
-static inline pte_t pte_mkexec(pte_t pte)      { (pte).pte &= ~_PAGE_SUPER; return pte; }
 static inline pte_t pte_mkdirty(pte_t pte)     { (pte).pte |= _PAGE_DIRTY; return pte; }
 static inline pte_t pte_mkyoung(pte_t pte)     { (pte).pte |= _PAGE_ACCESSED; return pte; }
 static inline pte_t pte_mkwrite(pte_t pte)     { (pte).pte &= ~_PAGE_WP; return pte; }
index d0ea6789b31e530cca93f92716aa474ff3a7bc45..7306c71a89262a3fd70c533e8790686ed861bad6 100644 (file)
 #define __NR_move_pages                317
 #define __NR_getcpu            318
 #define __NR_epoll_pwait       319
+#define __NR_utimensat         320
+#define __NR_signalfd          321
+#define __NR_timerfd           322
+#define __NR_eventfd           323
 
 #ifdef __KERNEL__
 
-#define NR_syscalls 320
+#define NR_syscalls 324
 
 #define __ARCH_WANT_IPC_PARSE_VERSION
 /* #define __ARCH_WANT_OLD_READDIR */
index 29413d3d460574476c1dc3249efd7b3ca9e2cb32..e2468f894d2aab0d2e22d1fa87b86ab03160b7cb 100644 (file)
@@ -1,24 +1,82 @@
 #ifndef _ASM_GENERIC_DMA_MAPPING_H
 #define _ASM_GENERIC_DMA_MAPPING_H
 
-/* This is used for archs that do not support DMA */
+/* define the dma api to allow compilation but not linking of
+ * dma dependent code.  Code that depends on the dma-mapping
+ * API needs to set 'depends on HAS_DMA' in its Kconfig
+ */
 
-static inline void *
+struct scatterlist;
+
+extern void *
 dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
-                  gfp_t flag)
-{
-       BUG();
-       return NULL;
-}
+                  gfp_t flag);
 
-static inline void
+extern void
 dma_free_coherent(struct device *dev, size_t size, void *cpu_addr,
-                   dma_addr_t dma_handle)
-{
-       BUG();
-}
+                   dma_addr_t dma_handle);
 
 #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
 #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
 
+extern dma_addr_t
+dma_map_single(struct device *dev, void *ptr, size_t size,
+              enum dma_data_direction direction);
+
+extern void
+dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
+                enum dma_data_direction direction);
+
+extern int
+dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
+          enum dma_data_direction direction);
+
+extern void
+dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries,
+            enum dma_data_direction direction);
+
+extern dma_addr_t
+dma_map_page(struct device *dev, struct page *page, unsigned long offset,
+            size_t size, enum dma_data_direction direction);
+
+extern void
+dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
+              enum dma_data_direction direction);
+
+extern void
+dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
+                       enum dma_data_direction direction);
+
+extern void
+dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle,
+                             unsigned long offset, size_t size,
+                             enum dma_data_direction direction);
+
+extern void
+dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
+                   enum dma_data_direction direction);
+
+#define dma_sync_single_for_device dma_sync_single_for_cpu
+#define dma_sync_single_range_for_device dma_sync_single_range_for_cpu
+#define dma_sync_sg_for_device dma_sync_sg_for_cpu
+
+extern int
+dma_mapping_error(dma_addr_t dma_addr);
+
+extern int
+dma_supported(struct device *dev, u64 mask);
+
+extern int
+dma_set_mask(struct device *dev, u64 mask);
+
+extern int
+dma_get_cache_alignment(void);
+
+extern int
+dma_is_consistent(struct device *dev, dma_addr_t dma_handle);
+
+extern void
+dma_cache_sync(struct device *dev, void *vaddr, size_t size,
+              enum dma_data_direction direction);
+
 #endif /* _ASM_GENERIC_DMA_MAPPING_H */
index c154b9d6e7e51a8593d06b0d6e3104aa7008e5d4..b8477414c5c85858de58d6489673da501f93d7bf 100644 (file)
@@ -48,6 +48,9 @@
 #ifndef O_NOATIME
 #define O_NOATIME      01000000
 #endif
+#ifndef O_CLOEXEC
+#define O_CLOEXEC      02000000        /* set close_on_exec */
+#endif
 #ifndef O_NDELAY
 #define O_NDELAY       O_NONBLOCK
 #endif
diff --git a/include/asm-h8300/dma-mapping.h b/include/asm-h8300/dma-mapping.h
deleted file mode 100644 (file)
index d00e400..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <asm-generic/dma-mapping-broken.h>
index ac20457e5978dd05c93f940f266f79f9f2c49987..98a53d067269f60cf96e5629149da0bc9a80b910 100644 (file)
 #define TIOCSBRK       0x5427  /* BSD compatibility */
 #define TIOCCBRK       0x5428  /* BSD compatibility */
 #define TIOCGSID       0x5429  /* Return the session ID of FD */
+#define TCGETS2                _IOR('T',0x2A, struct termios2)
+#define TCSETS2                _IOW('T',0x2B, struct termios2)
+#define TCSETSW2       _IOW('T',0x2C, struct termios2)
+#define TCSETSF2       _IOW('T',0x2D, struct termios2)
 #define TIOCGPTN       _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
 #define TIOCSPTLCK     _IOW('T',0x31, int)  /* Lock/unlock Pty */
 
index e877b40ac5ba4762d80cb386e1511d21eb95d9df..31eca81db3f711d6ee2d61407981004d77030a9d 100644 (file)
@@ -141,6 +141,7 @@ struct ktermios {
 #define HUPCL  0002000
 #define CLOCAL 0004000
 #define CBAUDEX 0010000
+#define    BOTHER 0010000
 #define    B57600 0010001
 #define   B115200 0010002
 #define   B230400 0010003
@@ -156,10 +157,12 @@ struct ktermios {
 #define  B3000000 0010015
 #define  B3500000 0010016
 #define  B4000000 0010017
-#define CIBAUD   002003600000  /* input baud rate (not used) */
+#define CIBAUD   002003600000          /* input baud rate */
 #define CMSPAR   010000000000          /* mark or space (stick) parity */
 #define CRTSCTS          020000000000          /* flow control */
 
+#define IBSHIFT          16                    /* shift from CBAUD to CIBAUD */
+
 /* c_lflag bits */
 #define ISIG   0000001
 #define ICANON 0000002
index fb2925d08c491e21acff0564e960520eac178bb1..70eea64b4213bfb69ed205654c03b4dca3ac668d 100644 (file)
@@ -82,8 +82,10 @@ struct termio {
        copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
 })
 
-#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios))
-#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios))
+#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2))
+#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2))
+#define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios))
+#define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios))
 
 #endif /* __KERNEL__ */
 
index 45f09dc9caff4afe5692b0a05ae38b7a144acc1d..aee4009a498ef818037abe7925a13a0d2ed61e38 100644 (file)
@@ -92,6 +92,7 @@ static inline struct thread_info *current_thread_info(void)
 #define TIF_POLLING_NRFLAG     4       /* true if poll_idle() is polling
                                           TIF_NEED_RESCHED */
 #define TIF_MEMDIE             5
+#define TIF_RESTORE_SIGMASK    6       /* restore signal mask in do_signal() */
 
 /* as above, but as bit values */
 #define _TIF_SYSCALL_TRACE     (1<<TIF_SYSCALL_TRACE)
@@ -99,6 +100,7 @@ static inline struct thread_info *current_thread_info(void)
 #define _TIF_SIGPENDING                (1<<TIF_SIGPENDING)
 #define _TIF_NEED_RESCHED      (1<<TIF_NEED_RESCHED)
 #define _TIF_POLLING_NRFLAG    (1<<TIF_POLLING_NRFLAG)
+#define _TIF_RESTORE_SIGMASK   (1<<TIF_RESTORE_SIGMASK)
 
 #define _TIF_WORK_MASK         0x0000FFFE      /* work to do on interrupt/exception return */
 
index 80ea052ee3a4e1bce7f4c9f0f8564fffada8b538..249e753ac8053fd3c7b37ccf2a17eec20e2164aa 100644 (file)
@@ -54,6 +54,8 @@ extern unsigned long __FIXADDR_TOP;
 enum fixed_addresses {
        FIX_HOLE,
        FIX_VDSO,
+       FIX_DBGP_BASE,
+       FIX_EARLYCON_MEM_BASE,
 #ifdef CONFIG_X86_LOCAL_APIC
        FIX_APIC_BASE,  /* local (CPU) APIC) -- required for SMP or not */
 #endif
index 0fc240c80f49c146e2799ebb19fd8078d9c2bdef..e7817a3d6578009f29d750884010933266ca5f3c 100644 (file)
@@ -40,14 +40,13 @@ static __inline__ int ide_default_irq(unsigned long base)
 
 static __inline__ unsigned long ide_default_io_base(int index)
 {
-       struct pci_dev *pdev;
        /*
         *      If PCI is present then it is not safe to poke around
         *      the other legacy IDE ports. Only 0x1f0 and 0x170 are
         *      defined compatibility mode ports for PCI. A user can 
         *      override this using ide= but we must default safe.
         */
-       if ((pdev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL)) == NULL) {
+       if (no_pci_devices()) {
                switch(index) {
                        case 2: return 0x1e8;
                        case 3: return 0x168;
@@ -55,7 +54,6 @@ static __inline__ unsigned long ide_default_io_base(int index)
                        case 5: return 0x160;
                }
        }
-       pci_dev_put(pdev);
        switch (index) {
                case 0: return 0x1f0;
                case 1: return 0x170;
index e797586a5bfc6fcbfa03cbcfe07ca40f07a81210..7b65b5b0003439c15852912d587ffc2a80ec293c 100644 (file)
@@ -129,6 +129,7 @@ extern void iounmap(volatile void __iomem *addr);
  */
 extern void *bt_ioremap(unsigned long offset, unsigned long size);
 extern void bt_iounmap(void *addr, unsigned long size);
+extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys);
 
 /* Use early IO mappings for DMI because it's initialized early */
 #define dmi_ioremap bt_ioremap
index a50fd1773de8fa3b6312472c5a1f75211fe03124..84b03cf56a791ce9130914544059b8df1f12b923 100644 (file)
@@ -56,14 +56,6 @@ static inline pte_t native_ptep_get_and_clear(pte_t *xp)
 #define pfn_pte(pfn, prot)     __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
 #define pfn_pmd(pfn, prot)     __pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
 
-/*
- * All present user pages are user-executable:
- */
-static inline int pte_exec(pte_t pte)
-{
-       return pte_user(pte);
-}
-
 /*
  * All present pages are kernel-executable:
  */
index eb0f1d7e96a169365a277e3817f6a50aced276ba..948a334141184f09e486baa971ed321cb6727f6f 100644 (file)
 #define pud_bad(pud)                           0
 #define pud_present(pud)                       1
 
-/*
- * Is the pte executable?
- */
-static inline int pte_x(pte_t pte)
-{
-       return !(pte_val(pte) & _PAGE_NX);
-}
-
-/*
- * All present user-pages with !NX bit are user-executable:
- */
-static inline int pte_exec(pte_t pte)
-{
-       return pte_user(pte) && pte_x(pte);
-}
 /*
  * All present pages with !NX bit are kernel-executable:
  */
 static inline int pte_exec_kernel(pte_t pte)
 {
-       return pte_x(pte);
+       return !(pte_val(pte) & _PAGE_NX);
 }
 
 /* Rules for using set_pte: the pte being assigned *must* be
index 628fa7747d0cce02dfd866c181c31dbd413c952c..01734e05e63b1a8752f8349a2f346456c3c602e7 100644 (file)
@@ -79,7 +79,7 @@ void paging_init(void);
  * area for the same reason. ;)
  */
 #define VMALLOC_OFFSET (8*1024*1024)
-#define VMALLOC_START  (((unsigned long) high_memory + vmalloc_earlyreserve + \
+#define VMALLOC_START  (((unsigned long) high_memory + \
                        2*VMALLOC_OFFSET-1) & ~(VMALLOC_OFFSET-1))
 #ifdef CONFIG_HIGHMEM
 # define VMALLOC_END   (PKMAP_BASE-2*PAGE_SIZE)
@@ -218,8 +218,6 @@ extern unsigned long pg0[];
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
  */
-static inline int pte_user(pte_t pte)          { return (pte).pte_low & _PAGE_USER; }
-static inline int pte_read(pte_t pte)          { return (pte).pte_low & _PAGE_USER; }
 static inline int pte_dirty(pte_t pte)         { return (pte).pte_low & _PAGE_DIRTY; }
 static inline int pte_young(pte_t pte)         { return (pte).pte_low & _PAGE_ACCESSED; }
 static inline int pte_write(pte_t pte)         { return (pte).pte_low & _PAGE_RW; }
@@ -230,13 +228,9 @@ static inline int pte_huge(pte_t pte)              { return (pte).pte_low & _PAGE_PSE; }
  */
 static inline int pte_file(pte_t pte)          { return (pte).pte_low & _PAGE_FILE; }
 
-static inline pte_t pte_rdprotect(pte_t pte)   { (pte).pte_low &= ~_PAGE_USER; return pte; }
-static inline pte_t pte_exprotect(pte_t pte)   { (pte).pte_low &= ~_PAGE_USER; return pte; }
 static inline pte_t pte_mkclean(pte_t pte)     { (pte).pte_low &= ~_PAGE_DIRTY; return pte; }
 static inline pte_t pte_mkold(pte_t pte)       { (pte).pte_low &= ~_PAGE_ACCESSED; return pte; }
 static inline pte_t pte_wrprotect(pte_t pte)   { (pte).pte_low &= ~_PAGE_RW; return pte; }
-static inline pte_t pte_mkread(pte_t pte)      { (pte).pte_low |= _PAGE_USER; return pte; }
-static inline pte_t pte_mkexec(pte_t pte)      { (pte).pte_low |= _PAGE_USER; return pte; }
 static inline pte_t pte_mkdirty(pte_t pte)     { (pte).pte_low |= _PAGE_DIRTY; return pte; }
 static inline pte_t pte_mkyoung(pte_t pte)     { (pte).pte_low |= _PAGE_ACCESSED; return pte; }
 static inline pte_t pte_mkwrite(pte_t pte)     { (pte).pte_low |= _PAGE_RW; return pte; }
index 94e0c147c165333b853941f547460b4efe783371..422cffef00c901b0c301d308b77c7e70e557719c 100644 (file)
@@ -228,6 +228,10 @@ extern int bootloader_type;
 
 #define HAVE_ARCH_PICK_MMAP_LAYOUT
 
+extern void hard_disable_TSC(void);
+extern void disable_TSC(void);
+extern void hard_enable_TSC(void);
+
 /*
  * Size of io_bitmap.
  */
index 4cb0f91ae64f3dc01e7a945012fe6184be784fd4..54424e045e01a239da8b7ce2db080c741ff34275 100644 (file)
@@ -137,6 +137,7 @@ static inline struct thread_info *current_thread_info(void)
 #define TIF_DEBUG              17      /* uses debug registers */
 #define TIF_IO_BITMAP          18      /* uses I/O bitmap */
 #define TIF_FREEZE             19      /* is freezing for suspend */
+#define TIF_NOTSC              20      /* TSC is not accessible in userland */
 
 #define _TIF_SYSCALL_TRACE     (1<<TIF_SYSCALL_TRACE)
 #define _TIF_NOTIFY_RESUME     (1<<TIF_NOTIFY_RESUME)
@@ -151,6 +152,7 @@ static inline struct thread_info *current_thread_info(void)
 #define _TIF_DEBUG             (1<<TIF_DEBUG)
 #define _TIF_IO_BITMAP         (1<<TIF_IO_BITMAP)
 #define _TIF_FREEZE            (1<<TIF_FREEZE)
+#define _TIF_NOTSC             (1<<TIF_NOTSC)
 
 /* work to do on interrupt/exception return */
 #define _TIF_WORK_MASK \
@@ -160,7 +162,8 @@ static inline struct thread_info *current_thread_info(void)
 #define _TIF_ALLWORK_MASK      (0x0000FFFF & ~_TIF_SECCOMP)
 
 /* flags to check in __switch_to() */
-#define _TIF_WORK_CTXSW (_TIF_DEBUG|_TIF_IO_BITMAP)
+#define _TIF_WORK_CTXSW_NEXT (_TIF_IO_BITMAP | _TIF_NOTSC | _TIF_DEBUG)
+#define _TIF_WORK_CTXSW_PREV (_TIF_IO_BITMAP | _TIF_NOTSC)
 
 /*
  * Thread-synchronous status.
index 40d01d80610d0c148019ce77b9f4e37a553a65f8..0f6e5264ab8fcccefa2da67faa794fec3d79d206 100644 (file)
@@ -31,8 +31,10 @@ typedef s32          compat_timer_t;
 
 typedef s32            compat_int_t;
 typedef s32            compat_long_t;
+typedef s64 __attribute__((aligned(4))) compat_s64;
 typedef u32            compat_uint_t;
 typedef u32            compat_ulong_t;
+typedef u64 __attribute__((aligned(4))) compat_u64;
 
 struct compat_timespec {
        compat_time_t   tv_sec;
index 6580f31b31352c414fa55f6e5ddadcf287a9e9e3..f923d811c421aaccf9f018c54b5cb6fb50a64236 100644 (file)
@@ -297,8 +297,6 @@ ia64_phys_addr_valid (unsigned long addr)
 /*
  * The following have defined behavior only work if pte_present() is true.
  */
-#define pte_user(pte)          ((pte_val(pte) & _PAGE_PL_MASK) == _PAGE_PL_3)
-#define pte_read(pte)          (((pte_val(pte) & _PAGE_AR_MASK) >> _PAGE_AR_SHIFT) < 6)
 #define pte_write(pte) ((unsigned) (((pte_val(pte) & _PAGE_AR_MASK) >> _PAGE_AR_SHIFT) - 2) <= 4)
 #define pte_exec(pte)          ((pte_val(pte) & _PAGE_AR_RX) != 0)
 #define pte_dirty(pte)         ((pte_val(pte) & _PAGE_D) != 0)
@@ -310,7 +308,6 @@ ia64_phys_addr_valid (unsigned long addr)
  */
 #define pte_wrprotect(pte)     (__pte(pte_val(pte) & ~_PAGE_AR_RW))
 #define pte_mkwrite(pte)       (__pte(pte_val(pte) | _PAGE_AR_RW))
-#define pte_mkexec(pte)                (__pte(pte_val(pte) | _PAGE_AR_RX))
 #define pte_mkold(pte)         (__pte(pte_val(pte) & ~_PAGE_A))
 #define pte_mkyoung(pte)       (__pte(pte_val(pte) | _PAGE_A))
 #define pte_mkclean(pte)       (__pte(pte_val(pte) & ~_PAGE_D))
diff --git a/include/asm-m32r/dma-mapping.h b/include/asm-m32r/dma-mapping.h
deleted file mode 100644 (file)
index f9b58eb..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _ASM_M32R_DMA_MAPPING_H
-#define _ASM_M32R_DMA_MAPPING_H
-
-#include <asm-generic/dma-mapping-broken.h>
-
-#endif /* _ASM_M32R_DMA_MAPPING_H */
index d23cfc45738a0c4bf3dc193f85114e811dfbda29..b9f54bb5d7cfb226704e1c51321fe46cad6da777 100644 (file)
 #define TIOCSBRK       0x5427  /* BSD compatibility */
 #define TIOCCBRK       0x5428  /* BSD compatibility */
 #define TIOCGSID       0x5429  /* Return the session ID of FD */
+#define TCGETS2                _IOR('T',0x2A, struct termios2)
+#define TCSETS2                _IOW('T',0x2B, struct termios2)
+#define TCSETSW2       _IOW('T',0x2C, struct termios2)
+#define TCSETSF2       _IOW('T',0x2D, struct termios2)
 #define TIOCGPTN       _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
 #define TIOCSPTLCK     _IOW('T',0x31, int)  /* Lock/unlock Pty */
 
index 6604303fc47cd281e54e5abee4d62c62e0022834..35af58c6b812c95d5ed580a55e23a13d80db72ca 100644 (file)
@@ -191,16 +191,6 @@ extern unsigned long empty_zero_page[1024];
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
  */
-static inline int pte_read(pte_t pte)
-{
-       return pte_val(pte) & _PAGE_READ;
-}
-
-static inline int pte_exec(pte_t pte)
-{
-       return pte_val(pte) & _PAGE_EXEC;
-}
-
 static inline int pte_dirty(pte_t pte)
 {
        return pte_val(pte) & _PAGE_DIRTY;
@@ -224,18 +214,6 @@ static inline int pte_file(pte_t pte)
        return pte_val(pte) & _PAGE_FILE;
 }
 
-static inline pte_t pte_rdprotect(pte_t pte)
-{
-       pte_val(pte) &= ~_PAGE_READ;
-       return pte;
-}
-
-static inline pte_t pte_exprotect(pte_t pte)
-{
-       pte_val(pte) &= ~_PAGE_EXEC;
-       return pte;
-}
-
 static inline pte_t pte_mkclean(pte_t pte)
 {
        pte_val(pte) &= ~_PAGE_DIRTY;
@@ -254,18 +232,6 @@ static inline pte_t pte_wrprotect(pte_t pte)
        return pte;
 }
 
-static inline pte_t pte_mkread(pte_t pte)
-{
-       pte_val(pte) |= _PAGE_READ;
-       return pte;
-}
-
-static inline pte_t pte_mkexec(pte_t pte)
-{
-       pte_val(pte) |= _PAGE_EXEC;
-       return pte;
-}
-
 static inline pte_t pte_mkdirty(pte_t pte)
 {
        pte_val(pte) |= _PAGE_DIRTY;
index 6be3b8a39841956307ba831e88edcaa3b121ba5a..bc104008b55b533af1f273dd7750279753566bd7 100644 (file)
@@ -140,6 +140,7 @@ struct ktermios {
 #define HUPCL  0002000
 #define CLOCAL 0004000
 #define CBAUDEX 0010000
+#define    BOTHER 0010000
 #define    B57600 0010001
 #define   B115200 0010002
 #define   B230400 0010003
@@ -155,11 +156,13 @@ struct ktermios {
 #define  B3000000 0010015
 #define  B3500000 0010016
 #define  B4000000 0010017
-#define CIBAUD   002003600000  /* input baud rate (not used) */
+#define CIBAUD   002003600000          /** input baud rate */
 #define CTVB     004000000000          /* VisioBraille Terminal flow control */
 #define CMSPAR   010000000000          /* mark or space (stick) parity */
 #define CRTSCTS          020000000000          /* flow control */
 
+#define        IBSHIFT 16                      /* Shift from CBAUD to CIBAUD */
+
 /* c_lflag bits */
 #define ISIG   0000001
 #define ICANON 0000002
index 4943dd8db44de0e854a970ab6e92d54ccc2fb7d7..93ce79fd342ae7757592d8b73723da23c93cc32f 100644 (file)
@@ -81,8 +81,10 @@ struct termio {
        copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
 })
 
-#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios))
-#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios))
+#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2))
+#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2))
+#define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios))
+#define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios))
 
 #endif /* __KERNEL__ */
 
index b5b78c01eb6c900f427a2e46fbd77039198dfde3..d029b75bcf04b31af41bc79074b76736db4ccad2 100644 (file)
@@ -164,21 +164,15 @@ static inline void pgd_set(pgd_t *pgdp, pmd_t *pmdp)
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
  */
-static inline int pte_read(pte_t pte)          { return 1; }
 static inline int pte_write(pte_t pte)         { return !(pte_val(pte) & _PAGE_RONLY); }
-static inline int pte_exec(pte_t pte)          { return 1; }
 static inline int pte_dirty(pte_t pte)         { return pte_val(pte) & _PAGE_DIRTY; }
 static inline int pte_young(pte_t pte)         { return pte_val(pte) & _PAGE_ACCESSED; }
 static inline int pte_file(pte_t pte)          { return pte_val(pte) & _PAGE_FILE; }
 
 static inline pte_t pte_wrprotect(pte_t pte)   { pte_val(pte) |= _PAGE_RONLY; return pte; }
-static inline pte_t pte_rdprotect(pte_t pte)   { return pte; }
-static inline pte_t pte_exprotect(pte_t pte)   { return pte; }
 static inline pte_t pte_mkclean(pte_t pte)     { pte_val(pte) &= ~_PAGE_DIRTY; return pte; }
 static inline pte_t pte_mkold(pte_t pte)       { pte_val(pte) &= ~_PAGE_ACCESSED; return pte; }
 static inline pte_t pte_mkwrite(pte_t pte)     { pte_val(pte) &= ~_PAGE_RONLY; return pte; }
-static inline pte_t pte_mkread(pte_t pte)      { return pte; }
-static inline pte_t pte_mkexec(pte_t pte)      { return pte; }
 static inline pte_t pte_mkdirty(pte_t pte)     { pte_val(pte) |= _PAGE_DIRTY; return pte; }
 static inline pte_t pte_mkyoung(pte_t pte)     { pte_val(pte) |= _PAGE_ACCESSED; return pte; }
 static inline pte_t pte_mknocache(pte_t pte)
index b9e62c1e7ae3d91bdc0b804046524313b595cef1..b766fc261bdedc5ab67947c2264230d88ecbb119 100644 (file)
@@ -165,21 +165,15 @@ static inline void pgd_clear (pgd_t *pgdp) {}
  * Undefined behaviour if not...
  * [we have the full set here even if they don't change from m68k]
  */
-static inline int pte_read(pte_t pte)          { return 1; }
 static inline int pte_write(pte_t pte)         { return pte_val(pte) & SUN3_PAGE_WRITEABLE; }
-static inline int pte_exec(pte_t pte)          { return 1; }
 static inline int pte_dirty(pte_t pte)         { return pte_val(pte) & SUN3_PAGE_MODIFIED; }
 static inline int pte_young(pte_t pte)         { return pte_val(pte) & SUN3_PAGE_ACCESSED; }
 static inline int pte_file(pte_t pte)          { return pte_val(pte) & SUN3_PAGE_ACCESSED; }
 
 static inline pte_t pte_wrprotect(pte_t pte)   { pte_val(pte) &= ~SUN3_PAGE_WRITEABLE; return pte; }
-static inline pte_t pte_rdprotect(pte_t pte)   { return pte; }
-static inline pte_t pte_exprotect(pte_t pte)   { return pte; }
 static inline pte_t pte_mkclean(pte_t pte)     { pte_val(pte) &= ~SUN3_PAGE_MODIFIED; return pte; }
 static inline pte_t pte_mkold(pte_t pte)       { pte_val(pte) &= ~SUN3_PAGE_ACCESSED; return pte; }
 static inline pte_t pte_mkwrite(pte_t pte)     { pte_val(pte) |= SUN3_PAGE_WRITEABLE; return pte; }
-static inline pte_t pte_mkread(pte_t pte)      { return pte; }
-static inline pte_t pte_mkexec(pte_t pte)      { return pte; }
 static inline pte_t pte_mkdirty(pte_t pte)     { pte_val(pte) |= SUN3_PAGE_MODIFIED; return pte; }
 static inline pte_t pte_mkyoung(pte_t pte)     { pte_val(pte) |= SUN3_PAGE_ACCESSED; return pte; }
 static inline pte_t pte_mknocache(pte_t pte)   { pte_val(pte) |= SUN3_PAGE_NOCACHE; return pte; }
index 67c3f8ec0303bba4e95fdf1eb00b9638d51d62ac..568c76cdd9000aed94b2d7970bbfdb2f446d6973 100644 (file)
@@ -37,8 +37,10 @@ typedef s32          compat_key_t;
 
 typedef s32            compat_int_t;
 typedef s32            compat_long_t;
+typedef s64            compat_s64;
 typedef u32            compat_uint_t;
 typedef u32            compat_ulong_t;
+typedef u64            compat_u64;
 
 struct compat_timespec {
        compat_time_t   tv_sec;
index 27d77d981937008b2e0de983e9f11867c8102c4d..2e2d70d13ff6b0e352d0664b06c8021a599527c4 100644 (file)
@@ -178,9 +178,7 @@ extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
  */
-static inline int pte_user(pte_t pte)  { BUG(); return 0; }
 #if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32_R1)
-static inline int pte_read(pte_t pte)  { return pte.pte_low & _PAGE_READ; }
 static inline int pte_write(pte_t pte) { return pte.pte_low & _PAGE_WRITE; }
 static inline int pte_dirty(pte_t pte) { return pte.pte_low & _PAGE_MODIFIED; }
 static inline int pte_young(pte_t pte) { return pte.pte_low & _PAGE_ACCESSED; }
@@ -193,13 +191,6 @@ static inline pte_t pte_wrprotect(pte_t pte)
        return pte;
 }
 
-static inline pte_t pte_rdprotect(pte_t pte)
-{
-       pte.pte_low  &= ~(_PAGE_READ | _PAGE_SILENT_READ);
-       pte.pte_high &= ~_PAGE_SILENT_READ;
-       return pte;
-}
-
 static inline pte_t pte_mkclean(pte_t pte)
 {
        pte.pte_low  &= ~(_PAGE_MODIFIED | _PAGE_SILENT_WRITE);
@@ -224,16 +215,6 @@ static inline pte_t pte_mkwrite(pte_t pte)
        return pte;
 }
 
-static inline pte_t pte_mkread(pte_t pte)
-{
-       pte.pte_low |= _PAGE_READ;
-       if (pte.pte_low & _PAGE_ACCESSED) {
-               pte.pte_low  |= _PAGE_SILENT_READ;
-               pte.pte_high |= _PAGE_SILENT_READ;
-       }
-       return pte;
-}
-
 static inline pte_t pte_mkdirty(pte_t pte)
 {
        pte.pte_low |= _PAGE_MODIFIED;
@@ -253,7 +234,6 @@ static inline pte_t pte_mkyoung(pte_t pte)
        return pte;
 }
 #else
-static inline int pte_read(pte_t pte)  { return pte_val(pte) & _PAGE_READ; }
 static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_WRITE; }
 static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_MODIFIED; }
 static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; }
@@ -265,12 +245,6 @@ static inline pte_t pte_wrprotect(pte_t pte)
        return pte;
 }
 
-static inline pte_t pte_rdprotect(pte_t pte)
-{
-       pte_val(pte) &= ~(_PAGE_READ | _PAGE_SILENT_READ);
-       return pte;
-}
-
 static inline pte_t pte_mkclean(pte_t pte)
 {
        pte_val(pte) &= ~(_PAGE_MODIFIED|_PAGE_SILENT_WRITE);
@@ -291,14 +265,6 @@ static inline pte_t pte_mkwrite(pte_t pte)
        return pte;
 }
 
-static inline pte_t pte_mkread(pte_t pte)
-{
-       pte_val(pte) |= _PAGE_READ;
-       if (pte_val(pte) & _PAGE_ACCESSED)
-               pte_val(pte) |= _PAGE_SILENT_READ;
-       return pte;
-}
-
 static inline pte_t pte_mkdirty(pte_t pte)
 {
        pte_val(pte) |= _PAGE_MODIFIED;
index 11f4222597a067c1f9c41b60b222078d0bf4dfc9..5a85d1b025c810de6e881931ce0ae3a38574216c 100644 (file)
@@ -31,8 +31,10 @@ typedef s32  compat_timer_t;
 
 typedef s32    compat_int_t;
 typedef s32    compat_long_t;
+typedef s64    compat_s64;
 typedef u32    compat_uint_t;
 typedef u32    compat_ulong_t;
+typedef u64    compat_u64;
 
 struct compat_timespec {
        compat_time_t           tv_sec;
index 317851fa78f3f99b702ba30fff49dea37da728ef..1e1c824764ee1f0202c9012090e06f532eb75e42 100644 (file)
@@ -3,21 +3,22 @@
 
 /* open/fcntl - O_SYNC is only implemented on blocks devices and on files
    located on an ext2 file system */
-#define O_APPEND       00000010
-#define O_BLKSEEK      00000100 /* HPUX only */
-#define O_CREAT                00000400 /* not fcntl */
-#define O_EXCL         00002000 /* not fcntl */
-#define O_LARGEFILE    00004000
-#define O_SYNC         00100000
-#define O_NONBLOCK     00200004 /* HPUX has separate NDELAY & NONBLOCK */
-#define O_NOCTTY       00400000 /* not fcntl */
-#define O_DSYNC                01000000 /* HPUX only */
-#define O_RSYNC                02000000 /* HPUX only */
-#define O_NOATIME      04000000
+#define O_APPEND       000000010
+#define O_BLKSEEK      000000100 /* HPUX only */
+#define O_CREAT                000000400 /* not fcntl */
+#define O_EXCL         000002000 /* not fcntl */
+#define O_LARGEFILE    000004000
+#define O_SYNC         000100000
+#define O_NONBLOCK     000200004 /* HPUX has separate NDELAY & NONBLOCK */
+#define O_NOCTTY       000400000 /* not fcntl */
+#define O_DSYNC                001000000 /* HPUX only */
+#define O_RSYNC                002000000 /* HPUX only */
+#define O_NOATIME      004000000
+#define O_CLOEXEC      010000000 /* set close_on_exec */
 
-#define O_DIRECTORY    00010000 /* must be a directory */
-#define O_NOFOLLOW     00000200 /* don't follow links */
-#define O_INVISIBLE    04000000 /* invisible I/O, for DMAPI/XDSM */
+#define O_DIRECTORY    000010000 /* must be a directory */
+#define O_NOFOLLOW     000000200 /* don't follow links */
+#define O_INVISIBLE    004000000 /* invisible I/O, for DMAPI/XDSM */
 
 #define F_GETLK64      8
 #define F_SETLK64      9
index beb2adb979d9d65afb7dd74f4a810b724bc9cc74..7e222c8ba739ffc90935216d5c183701ab5f3c85 100644 (file)
@@ -335,18 +335,14 @@ extern inline void pgd_clear(pgd_t * pgdp)        { }
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
  */
-extern inline int pte_read(pte_t pte)          { return pte_val(pte) & _PAGE_READ; }
 extern inline int pte_dirty(pte_t pte)         { return pte_val(pte) & _PAGE_DIRTY; }
 extern inline int pte_young(pte_t pte)         { return pte_val(pte) & _PAGE_ACCESSED; }
 extern inline int pte_write(pte_t pte)         { return pte_val(pte) & _PAGE_WRITE; }
 extern inline int pte_file(pte_t pte)          { return pte_val(pte) & _PAGE_FILE; }
-extern inline int pte_user(pte_t pte)          { return pte_val(pte) & _PAGE_USER; }
 
-extern inline pte_t pte_rdprotect(pte_t pte)   { pte_val(pte) &= ~_PAGE_READ; return pte; }
 extern inline pte_t pte_mkclean(pte_t pte)     { pte_val(pte) &= ~_PAGE_DIRTY; return pte; }
 extern inline pte_t pte_mkold(pte_t pte)       { pte_val(pte) &= ~_PAGE_ACCESSED; return pte; }
 extern inline pte_t pte_wrprotect(pte_t pte)   { pte_val(pte) &= ~_PAGE_WRITE; return pte; }
-extern inline pte_t pte_mkread(pte_t pte)      { pte_val(pte) |= _PAGE_READ; return pte; }
 extern inline pte_t pte_mkdirty(pte_t pte)     { pte_val(pte) |= _PAGE_DIRTY; return pte; }
 extern inline pte_t pte_mkyoung(pte_t pte)     { pte_val(pte) |= _PAGE_ACCESSED; return pte; }
 extern inline pte_t pte_mkwrite(pte_t pte)     { pte_val(pte) |= _PAGE_WRITE; return pte; }
index aacaabd28ac10ddcc7175a5cf7fbe293be7205f9..64ab1ddbdf85c5d2cba8ca73750b873b43040a4d 100644 (file)
@@ -33,8 +33,10 @@ typedef s32          compat_timer_t;
 
 typedef s32            compat_int_t;
 typedef s32            compat_long_t;
+typedef s64            compat_s64;
 typedef u32            compat_uint_t;
 typedef u32            compat_ulong_t;
+typedef u64            compat_u64;
 
 struct compat_timespec {
        compat_time_t   tv_sec;
index 7fb730c62f8332cb8cc19a37858f557a8833bf10..973c1c13bdc0aa171e4ed5b0baf08a2152c7c22c 100644 (file)
@@ -512,9 +512,7 @@ extern unsigned long empty_zero_page[1024];
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
  */
-static inline int pte_read(pte_t pte)          { return pte_val(pte) & _PAGE_USER; }
 static inline int pte_write(pte_t pte)         { return pte_val(pte) & _PAGE_RW; }
-static inline int pte_exec(pte_t pte)          { return pte_val(pte) & _PAGE_EXEC; }
 static inline int pte_dirty(pte_t pte)         { return pte_val(pte) & _PAGE_DIRTY; }
 static inline int pte_young(pte_t pte)         { return pte_val(pte) & _PAGE_ACCESSED; }
 static inline int pte_file(pte_t pte)          { return pte_val(pte) & _PAGE_FILE; }
@@ -522,21 +520,13 @@ static inline int pte_file(pte_t pte)             { return pte_val(pte) & _PAGE_FILE; }
 static inline void pte_uncache(pte_t pte)       { pte_val(pte) |= _PAGE_NO_CACHE; }
 static inline void pte_cache(pte_t pte)         { pte_val(pte) &= ~_PAGE_NO_CACHE; }
 
-static inline pte_t pte_rdprotect(pte_t pte) {
-       pte_val(pte) &= ~_PAGE_USER; return pte; }
 static inline pte_t pte_wrprotect(pte_t pte) {
        pte_val(pte) &= ~(_PAGE_RW | _PAGE_HWWRITE); return pte; }
-static inline pte_t pte_exprotect(pte_t pte) {
-       pte_val(pte) &= ~_PAGE_EXEC; return pte; }
 static inline pte_t pte_mkclean(pte_t pte) {
        pte_val(pte) &= ~(_PAGE_DIRTY | _PAGE_HWWRITE); return pte; }
 static inline pte_t pte_mkold(pte_t pte) {
        pte_val(pte) &= ~_PAGE_ACCESSED; return pte; }
 
-static inline pte_t pte_mkread(pte_t pte) {
-       pte_val(pte) |= _PAGE_USER; return pte; }
-static inline pte_t pte_mkexec(pte_t pte) {
-       pte_val(pte) |= _PAGE_USER | _PAGE_EXEC; return pte; }
 static inline pte_t pte_mkwrite(pte_t pte) {
        pte_val(pte) |= _PAGE_RW; return pte; }
 static inline pte_t pte_mkdirty(pte_t pte) {
index 3cfd98f44bfe82286b55b1ca5aa2af442e993c4c..0c879121c8fcaf3ae0bfe3f790bb9faeddb3d2d6 100644 (file)
@@ -232,9 +232,7 @@ static inline pte_t pfn_pte(unsigned long pfn, pgprot_t pgprot)
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
  */
-static inline int pte_read(pte_t pte)  { return pte_val(pte) & _PAGE_USER;}
 static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW;}
-static inline int pte_exec(pte_t pte)  { return pte_val(pte) & _PAGE_EXEC;}
 static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY;}
 static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED;}
 static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE;}
@@ -242,20 +240,12 @@ static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE;}
 static inline void pte_uncache(pte_t pte) { pte_val(pte) |= _PAGE_NO_CACHE; }
 static inline void pte_cache(pte_t pte)   { pte_val(pte) &= ~_PAGE_NO_CACHE; }
 
-static inline pte_t pte_rdprotect(pte_t pte) {
-       pte_val(pte) &= ~_PAGE_USER; return pte; }
-static inline pte_t pte_exprotect(pte_t pte) {
-       pte_val(pte) &= ~_PAGE_EXEC; return pte; }
 static inline pte_t pte_wrprotect(pte_t pte) {
        pte_val(pte) &= ~(_PAGE_RW); return pte; }
 static inline pte_t pte_mkclean(pte_t pte) {
        pte_val(pte) &= ~(_PAGE_DIRTY); return pte; }
 static inline pte_t pte_mkold(pte_t pte) {
        pte_val(pte) &= ~_PAGE_ACCESSED; return pte; }
-static inline pte_t pte_mkread(pte_t pte) {
-       pte_val(pte) |= _PAGE_USER; return pte; }
-static inline pte_t pte_mkexec(pte_t pte) {
-       pte_val(pte) |= _PAGE_USER | _PAGE_EXEC; return pte; }
 static inline pte_t pte_mkwrite(pte_t pte) {
        pte_val(pte) |= _PAGE_RW; return pte; }
 static inline pte_t pte_mkdirty(pte_t pte) {
index 9d0ce9ff584026df772125dff65d5e03c85395b4..18aa776313b9b21a3a7621b4ee816866667c484a 100644 (file)
@@ -533,9 +533,7 @@ static inline int pgd_present(pgd_t pgd)    { return 1; }
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
  */
-static inline int pte_read(pte_t pte)          { return pte_val(pte) & _PAGE_USER; }
 static inline int pte_write(pte_t pte)         { return pte_val(pte) & _PAGE_RW; }
-static inline int pte_exec(pte_t pte)          { return pte_val(pte) & _PAGE_EXEC; }
 static inline int pte_dirty(pte_t pte)         { return pte_val(pte) & _PAGE_DIRTY; }
 static inline int pte_young(pte_t pte)         { return pte_val(pte) & _PAGE_ACCESSED; }
 static inline int pte_file(pte_t pte)          { return pte_val(pte) & _PAGE_FILE; }
@@ -543,21 +541,13 @@ static inline int pte_file(pte_t pte)             { return pte_val(pte) & _PAGE_FILE; }
 static inline void pte_uncache(pte_t pte)       { pte_val(pte) |= _PAGE_NO_CACHE; }
 static inline void pte_cache(pte_t pte)         { pte_val(pte) &= ~_PAGE_NO_CACHE; }
 
-static inline pte_t pte_rdprotect(pte_t pte) {
-       pte_val(pte) &= ~_PAGE_USER; return pte; }
 static inline pte_t pte_wrprotect(pte_t pte) {
        pte_val(pte) &= ~(_PAGE_RW | _PAGE_HWWRITE); return pte; }
-static inline pte_t pte_exprotect(pte_t pte) {
-       pte_val(pte) &= ~_PAGE_EXEC; return pte; }
 static inline pte_t pte_mkclean(pte_t pte) {
        pte_val(pte) &= ~(_PAGE_DIRTY | _PAGE_HWWRITE); return pte; }
 static inline pte_t pte_mkold(pte_t pte) {
        pte_val(pte) &= ~_PAGE_ACCESSED; return pte; }
 
-static inline pte_t pte_mkread(pte_t pte) {
-       pte_val(pte) |= _PAGE_USER; return pte; }
-static inline pte_t pte_mkexec(pte_t pte) {
-       pte_val(pte) |= _PAGE_USER | _PAGE_EXEC; return pte; }
 static inline pte_t pte_mkwrite(pte_t pte) {
        pte_val(pte) |= _PAGE_RW; return pte; }
 static inline pte_t pte_mkdirty(pte_t pte) {
index 296f4f1a20e1a2f8a79c89210091316348141f46..7f4ad623f7d5d93a2f423cd76898c1df52883a51 100644 (file)
@@ -60,8 +60,10 @@ typedef s32          compat_timer_t;
 
 typedef s32            compat_int_t;
 typedef s32            compat_long_t;
+typedef s64            compat_s64;
 typedef u32            compat_uint_t;
 typedef u32            compat_ulong_t;
+typedef u64            compat_u64;
 
 struct compat_timespec {
        compat_time_t   tv_sec;
diff --git a/include/asm-s390/dma-mapping.h b/include/asm-s390/dma-mapping.h
deleted file mode 100644 (file)
index 3f8c12f..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- *  include/asm-s390/dma-mapping.h
- *
- *  S390 version
- *
- *  This file exists so that #include <dma-mapping.h> doesn't break anything.
- */
-
-#ifndef _ASM_DMA_MAPPING_H
-#define _ASM_DMA_MAPPING_H
-
-#endif /* _ASM_DMA_MAPPING_H */
index 0a307bb2f35328d784f15c77fe27cd5f3e0814a9..26215a976127dff569d4016f51ca4da5c7f6bb2e 100644 (file)
@@ -530,14 +530,6 @@ static inline int pte_young(pte_t pte)
        return 0;
 }
 
-static inline int pte_read(pte_t pte)
-{
-       /* All pages are readable since we don't use the fetch
-        * protection bit in the storage key.
-        */
-       return 1;
-}
-
 /*
  * pgd/pmd/pte modification functions
  */
index 5a117ec43c77b165e31b29ac269697136b1f2a05..aeee8da9c54f57dea4036b12686fcf9ec002951a 100644 (file)
@@ -22,7 +22,7 @@ static void __init check_bugs(void)
        current_cpu_data.loops_per_jiffy = loops_per_jiffy;
 
        switch (current_cpu_data.type) {
-       case CPU_SH7604 ... CPU_SH7619:
+       case CPU_SH7619:
                *p++ = '2';
                break;
        case CPU_SH7206:
@@ -35,7 +35,7 @@ static void __init check_bugs(void)
        case CPU_SH7750 ... CPU_SH4_501:
                *p++ = '4';
                break;
-       case CPU_SH7770 ... CPU_SH7785:
+       case CPU_SH7770 ... CPU_SHX3:
                *p++ = '4';
                *p++ = 'a';
                break;
index 9a3cb6ba9d156622d0738be6fd18ba224de9cf4c..7a18649d1ccb873af58880fdd933f4f21d50469a 100644 (file)
@@ -9,6 +9,7 @@
 #define __ASM_SH_CACHE_H
 #ifdef __KERNEL__
 
+#include <linux/init.h>
 #include <asm/cpu/cache.h>
 
 #define SH_CACHE_VALID         1
@@ -48,6 +49,9 @@ struct cache_info {
 
        unsigned long flags;
 };
+
+int __init detect_cpu_and_cache_system(void);
+
 #endif /* __ASSEMBLY__ */
 #endif /* __KERNEL__ */
 #endif /* __ASM_SH_CACHE_H */
index 20b9796842dcf9a875cd0ed7747b54a518471028..f02ba7a672b227c5fb8acfb14a5a5f945f7a5224 100644 (file)
 
 #define L1_CACHE_SHIFT 4
 
-#if defined(CONFIG_CPU_SUBTYPE_SH7604)
-#define CCR            0xfffffe92      /* Address of Cache Control Register */
-
-#define CCR_CACHE_CE   0x01    /* Cache enable */
-#define CCR_CACHE_ID   0x02    /* Instruction Replacement disable */
-#define CCR_CACHE_OD   0x04    /* Data Replacement disable */
-#define CCR_CACHE_TW   0x08    /* Two-way mode */
-#define CCR_CACHE_CP   0x10    /* Cache purge */
-
-#define CACHE_OC_ADDRESS_ARRAY 0x60000000
-
-#define CCR_CACHE_ENABLE       CCR_CACHE_CE
-#define CCR_CACHE_INVALIDATE   CCR_CACHE_CP
-#define CCR_CACHE_ORA          CCR_CACHE_TW
-#define CCR_CACHE_WT           0x00    /* SH-2 is _always_ write-through */
-
-#elif defined(CONFIG_CPU_SUBTYPE_SH7619)
+#if defined(CONFIG_CPU_SUBTYPE_SH7619)
 #define CCR1           0xffffffec
 #define CCR            CCR1
 
@@ -49,5 +33,5 @@
 #define CCR_CACHE_ENABLE       CCR_CACHE_CE
 #define CCR_CACHE_INVALIDATE   CCR_CACHE_CF
 #endif
-#endif /* __ASM_CPU_SH2_CACHE_H */
 
+#endif /* __ASM_CPU_SH2_CACHE_H */
index b2394cf76f491e21012853302efcf401f6bd8f44..4928b08f9d193bf7ff04eb771ff192032d7ada05 100644 (file)
@@ -29,7 +29,7 @@
 #endif
 
 #if defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7710)
-#define TMU_TSTR       0xa412fe92      /* Byte access */
+#define TMU_012_TSTR   0xa412fe92      /* Byte access */
 
 #define TMU0_TCOR      0xa412fe94      /* Long access */
 #define TMU0_TCNT      0xa412fe98      /* Long access */
@@ -44,7 +44,7 @@
 #define TMU2_TCR       0xa412feb4      /* Word access */
 
 #else
-#define TMU_TSTR       0xfffffe92      /* Byte access */
+#define TMU_012_TSTR   0xfffffe92      /* Byte access */
 
 #define TMU0_TCOR      0xfffffe94      /* Long access */
 #define TMU0_TCNT      0xfffffe98      /* Long access */
index 39f41fcd509d78dbc02123bf8ff23fd769f09354..026025b51ceacb86cdcf7365bb55bd74e6f5327f 100644 (file)
@@ -22,6 +22,8 @@
 #define FRQCR0                 0xffc80000
 #define FRQCR1                 0xffc80004
 #define FRQMR1                 0xffc80014
+#elif defined(CONFIG_CPU_SUBTYPE_SHX3)
+#define FRQCR                  0xffc00014
 #else
 #define FRQCR                  0xffc00000
 #define FRQCR_PSTBY            0x0200
index 8a4af126c890f46cfdce9332e8243e0a8ea0b15c..d1e796b9688857349bf40f5883f348309801ff7b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * include/asm-sh/cpu-sh4/timer.h
  *
- * Copyright (C) 2004 Lineo Solutions, Inc. 
+ * Copyright (C) 2004 Lineo Solutions, Inc.
  *
  * This file is subject to the terms and conditions of the GNU General Public
  * License.  See the file "COPYING" in the main directory of this archive
  *     SH7750S/SH7750R
  *     SH7751/SH7751R
  *     SH7760
+ *     SH-X3
  * ---------------------------------------------------------------------------
  */
-
-#if !defined(CONFIG_CPU_SUBTYPE_SH7760)
-#define TMU_TOCR        0xffd80000      /* Byte access */
+#ifdef CONFIG_CPU_SUBTYPE_SHX3
+#define TMU_012_BASE   0xffc10000
+#define TMU_345_BASE   0xffc20000
+#else
+#define TMU_012_BASE   0xffd80000
+#define TMU_345_BASE   0xfe100000
 #endif
-#define TMU_TSTR        0xffd80004      /* Byte access */
 
-#define TMU0_TCOR       0xffd80008      /* Long access */
-#define TMU0_TCNT       0xffd8000c      /* Long access */
-#define TMU0_TCR        0xffd80010      /* Word access */
+#define TMU_TOCR       TMU_012_BASE    /* Not supported on all CPUs */
 
-#define TMU1_TCOR       0xffd80014      /* Long access */
-#define TMU1_TCNT       0xffd80018      /* Long access */
-#define TMU1_TCR        0xffd8001c      /* Word access */
+#define TMU_012_TSTR   (TMU_012_BASE + 0x04)
+#define TMU_345_TSTR   (TMU_345_BASE + 0x04)
 
-#define TMU2_TCOR       0xffd80020      /* Long access */
-#define TMU2_TCNT       0xffd80024      /* Long access */
-#define TMU2_TCR        0xffd80028      /* Word access */
-#define TMU2_TCPR      0xffd8002c      /* Long access */
+#define TMU0_TCOR      (TMU_012_BASE + 0x08)
+#define TMU0_TCNT      (TMU_012_BASE + 0x0c)
+#define TMU0_TCR       (TMU_012_BASE + 0x10)
 
-#if !defined(CONFIG_CPU_SUBTYPE_SH7760)
-#define TMU3_TCOR       0xfe100008      /* Long access */
-#define TMU3_TCNT       0xfe10000c      /* Long access */
-#define TMU3_TCR        0xfe100010      /* Word access */
+#define TMU1_TCOR       (TMU_012_BASE + 0x14)
+#define TMU1_TCNT       (TMU_012_BASE + 0x18)
+#define TMU1_TCR        (TMU_012_BASE + 0x1c)
 
-#define TMU4_TCOR       0xfe100014      /* Long access */
-#define TMU4_TCNT       0xfe100018      /* Long access */
-#define TMU4_TCR        0xfe10001c      /* Word access */
-#endif
+#define TMU2_TCOR       (TMU_012_BASE + 0x20)
+#define TMU2_TCNT       (TMU_012_BASE + 0x24)
+#define TMU2_TCR       (TMU_012_BASE + 0x28)
+#define TMU2_TCPR      (TMU_012_BASE + 0x2c)
 
-#endif /* __ASM_CPU_SH4_TIMER_H */
+#define TMU3_TCOR      (TMU_345_BASE + 0x08)
+#define TMU3_TCNT      (TMU_345_BASE + 0x0c)
+#define TMU3_TCR       (TMU_345_BASE + 0x10)
 
+#define TMU4_TCOR      (TMU_345_BASE + 0x14)
+#define TMU4_TCNT      (TMU_345_BASE + 0x18)
+#define TMU4_TCR       (TMU_345_BASE + 0x1c)
+
+#define TMU5_TCOR      (TMU_345_BASE + 0x20)
+#define TMU5_TCNT      (TMU_345_BASE + 0x24)
+#define TMU5_TCR       (TMU_345_BASE + 0x28)
+
+#endif /* __ASM_CPU_SH4_TIMER_H */
diff --git a/include/asm-sh/futex-irq.h b/include/asm-sh/futex-irq.h
new file mode 100644 (file)
index 0000000..a9f16a7
--- /dev/null
@@ -0,0 +1,111 @@
+#ifndef __ASM_SH_FUTEX_IRQ_H
+#define __ASM_SH_FUTEX_IRQ_H
+
+#include <asm/system.h>
+
+static inline int atomic_futex_op_xchg_set(int oparg, int __user *uaddr,
+                                          int *oldval)
+{
+       unsigned long flags;
+       int ret;
+
+       local_irq_save(flags);
+
+       ret = get_user(*oldval, uaddr);
+       if (!ret)
+               ret = put_user(oparg, uaddr);
+
+       local_irq_restore(flags);
+
+       return ret;
+}
+
+static inline int atomic_futex_op_xchg_add(int oparg, int __user *uaddr,
+                                          int *oldval)
+{
+       unsigned long flags;
+       int ret;
+
+       local_irq_save(flags);
+
+       ret = get_user(*oldval, uaddr);
+       if (!ret)
+               ret = put_user(*oldval + oparg, uaddr);
+
+       local_irq_restore(flags);
+
+       return ret;
+}
+
+static inline int atomic_futex_op_xchg_or(int oparg, int __user *uaddr,
+                                         int *oldval)
+{
+       unsigned long flags;
+       int ret;
+
+       local_irq_save(flags);
+
+       ret = get_user(*oldval, uaddr);
+       if (!ret)
+               ret = put_user(*oldval | oparg, uaddr);
+
+       local_irq_restore(flags);
+
+       return ret;
+}
+
+static inline int atomic_futex_op_xchg_and(int oparg, int __user *uaddr,
+                                          int *oldval)
+{
+       unsigned long flags;
+       int ret;
+
+       local_irq_save(flags);
+
+       ret = get_user(*oldval, uaddr);
+       if (!ret)
+               ret = put_user(*oldval & oparg, uaddr);
+
+       local_irq_restore(flags);
+
+       return ret;
+}
+
+static inline int atomic_futex_op_xchg_xor(int oparg, int __user *uaddr,
+                                          int *oldval)
+{
+       unsigned long flags;
+       int ret;
+
+       local_irq_save(flags);
+
+       ret = get_user(*oldval, uaddr);
+       if (!ret)
+               ret = put_user(*oldval ^ oparg, uaddr);
+
+       local_irq_restore(flags);
+
+       return ret;
+}
+
+static inline int atomic_futex_op_cmpxchg_inatomic(int __user *uaddr,
+                                                  int oldval, int newval)
+{
+       unsigned long flags;
+       int ret, prev = 0;
+
+       local_irq_save(flags);
+
+       ret = get_user(prev, uaddr);
+       if (!ret && oldval == prev)
+               ret = put_user(newval, uaddr);
+
+       local_irq_restore(flags);
+
+       if (ret)
+               return ret;
+
+       return prev;
+}
+
+#endif /* __ASM_SH_FUTEX_IRQ_H */
index 6a332a9f099c2eafbf78ee5f79056a349d41a775..74ed3681d33c3298a0b35f5d514fff8251320994 100644 (file)
@@ -1,6 +1,77 @@
-#ifndef _ASM_FUTEX_H
-#define _ASM_FUTEX_H
+#ifndef __ASM_SH_FUTEX_H
+#define __ASM_SH_FUTEX_H
 
-#include <asm-generic/futex.h>
+#ifdef __KERNEL__
 
-#endif
+#include <linux/futex.h>
+#include <asm/errno.h>
+#include <asm/uaccess.h>
+
+/* XXX: UP variants, fix for SH-4A and SMP.. */
+#include <asm/futex-irq.h>
+
+static inline int futex_atomic_op_inuser(int encoded_op, int __user *uaddr)
+{
+       int op = (encoded_op >> 28) & 7;
+       int cmp = (encoded_op >> 24) & 15;
+       int oparg = (encoded_op << 8) >> 20;
+       int cmparg = (encoded_op << 20) >> 20;
+       int oldval = 0, ret;
+
+       if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28))
+               oparg = 1 << oparg;
+
+       if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
+               return -EFAULT;
+
+       pagefault_disable();
+
+       switch (op) {
+       case FUTEX_OP_SET:
+               ret = atomic_futex_op_xchg_set(oparg, uaddr, &oldval);
+               break;
+       case FUTEX_OP_ADD:
+               ret = atomic_futex_op_xchg_add(oparg, uaddr, &oldval);
+               break;
+       case FUTEX_OP_OR:
+               ret = atomic_futex_op_xchg_or(oparg, uaddr, &oldval);
+               break;
+       case FUTEX_OP_ANDN:
+               ret = atomic_futex_op_xchg_and(~oparg, uaddr, &oldval);
+               break;
+       case FUTEX_OP_XOR:
+               ret = atomic_futex_op_xchg_xor(oparg, uaddr, &oldval);
+               break;
+       default:
+               ret = -ENOSYS;
+               break;
+       }
+
+       pagefault_enable();
+
+       if (!ret) {
+               switch (cmp) {
+               case FUTEX_OP_CMP_EQ: ret = (oldval == cmparg); break;
+               case FUTEX_OP_CMP_NE: ret = (oldval != cmparg); break;
+               case FUTEX_OP_CMP_LT: ret = (oldval < cmparg); break;
+               case FUTEX_OP_CMP_GE: ret = (oldval >= cmparg); break;
+               case FUTEX_OP_CMP_LE: ret = (oldval <= cmparg); break;
+               case FUTEX_OP_CMP_GT: ret = (oldval > cmparg); break;
+               default: ret = -ENOSYS;
+               }
+       }
+
+       return ret;
+}
+
+static inline int
+futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)
+{
+       if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
+               return -EFAULT;
+
+       return atomic_futex_op_cmpxchg_inatomic(uaddr, oldval, newval);
+}
+
+#endif /* __KERNEL__ */
+#endif /* __ASM_SH_FUTEX_H */
index 27e5c34e265991a54410513c97a7a210c550b3dd..4dd8592ca014c7ada908196761623e980817fd1b 100644 (file)
 #ifndef __ASM_SH_HD64461
 #define __ASM_SH_HD64461
 /*
- *     $Id: hd64461.h,v 1.5 2004/03/16 00:07:51 lethal Exp $
+ *     Copyright (C) 2007 Kristoffer Ericson <Kristoffer.Ericson@gmail.com>
+ *     Copyright (C) 2004 Paul Mundt
  *     Copyright (C) 2000 YAEGASHI Takeshi
- *     Hitachi HD64461 companion chip support
+ *
+ *             Hitachi HD64461 companion chip support
+ *     (please note manual reference 0x10000000 = 0xb0000000)
  */
 
 /* Constants for PCMCIA mappings */
-#define HD64461_PCC_WINDOW     0x01000000
-
-#define HD64461_PCC0_BASE      0xb8000000      /* area 6 */
-#define HD64461_PCC0_ATTR      (HD64461_PCC0_BASE)
-#define HD64461_PCC0_COMM      (HD64461_PCC0_BASE+HD64461_PCC_WINDOW)
-#define HD64461_PCC0_IO                (HD64461_PCC0_BASE+2*HD64461_PCC_WINDOW)
-
-#define HD64461_PCC1_BASE      0xb4000000      /* area 5 */
-#define HD64461_PCC1_ATTR      (HD64461_PCC1_BASE)
-#define HD64461_PCC1_COMM      (HD64461_PCC1_BASE+HD64461_PCC_WINDOW)
-
-#define HD64461_STBCR  0x10000
-#define HD64461_STBCR_CKIO_STBY                        0x2000
-#define HD64461_STBCR_SAFECKE_IST              0x1000
-#define HD64461_STBCR_SLCKE_IST                        0x0800
-#define HD64461_STBCR_SAFECKE_OST              0x0400
-#define HD64461_STBCR_SLCKE_OST                        0x0200
-#define HD64461_STBCR_SMIAST                   0x0100
-#define HD64461_STBCR_SLCDST                   0x0080
-#define HD64461_STBCR_SPC0ST                   0x0040
-#define HD64461_STBCR_SPC1ST                   0x0020
-#define HD64461_STBCR_SAFEST                   0x0010
-#define HD64461_STBCR_STM0ST                   0x0008
-#define HD64461_STBCR_STM1ST                   0x0004
-#define HD64461_STBCR_SIRST                            0x0002
-#define HD64461_STBCR_SURTST                   0x0001
-
-#define HD64461_SYSCR  0x10002
-#define HD64461_SCPUCR 0x10004
-
-#define HD64461_LCDCBAR                0x11000
-#define HD64461_LCDCLOR                0x11002
-#define HD64461_LCDCCR         0x11004
-#define HD64461_LCDCCR_STBACK  0x0400
-#define HD64461_LCDCCR_STREQ   0x0100
-#define HD64461_LCDCCR_MOFF    0x0080
-#define HD64461_LCDCCR_REFSEL  0x0040
-#define HD64461_LCDCCR_EPON    0x0020
-#define HD64461_LCDCCR_SPON    0x0010
-
-#define        HD64461_LDR1            0x11010
-#define        HD64461_LDR1_DON        0x01
-#define        HD64461_LDR1_DINV       0x80
-
-#define        HD64461_LDR2            0x11012
-#define        HD64461_LDHNCR          0x11014
-#define        HD64461_LDHNSR          0x11016
-#define HD64461_LDVNTR         0x11018
-#define HD64461_LDVNDR         0x1101a
-#define HD64461_LDVSPR         0x1101c
-#define HD64461_LDR3           0x1101e
-
-#define HD64461_CPTWAR         0x11030
-#define HD64461_CPTWDR         0x11032
-#define HD64461_CPTRAR         0x11034
-#define HD64461_CPTRDR         0x11036
-
-#define HD64461_GRDOR          0x11040
-#define HD64461_GRSCR          0x11042
-#define HD64461_GRCFGR         0x11044
-#define HD64461_GRCFGR_ACCSTATUS               0x10
-#define HD64461_GRCFGR_ACCRESET                        0x08
-#define HD64461_GRCFGR_ACCSTART_BITBLT 0x06
-#define HD64461_GRCFGR_ACCSTART_LINE   0x04
-#define HD64461_GRCFGR_COLORDEPTH16            0x01
-
-#define HD64461_LNSARH         0x11046
-#define HD64461_LNSARL         0x11048
-#define HD64461_LNAXLR         0x1104a
-#define HD64461_LNDGR          0x1104c
-#define HD64461_LNAXR          0x1104e
-#define HD64461_LNERTR         0x11050
-#define HD64461_LNMDR          0x11052
-#define HD64461_BBTSSARH       0x11054
-#define HD64461_BBTSSARL       0x11056
-#define HD64461_BBTDSARH       0x11058
-#define HD64461_BBTDSARL       0x1105a
-#define HD64461_BBTDWR         0x1105c
-#define HD64461_BBTDHR         0x1105e
-#define HD64461_BBTPARH                0x11060
-#define HD64461_BBTPARL                0x11062
-#define HD64461_BBTMARH                0x11064
-#define HD64461_BBTMARL                0x11066
-#define HD64461_BBTROPR                0x11068
-#define HD64461_BBTMDR         0x1106a
+#define        HD64461_PCC_WINDOW      0x01000000
+
+/* Area 6 - Slot 0 - memory and/or IO card */
+#define        HD64461_PCC0_BASE       (CONFIG_HD64461_IOBASE + 0x8000000)
+#define        HD64461_PCC0_ATTR       (HD64461_PCC0_BASE)                             /* 0xb80000000 */
+#define        HD64461_PCC0_COMM       (HD64461_PCC0_BASE+HD64461_PCC_WINDOW)          /* 0xb90000000 */
+#define        HD64461_PCC0_IO         (HD64461_PCC0_BASE+2*HD64461_PCC_WINDOW)        /* 0xba0000000 */
+
+/* Area 5 - Slot 1 - memory card only */
+#define        HD64461_PCC1_BASE       (CONFIG_HD64461_IOBASE + 0x4000000)
+#define        HD64461_PCC1_ATTR       (HD64461_PCC1_BASE)                             /* 0xb4000000 */
+#define        HD64461_PCC1_COMM       (HD64461_PCC1_BASE+HD64461_PCC_WINDOW)          /* 0xb5000000 */
+
+/* Standby Control Register for HD64461 */
+#define        HD64461_STBCR                   CONFIG_HD64461_IOBASE
+#define        HD64461_STBCR_CKIO_STBY         0x2000
+#define        HD64461_STBCR_SAFECKE_IST       0x1000
+#define        HD64461_STBCR_SLCKE_IST         0x0800
+#define        HD64461_STBCR_SAFECKE_OST       0x0400
+#define        HD64461_STBCR_SLCKE_OST         0x0200
+#define        HD64461_STBCR_SMIAST            0x0100
+#define        HD64461_STBCR_SLCDST            0x0080
+#define        HD64461_STBCR_SPC0ST            0x0040
+#define        HD64461_STBCR_SPC1ST            0x0020
+#define        HD64461_STBCR_SAFEST            0x0010
+#define        HD64461_STBCR_STM0ST            0x0008
+#define        HD64461_STBCR_STM1ST            0x0004
+#define        HD64461_STBCR_SIRST             0x0002
+#define        HD64461_STBCR_SURTST            0x0001
+
+/* System Configuration Register */
+#define        HD64461_SYSCR           (CONFIG_HD64461_IOBASE + 0x02)
+
+/* CPU Data Bus Control Register */
+#define        HD64461_SCPUCR          (CONFIG_HD64461_IOBASE + 0x04)
+
+/* Base Adress Register */
+#define        HD64461_LCDCBAR         (CONFIG_HD64461_IOBASE + 0x1000)
+
+/* Line increment adress */
+#define        HD64461_LCDCLOR         (CONFIG_HD64461_IOBASE + 0x1002)
+
+/* Controls LCD controller */
+#define        HD64461_LCDCCR          (CONFIG_HD64461_IOBASE + 0x1004)
+
+/* LCCDR control bits */
+#define        HD64461_LCDCCR_STBACK   0x0400  /* Standby Back */
+#define        HD64461_LCDCCR_STREQ    0x0100  /* Standby Request */
+#define        HD64461_LCDCCR_MOFF     0x0080  /* Memory Off */
+#define        HD64461_LCDCCR_REFSEL   0x0040  /* Refresh Select */
+#define        HD64461_LCDCCR_EPON     0x0020  /* End Power On */
+#define        HD64461_LCDCCR_SPON     0x0010  /* Start Power On */
+
+/* Controls LCD (1) */
+#define        HD64461_LDR1            (CONFIG_HD64461_IOBASE + 0x1010)
+#define        HD64461_LDR1_DON        0x01    /* Display On */
+#define        HD64461_LDR1_DINV       0x80    /* Display Invert */
+
+/* Controls LCD (2) */
+#define        HD64461_LDR2            (CONFIG_HD64461_IOBASE + 0x1012)
+#define        HD64461_LDHNCR          (CONFIG_HD64461_IOBASE + 0x1014)        /* Number of horizontal characters */
+#define        HD64461_LDHNSR          (CONFIG_HD64461_IOBASE + 0x1016)        /* Specify output start position + width of CL1 */
+#define        HD64461_LDVNTR          (CONFIG_HD64461_IOBASE + 0x1018)        /* Specify total vertical lines */
+#define        HD64461_LDVNDR          (CONFIG_HD64461_IOBASE + 0x101a)        /* specify number of display vertical lines */
+#define        HD64461_LDVSPR          (CONFIG_HD64461_IOBASE + 0x101c)        /* specify vertical synchronization pos and AC nr */
+
+/* Controls LCD (3) */
+#define        HD64461_LDR3            (CONFIG_HD64461_IOBASE + 0x101e)
+
+/* Palette Registers */
+#define        HD64461_CPTWAR          (CONFIG_HD64461_IOBASE + 0x1030)        /* Color Palette Write Adress Register */
+#define        HD64461_CPTWDR          (CONFIG_HD64461_IOBASE + 0x1032)        /* Color Palette Write Data Register */
+#define        HD64461_CPTRAR          (CONFIG_HD64461_IOBASE + 0x1034)        /* Color Palette Read Adress Register */
+#define        HD64461_CPTRDR          (CONFIG_HD64461_IOBASE + 0x1036)        /* Color Palette Read Data Register */
+
+#define        HD64461_GRDOR           (CONFIG_HD64461_IOBASE + 0x1040)        /* Display Resolution Offset Register */
+#define        HD64461_GRSCR           (CONFIG_HD64461_IOBASE + 0x1042)        /* Solid Color Register */
+#define        HD64461_GRCFGR          (CONFIG_HD64461_IOBASE + 0x1044)        /* Accelerator Configuration Register */
+
+#define        HD64461_GRCFGR_ACCSTATUS        0x10    /* Accelerator Status */
+#define        HD64461_GRCFGR_ACCRESET         0x08    /* Accelerator Reset */
+#define        HD64461_GRCFGR_ACCSTART_BITBLT  0x06    /* Accelerator Start BITBLT */
+#define        HD64461_GRCFGR_ACCSTART_LINE    0x04    /* Accelerator Start Line Drawing */
+#define        HD64461_GRCFGR_COLORDEPTH16     0x01    /* Sets Colordepth 16 for Accelerator */
+#define        HD64461_GRCFGR_COLORDEPTH8      0x01    /* Sets Colordepth 8 for Accelerator */
+
+/* Line Drawing Registers */
+#define        HD64461_LNSARH          (CONFIG_HD64461_IOBASE + 0x1046)        /* Line Start Adress Register (H) */
+#define        HD64461_LNSARL          (CONFIG_HD64461_IOBASE + 0x1048)        /* Line Start Adress Register (L) */
+#define        HD64461_LNAXLR          (CONFIG_HD64461_IOBASE + 0x104a)        /* Axis Pixel Length Register */
+#define        HD64461_LNDGR           (CONFIG_HD64461_IOBASE + 0x104c)        /* Diagonal Register */
+#define        HD64461_LNAXR           (CONFIG_HD64461_IOBASE + 0x104e)        /* Axial Register */
+#define        HD64461_LNERTR          (CONFIG_HD64461_IOBASE + 0x1050)        /* Start Error Term Register */
+#define        HD64461_LNMDR           (CONFIG_HD64461_IOBASE + 0x1052)        /* Line Mode Register */
+
+/* BitBLT Registers */
+#define        HD64461_BBTSSARH        (CONFIG_HD64461_IOBASE + 0x1054)        /* Source Start Adress Register (H) */
+#define        HD64461_BBTSSARL        (CONFIG_HD64461_IOBASE + 0x1056)        /* Source Start Adress Register (L) */
+#define        HD64461_BBTDSARH        (CONFIG_HD64461_IOBASE + 0x1058)        /* Destination Start Adress Register (H) */
+#define        HD64461_BBTDSARL        (CONFIG_HD64461_IOBASE + 0x105a)        /* Destination Start Adress Register (L) */
+#define        HD64461_BBTDWR          (CONFIG_HD64461_IOBASE + 0x105c)        /* Destination Block Width Register */
+#define        HD64461_BBTDHR          (CONFIG_HD64461_IOBASE + 0x105e)        /* Destination Block Height Register */
+#define        HD64461_BBTPARH         (CONFIG_HD64461_IOBASE + 0x1060)        /* Pattern Start Adress Register (H) */
+#define        HD64461_BBTPARL         (CONFIG_HD64461_IOBASE + 0x1062)        /* Pattern Start Adress Register (L) */
+#define        HD64461_BBTMARH         (CONFIG_HD64461_IOBASE + 0x1064)        /* Mask Start Adress Register (H) */
+#define        HD64461_BBTMARL         (CONFIG_HD64461_IOBASE + 0x1066)        /* Mask Start Adress Register (L) */
+#define        HD64461_BBTROPR         (CONFIG_HD64461_IOBASE + 0x1068)        /* ROP Register */
+#define        HD64461_BBTMDR          (CONFIG_HD64461_IOBASE + 0x106a)        /* BitBLT Mode Register */
 
 /* PC Card Controller Registers */
-#define HD64461_PCC0ISR         0x12000 /* socket 0 interface status */
-#define HD64461_PCC0GCR         0x12002 /* socket 0 general control */
-#define HD64461_PCC0CSCR        0x12004 /* socket 0 card status change */
-#define HD64461_PCC0CSCIER      0x12006 /* socket 0 card status change interrupt enable */
-#define HD64461_PCC0SCR         0x12008 /* socket 0 software control */
-#define HD64461_PCC1ISR         0x12010 /* socket 1 interface status */
-#define HD64461_PCC1GCR         0x12012 /* socket 1 general control */
-#define HD64461_PCC1CSCR        0x12014 /* socket 1 card status change */
-#define HD64461_PCC1CSCIER      0x12016 /* socket 1 card status change interrupt enable */
-#define HD64461_PCC1SCR         0x12018 /* socket 1 software control */
+/* Maps to Physical Area 6 */
+#define        HD64461_PCC0ISR         (CONFIG_HD64461_IOBASE + 0x2000)        /* socket 0 interface status */
+#define        HD64461_PCC0GCR         (CONFIG_HD64461_IOBASE + 0x2002)        /* socket 0 general control */
+#define        HD64461_PCC0CSCR        (CONFIG_HD64461_IOBASE + 0x2004)        /* socket 0 card status change */
+#define        HD64461_PCC0CSCIER      (CONFIG_HD64461_IOBASE + 0x2006)        /* socket 0 card status change interrupt enable */
+#define        HD64461_PCC0SCR         (CONFIG_HD64461_IOBASE + 0x2008)        /* socket 0 software control */
+/* Maps to Physical Area 5 */
+#define        HD64461_PCC1ISR         (CONFIG_HD64461_IOBASE + 0x2010)        /* socket 1 interface status */
+#define        HD64461_PCC1GCR         (CONFIG_HD64461_IOBASE + 0x2012)        /* socket 1 general control */
+#define        HD64461_PCC1CSCR        (CONFIG_HD64461_IOBASE + 0x2014)        /* socket 1 card status change */
+#define        HD64461_PCC1CSCIER      (CONFIG_HD64461_IOBASE + 0x2016)        /* socket 1 card status change interrupt enable */
+#define        HD64461_PCC1SCR         (CONFIG_HD64461_IOBASE + 0x2018)        /* socket 1 software control */
 
 /* PCC Interface Status Register */
-#define HD64461_PCCISR_READY           0x80    /* card ready */
-#define HD64461_PCCISR_MWP             0x40    /* card write-protected */
-#define HD64461_PCCISR_VS2             0x20    /* voltage select pin 2 */
-#define HD64461_PCCISR_VS1             0x10    /* voltage select pin 1 */
-#define HD64461_PCCISR_CD2             0x08    /* card detect 2 */
-#define HD64461_PCCISR_CD1             0x04    /* card detect 1 */
-#define HD64461_PCCISR_BVD2            0x02    /* battery 1 */
-#define HD64461_PCCISR_BVD1            0x01    /* battery 1 */
-
-#define HD64461_PCCISR_PCD_MASK                0x0c    /* card detect */
-#define HD64461_PCCISR_BVD_MASK                0x03    /* battery voltage */
-#define HD64461_PCCISR_BVD_BATGOOD     0x03    /* battery good */
-#define HD64461_PCCISR_BVD_BATWARN     0x01    /* battery low warning */
-#define HD64461_PCCISR_BVD_BATDEAD1    0x02    /* battery dead */
-#define HD64461_PCCISR_BVD_BATDEAD2    0x00    /* battery dead */
+#define        HD64461_PCCISR_READY            0x80    /* card ready */
+#define        HD64461_PCCISR_MWP              0x40    /* card write-protected */
+#define        HD64461_PCCISR_VS2              0x20    /* voltage select pin 2 */
+#define        HD64461_PCCISR_VS1              0x10    /* voltage select pin 1 */
+#define        HD64461_PCCISR_CD2              0x08    /* card detect 2 */
+#define        HD64461_PCCISR_CD1              0x04    /* card detect 1 */
+#define        HD64461_PCCISR_BVD2             0x02    /* battery 1 */
+#define        HD64461_PCCISR_BVD1             0x01    /* battery 1 */
+
+#define        HD64461_PCCISR_PCD_MASK         0x0c    /* card detect */
+#define        HD64461_PCCISR_BVD_MASK         0x03    /* battery voltage */
+#define        HD64461_PCCISR_BVD_BATGOOD      0x03    /* battery good */
+#define        HD64461_PCCISR_BVD_BATWARN      0x01    /* battery low warning */
+#define        HD64461_PCCISR_BVD_BATDEAD1     0x02    /* battery dead */
+#define        HD64461_PCCISR_BVD_BATDEAD2     0x00    /* battery dead */
 
 /* PCC General Control Register */
-#define HD64461_PCCGCR_DRVE            0x80    /* output drive */
-#define HD64461_PCCGCR_PCCR            0x40    /* PC card reset */
-#define HD64461_PCCGCR_PCCT            0x20    /* PC card type, 1=IO&mem, 0=mem */
-#define HD64461_PCCGCR_VCC0            0x10    /* voltage control pin VCC0SEL0 */
-#define HD64461_PCCGCR_PMMOD           0x08    /* memory mode */
-#define HD64461_PCCGCR_PA25            0x04    /* pin A25 */
-#define HD64461_PCCGCR_PA24            0x02    /* pin A24 */
-#define HD64461_PCCGCR_REG             0x01    /* pin PCC0REG# */
+#define        HD64461_PCCGCR_DRVE             0x80    /* output drive */
+#define        HD64461_PCCGCR_PCCR             0x40    /* PC card reset */
+#define        HD64461_PCCGCR_PCCT             0x20    /* PC card type, 1=IO&mem, 0=mem */
+#define        HD64461_PCCGCR_VCC0             0x10    /* voltage control pin VCC0SEL0 */
+#define        HD64461_PCCGCR_PMMOD            0x08    /* memory mode */
+#define        HD64461_PCCGCR_PA25             0x04    /* pin A25 */
+#define        HD64461_PCCGCR_PA24             0x02    /* pin A24 */
+#define        HD64461_PCCGCR_REG              0x01    /* pin PCC0REG# */
 
 /* PCC Card Status Change Register */
-#define HD64461_PCCCSCR_SCDI           0x80    /* sw card detect intr */
-#define HD64461_PCCCSCR_SRV1           0x40    /* reserved */
-#define HD64461_PCCCSCR_IREQ           0x20    /* IREQ intr req */
-#define HD64461_PCCCSCR_SC             0x10    /* STSCHG (status change) pin */
-#define HD64461_PCCCSCR_CDC            0x08    /* CD (card detect) change */
-#define HD64461_PCCCSCR_RC             0x04    /* READY change */
-#define HD64461_PCCCSCR_BW             0x02    /* battery warning change */
-#define HD64461_PCCCSCR_BD             0x01    /* battery dead change */
+#define        HD64461_PCCCSCR_SCDI            0x80    /* sw card detect intr */
+#define        HD64461_PCCCSCR_SRV1            0x40    /* reserved */
+#define        HD64461_PCCCSCR_IREQ            0x20    /* IREQ intr req */
+#define        HD64461_PCCCSCR_SC              0x10    /* STSCHG (status change) pin */
+#define        HD64461_PCCCSCR_CDC             0x08    /* CD (card detect) change */
+#define        HD64461_PCCCSCR_RC              0x04    /* READY change */
+#define        HD64461_PCCCSCR_BW              0x02    /* battery warning change */
+#define        HD64461_PCCCSCR_BD              0x01    /* battery dead change */
 
 /* PCC Card Status Change Interrupt Enable Register */
-#define HD64461_PCCCSCIER_CRE          0x80    /* change reset enable */
-#define HD64461_PCCCSCIER_IREQE_MASK   0x60   /* IREQ enable */
-#define HD64461_PCCCSCIER_IREQE_DISABLED       0x00   /* IREQ disabled */
-#define HD64461_PCCCSCIER_IREQE_LEVEL  0x20   /* IREQ level-triggered */
-#define HD64461_PCCCSCIER_IREQE_FALLING        0x40   /* IREQ falling-edge-trig */
-#define HD64461_PCCCSCIER_IREQE_RISING 0x60   /* IREQ rising-edge-trig */
-
-#define HD64461_PCCCSCIER_SCE          0x10    /* status change enable */
-#define HD64461_PCCCSCIER_CDE          0x08    /* card detect change enable */
-#define HD64461_PCCCSCIER_RE           0x04    /* ready change enable */
-#define HD64461_PCCCSCIER_BWE          0x02    /* battery warn change enable */
-#define HD64461_PCCCSCIER_BDE          0x01    /* battery dead change enable*/
+#define        HD64461_PCCCSCIER_CRE           0x80    /* change reset enable */
+#define        HD64461_PCCCSCIER_IREQE_MASK    0x60    /* IREQ enable */
+#define        HD64461_PCCCSCIER_IREQE_DISABLED 0x00   /* IREQ disabled */
+#define        HD64461_PCCCSCIER_IREQE_LEVEL   0x20    /* IREQ level-triggered */
+#define        HD64461_PCCCSCIER_IREQE_FALLING 0x40    /* IREQ falling-edge-trig */
+#define        HD64461_PCCCSCIER_IREQE_RISING  0x60    /* IREQ rising-edge-trig */
+
+#define        HD64461_PCCCSCIER_SCE           0x10    /* status change enable */
+#define        HD64461_PCCCSCIER_CDE           0x08    /* card detect change enable */
+#define        HD64461_PCCCSCIER_RE            0x04    /* ready change enable */
+#define        HD64461_PCCCSCIER_BWE           0x02    /* battery warn change enable */
+#define        HD64461_PCCCSCIER_BDE           0x01    /* battery dead change enable*/
 
 /* PCC Software Control Register */
-#define HD64461_PCCSCR_VCC1            0x02    /* voltage control pin 1 */
-#define HD64461_PCCSCR_SWP             0x01    /* write protect */
-
-#define HD64461_P0OCR           0x1202a
-#define HD64461_P1OCR           0x1202c
-#define HD64461_PGCR            0x1202e
-
-#define HD64461_GPACR          0x14000
-#define HD64461_GPBCR          0x14002
-#define HD64461_GPCCR          0x14004
-#define HD64461_GPDCR          0x14006
-#define HD64461_GPADR          0x14010
-#define HD64461_GPBDR          0x14012
-#define HD64461_GPCDR          0x14014
-#define HD64461_GPDDR          0x14016
-#define HD64461_GPAICR         0x14020
-#define HD64461_GPBICR         0x14022
-#define HD64461_GPCICR         0x14024
-#define HD64461_GPDICR         0x14026
-#define HD64461_GPAISR         0x14040
-#define HD64461_GPBISR         0x14042
-#define HD64461_GPCISR         0x14044
-#define HD64461_GPDISR         0x14046
-
-#define HD64461_NIRR           0x15000
-#define HD64461_NIMR           0x15002
-
-#define HD64461_IRQBASE                OFFCHIP_IRQ_BASE
-#define HD64461_IRQ_NUM                16
-
-#define HD64461_IRQ_UART       (HD64461_IRQBASE+5)
-#define HD64461_IRQ_IRDA       (HD64461_IRQBASE+6)
-#define HD64461_IRQ_TMU1       (HD64461_IRQBASE+9)
-#define HD64461_IRQ_TMU0       (HD64461_IRQBASE+10)
-#define HD64461_IRQ_GPIO       (HD64461_IRQBASE+11)
-#define HD64461_IRQ_AFE                (HD64461_IRQBASE+12)
-#define HD64461_IRQ_PCC1       (HD64461_IRQBASE+13)
-#define HD64461_IRQ_PCC0       (HD64461_IRQBASE+14)
+#define        HD64461_PCCSCR_VCC1             0x02    /* voltage control pin 1 */
+#define        HD64461_PCCSCR_SWP              0x01    /* write protect */
+
+/* PCC0 Output Pins Control Register */
+#define        HD64461_P0OCR           (CONFIG_HD64461_IOBASE + 0x202a)
+
+/* PCC1 Output Pins Control Register */
+#define        HD64461_P1OCR           (CONFIG_HD64461_IOBASE + 0x202c)
+
+/* PC Card General Control Register */
+#define        HD64461_PGCR            (CONFIG_HD64461_IOBASE + 0x202e)
+
+/* Port Control Registers */
+#define        HD64461_GPACR           (CONFIG_HD64461_IOBASE + 0x4000)        /* Port A - Handles IRDA/TIMER */
+#define        HD64461_GPBCR           (CONFIG_HD64461_IOBASE + 0x4002)        /* Port B - Handles UART */
+#define        HD64461_GPCCR           (CONFIG_HD64461_IOBASE + 0x4004)        /* Port C - Handles PCMCIA 1 */
+#define        HD64461_GPDCR           (CONFIG_HD64461_IOBASE + 0x4006)        /* Port D - Handles PCMCIA 1 */
+
+/* Port Control Data Registers */
+#define        HD64461_GPADR           (CONFIG_HD64461_IOBASE + 0x4010)        /* A */
+#define        HD64461_GPBDR           (CONFIG_HD64461_IOBASE + 0x4012)        /* B */
+#define        HD64461_GPCDR           (CONFIG_HD64461_IOBASE + 0x4014)        /* C */
+#define        HD64461_GPDDR           (CONFIG_HD64461_IOBASE + 0x4016)        /* D */
+
+/* Interrupt Control Registers */
+#define        HD64461_GPAICR          (CONFIG_HD64461_IOBASE + 0x4020)        /* A */
+#define        HD64461_GPBICR          (CONFIG_HD64461_IOBASE + 0x4022)        /* B */
+#define        HD64461_GPCICR          (CONFIG_HD64461_IOBASE + 0x4024)        /* C */
+#define        HD64461_GPDICR          (CONFIG_HD64461_IOBASE + 0x4026)        /* D */
+
+/* Interrupt Status Registers */
+#define        HD64461_GPAISR          (CONFIG_HD64461_IOBASE + 0x4040)        /* A */
+#define        HD64461_GPBISR          (CONFIG_HD64461_IOBASE + 0x4042)        /* B */
+#define        HD64461_GPCISR          (CONFIG_HD64461_IOBASE + 0x4044)        /* C */
+#define        HD64461_GPDISR          (CONFIG_HD64461_IOBASE + 0x4046)        /* D */
+
+/* Interrupt Request Register & Interrupt Mask Register */
+#define        HD64461_NIRR            (CONFIG_HD64461_IOBASE + 0x5000)
+#define        HD64461_NIMR            (CONFIG_HD64461_IOBASE + 0x5002)
+
+#define        HD64461_IRQBASE         OFFCHIP_IRQ_BASE
+#define        HD64461_IRQ_NUM         16
+
+#define        HD64461_IRQ_UART        (HD64461_IRQBASE+5)
+#define        HD64461_IRQ_IRDA        (HD64461_IRQBASE+6)
+#define        HD64461_IRQ_TMU1        (HD64461_IRQBASE+9)
+#define        HD64461_IRQ_TMU0        (HD64461_IRQBASE+10)
+#define        HD64461_IRQ_GPIO        (HD64461_IRQBASE+11)
+#define        HD64461_IRQ_AFE         (HD64461_IRQBASE+12)
+#define        HD64461_IRQ_PCC1        (HD64461_IRQBASE+13)
+#define        HD64461_IRQ_PCC0        (HD64461_IRQBASE+14)
 
 #define __IO_PREFIX    hd64461
 #include <asm/io_generic.h>
index 80ee1cda7498f2383cd72588a800c66ad68178e3..4ca3f765bacc11ecf3070a3b8b0770408dd9284c 100644 (file)
@@ -5,4 +5,46 @@
 
 extern atomic_t irq_err_count;
 
+struct intc2_data {
+       unsigned short irq;
+       unsigned char ipr_offset, ipr_shift;
+       unsigned char msk_offset, msk_shift;
+       unsigned char priority;
+};
+
+struct intc2_desc {
+       unsigned long prio_base;
+       unsigned long msk_base;
+       unsigned long mskclr_base;
+       struct intc2_data *intc2_data;
+       unsigned int nr_irqs;
+       struct irq_chip chip;
+};
+
+void register_intc2_controller(struct intc2_desc *);
+void init_IRQ_intc2(void);
+
+struct ipr_data {
+       unsigned char irq;
+       unsigned char ipr_idx;          /* Index for the IPR registered */
+       unsigned char shift;            /* Number of bits to shift the data */
+       unsigned char priority;         /* The priority */
+};
+
+struct ipr_desc {
+       unsigned long *ipr_offsets;
+       unsigned int nr_offsets;
+       struct ipr_data *ipr_data;
+       unsigned int nr_irqs;
+       struct irq_chip chip;
+};
+
+void register_ipr_controller(struct ipr_desc *);
+void init_IRQ_ipr(void);
+
+/*
+ * Enable individual interrupt mode for external IPR IRQs.
+ */
+void ipr_irq_enable_irlm(void);
+
 #endif /* __ASM_SH_HW_IRQ_H */
index e81bf21c801e77f7ac03ef19f9058ce101cfd8e1..c61d902b8bff118d511d88fe62409a22e835e4ce 100644 (file)
@@ -31,47 +31,7 @@ extern unsigned short *irq_mask_register;
  * PINT IRQs
  */
 void init_IRQ_pint(void);
-
-/*
- * The shift value is now the number of bits to shift, not the number of
- * bits/4. This is to make it easier to read the value directly from the
- * datasheets. The IPR address, addr, will be set from ipr_idx via the
- * map_ipridx_to_addr function.
- */
-struct ipr_data {
-       unsigned int irq;
-       int ipr_idx;            /* Index for the IPR registered */
-       int shift;              /* Number of bits to shift the data */
-       int priority;           /* The priority */
-       unsigned int addr;      /* Address of Interrupt Priority Register */
-};
-
-/*
- * Given an IPR IDX, map the value to an IPR register address.
- */
-unsigned int map_ipridx_to_addr(int idx);
-
-/*
- * Enable individual interrupt mode for external IPR IRQs.
- */
-void ipr_irq_enable_irlm(void);
-
-/*
- * Function for "on chip support modules".
- */
-void make_ipr_irq(struct ipr_data *table, unsigned int nr_irqs);
 void make_imask_irq(unsigned int irq);
-void init_IRQ_ipr(void);
-
-struct intc2_data {
-       unsigned short irq;
-       unsigned char ipr_offset, ipr_shift;
-       unsigned char msk_offset, msk_shift;
-       unsigned char priority;
-};
-
-void make_intc2_irq(struct intc2_data *, unsigned int nr_irqs);
-void init_IRQ_intc2(void);
 
 static inline int generic_irq_demux(int irq)
 {
index 70389b72ffef9dce063f55f576aa01fa2c40bdee..088698bacf2f4947b6d1c60bf91bbddc8a26037e 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/types.h>
 #include <linux/time.h>
 #include <asm/machtypes.h>
-#include <asm/machvec_init.h>
 
 struct device;
 
@@ -68,4 +67,7 @@ extern struct sh_machine_vector sh_mv;
 
 #define get_system_type()      sh_mv.mv_name
 
+#define __initmv \
+       __attribute_used__ __attribute__((__section__ (".machvec.init")))
+
 #endif /* _ASM_SH_MACHVEC_H */
diff --git a/include/asm-sh/machvec_init.h b/include/asm-sh/machvec_init.h
deleted file mode 100644 (file)
index e397798..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * include/asm-sh/machvec_init.h
- *
- * Copyright 2000 Stuart Menefy (stuart.menefy@st.com)
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * This file has goodies to help simplify instantiation of machine vectors.
- */
-
-#ifndef __SH_MACHVEC_INIT_H
-#define __SH_MACHVEC_INIT_H
-
-
-/*
- * In a GENERIC kernel, we have lots of these vectors floating about,
- * all but one of which we want to go away.  In a non-GENERIC kernel,
- * we want only one, ever.
- *
- * Accomplish this in the GENERIC kernel by puting all of the vectors
- * in the .init.data section where they'll go away.  We'll copy the
- * one we want to the real alpha_mv vector in setup_arch.
- *
- * Accomplish this in a non-GENERIC kernel by ifdef'ing out all but
- * one of the vectors, which will not reside in .init.data.  We then
- * alias this one vector to alpha_mv, so no copy is needed.
- *
- * Upshot: set __initdata to nothing for non-GENERIC kernels.
- *
- * Note we do the same thing for the UNKNOWN kernel, as we need to write
- * to the machine vector while setting it up.
- */
-
-#if defined(CONFIG_SH_GENERIC) || defined(CONFIG_SH_UNKNOWN)
-#define __initmv __attribute__((unused,__section__ (".machvec.init")))
-#define ALIAS_MV(x)
-#else
-#define __initmv
-
-/* GCC actually has a syntax for defining aliases, but is under some
-   delusion that you shouldn't be able to declare it extern somewhere
-   else beforehand.  Fine.  We'll do it ourselves.  */
-#if 0
-#define ALIAS_MV(system) \
-  struct sh_machine_vector sh_mv __attribute__((alias("mv_"#system)));
-#else
-#define ALIAS_MV(system) \
-  asm(".global sh_mv\nsh_mv = mv_"#system );
-#endif
-#endif /* GENERIC */
-
-#endif /* __SH_MACHVEC_INIT_H */
diff --git a/include/asm-sh/mmzone.h b/include/asm-sh/mmzone.h
new file mode 100644 (file)
index 0000000..7969f38
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef __ASM_SH_MMZONE_H
+#define __ASM_SH_MMZONE_H
+
+#ifdef __KERNEL__
+
+#ifdef CONFIG_NEED_MULTIPLE_NODES
+extern struct pglist_data *node_data[];
+#define NODE_DATA(nid)         (node_data[nid])
+
+#define node_start_pfn(nid)    (NODE_DATA(nid)->node_start_pfn)
+#define node_end_pfn(nid)      (NODE_DATA(nid)->node_start_pfn + \
+                                NODE_DATA(nid)->node_spanned_pages)
+
+static inline int pfn_to_nid(unsigned long pfn)
+{
+       int nid;
+
+       for (nid = 0; nid < MAX_NUMNODES; nid++)
+               if (pfn >= node_start_pfn(nid) && pfn <= node_end_pfn(nid))
+                       break;
+
+       return nid;
+}
+
+static inline struct pglist_data *pfn_to_pgdat(unsigned long pfn)
+{
+       return NODE_DATA(pfn_to_nid(pfn));
+}
+
+/* arch/sh/mm/numa.c */
+void __init setup_bootmem_node(int nid, unsigned long start, unsigned long end);
+#else
+static inline void
+setup_bootmem_node(int nid, unsigned long start, unsigned long end)
+{
+}
+#endif /* CONFIG_NEED_MULTIPLE_NODES */
+
+/* Platform specific mem init */
+void __init plat_mem_setup(void);
+
+/* arch/sh/kernel/setup.c */
+void __init setup_bootmem_allocator(unsigned long start_pfn);
+
+#endif /* __KERNEL__ */
+#endif /* __ASM_SH_MMZONE_H */
index 7464de4ba07d91e920a3e26577c4c5d8345d77dd..6bc9bba101059f2641d78ecbde2019f143581b98 100644 (file)
@@ -60,6 +60,7 @@ extern void (*copy_page)(void *to, void *from);
 
 extern unsigned long shm_align_mask;
 extern unsigned long max_low_pfn, min_low_pfn;
+extern unsigned long memory_start, memory_end;
 
 #ifdef CONFIG_MMU
 extern void clear_page_slow(void *to);
@@ -134,7 +135,9 @@ typedef struct { unsigned long pgd; } pgd_t;
 #define PFN_START              (__MEMORY_START >> PAGE_SHIFT)
 #define ARCH_PFN_OFFSET                (PFN_START)
 #define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
+#ifdef CONFIG_FLATMEM
 #define pfn_valid(pfn)         ((pfn) >= min_low_pfn && (pfn) < max_low_pfn)
+#endif
 #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
 
 #define VM_DATA_DEFAULT_FLAGS  (VM_READ | VM_WRITE | VM_EXEC | \
@@ -148,5 +151,12 @@ typedef struct { unsigned long pgd; } pgd_t;
 #define __HAVE_ARCH_GATE_AREA
 #endif
 
+/*
+ * Slub defaults to 8-byte alignment, we're only interested in 4.
+ * Slab defaults to BYTES_PER_WORD, which ends up being the same anyways.
+ */
+#define ARCH_KMALLOC_MINALIGN  4
+#define ARCH_SLAB_MINALIGN     4
+
 #endif /* __KERNEL__ */
 #endif /* __ASM_SH_PAGE_H */
diff --git a/include/asm-sh/parport.h b/include/asm-sh/parport.h
new file mode 100644 (file)
index 0000000..f67ba60
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * Copyright (C) 1999, 2000  Tim Waugh <tim@cyberelk.demon.co.uk>
+ *
+ * This file should only be included by drivers/parport/parport_pc.c.
+ */
+#ifndef __ASM_SH_PARPORT_H
+#define __ASM_SH_PARPORT_H
+
+static int __devinit parport_pc_find_isa_ports(int autoirq, int autodma);
+
+static int __devinit parport_pc_find_nonpci_ports(int autoirq, int autodma)
+{
+       return parport_pc_find_isa_ports(autoirq, autodma);
+}
+
+#endif /* __ASM_SH_PARPORT_H */
index 5b523c7e7d99d8b5441d1cd1f979f6faff3aec1a..22efffe450195c07c8e42afd825cdd3f6370b198 100644 (file)
@@ -402,12 +402,8 @@ static inline void set_pte(pte_t *ptep, pte_t pte)
 #define pte_file(pte)          (pte_val(pte) & _PAGE_FILE)
 
 #ifdef CONFIG_X2TLB
-#define pte_read(pte)          ((pte).pte_high & _PAGE_EXT_USER_READ)
-#define pte_exec(pte)          ((pte).pte_high & _PAGE_EXT_USER_EXEC)
 #define pte_write(pte)         ((pte).pte_high & _PAGE_EXT_USER_WRITE)
 #else
-#define pte_read(pte)          (pte_val(pte) & _PAGE_USER)
-#define pte_exec(pte)          (pte_val(pte) & _PAGE_USER)
 #define pte_write(pte)         (pte_val(pte) & _PAGE_RW)
 #endif
 
@@ -420,20 +416,12 @@ static inline pte_t pte_##fn(pte_t pte) { pte.pte_##h op; return pte; }
  * individually toggled (and user permissions are entirely decoupled from
  * kernel permissions), we attempt to couple them a bit more sanely here.
  */
-PTE_BIT_FUNC(high, rdprotect, &= ~_PAGE_EXT_USER_READ);
-PTE_BIT_FUNC(high, mkread, |= _PAGE_EXT_USER_READ | _PAGE_EXT_KERN_READ);
 PTE_BIT_FUNC(high, wrprotect, &= ~_PAGE_EXT_USER_WRITE);
 PTE_BIT_FUNC(high, mkwrite, |= _PAGE_EXT_USER_WRITE | _PAGE_EXT_KERN_WRITE);
-PTE_BIT_FUNC(high, exprotect, &= ~_PAGE_EXT_USER_EXEC);
-PTE_BIT_FUNC(high, mkexec, |= _PAGE_EXT_USER_EXEC | _PAGE_EXT_KERN_EXEC);
 PTE_BIT_FUNC(high, mkhuge, |= _PAGE_SZHUGE);
 #else
-PTE_BIT_FUNC(low, rdprotect, &= ~_PAGE_USER);
-PTE_BIT_FUNC(low, mkread, |= _PAGE_USER);
 PTE_BIT_FUNC(low, wrprotect, &= ~_PAGE_RW);
 PTE_BIT_FUNC(low, mkwrite, |= _PAGE_RW);
-PTE_BIT_FUNC(low, exprotect, &= ~_PAGE_USER);
-PTE_BIT_FUNC(low, mkexec, |= _PAGE_USER);
 PTE_BIT_FUNC(low, mkhuge, |= _PAGE_SZHUGE);
 #endif
 
index d42f68e724fa3720d5c39ec5115c306e9db23442..2252e75daa269ffde32379bfb0e68a5537940ad4 100644 (file)
@@ -36,7 +36,7 @@
  */
 enum cpu_type {
        /* SH-2 types */
-       CPU_SH7604, CPU_SH7619,
+       CPU_SH7619,
 
        /* SH-2A types */
        CPU_SH7206,
@@ -52,7 +52,7 @@ enum cpu_type {
        CPU_SH7760, CPU_ST40RA, CPU_ST40GX1, CPU_SH4_202, CPU_SH4_501,
 
        /* SH-4A types */
-       CPU_SH7770, CPU_SH7780, CPU_SH7781, CPU_SH7785,
+       CPU_SH7770, CPU_SH7780, CPU_SH7781, CPU_SH7785, CPU_SHX3,
 
        /* SH4AL-DSP types */
        CPU_SH73180, CPU_SH7343, CPU_SH7722,
@@ -228,11 +228,7 @@ static __inline__ void grab_fpu(struct pt_regs *regs)
        regs->sr &= ~SR_FD;
 }
 
-#ifdef CONFIG_CPU_SH4
 extern void save_fpu(struct task_struct *__tsk, struct pt_regs *regs);
-#else
-#define save_fpu(tsk)  do { } while (0)
-#endif
 
 #define unlazy_fpu(tsk, regs) do {                     \
        if (test_tsk_thread_flag(tsk, TIF_USEDFPU)) {   \
index 4931ba817d734aa8192374ef9e563d69b48f4c94..1987f3ea7f1b1422d8ae5ad02003d6f6c29a770a 100644 (file)
@@ -1,11 +1,15 @@
 /*
- * include/asm-ppc/rwsem.h: R/W semaphores for SH using the stuff
+ * include/asm-sh/rwsem.h: R/W semaphores for SH using the stuff
  * in lib/rwsem.c.
  */
 
 #ifndef _ASM_SH_RWSEM_H
 #define _ASM_SH_RWSEM_H
 
+#ifndef _LINUX_RWSEM_H
+#error "please don't include asm/rwsem.h directly, use linux/rwsem.h instead"
+#endif
+
 #ifdef __KERNEL__
 #include <linux/list.h>
 #include <linux/spinlock.h>
diff --git a/include/asm-sh/saturn/io.h b/include/asm-sh/saturn/io.h
deleted file mode 100644 (file)
index f1b9b5d..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * include/asm-sh/saturn/io.h
- *
- * I/O functions for use on the Sega Saturn.
- *
- * Copyright (C) 2002 Paul Mundt
- *
- * Released under the terms of the GNU GPL v2.0.
- */
-#ifndef __ASM_SH_SATURN_IO_H
-#define __ASM_SH_SATURN_IO_H
-
-/* arch/sh/boards/saturn/io.c */
-extern unsigned long saturn_isa_port2addr(unsigned long offset);
-extern void *saturn_ioremap(unsigned long offset, unsigned long size);
-extern void saturn_iounmap(void *addr);
-
-#endif /* __ASM_SH_SATURN_IO_H */
-
diff --git a/include/asm-sh/saturn/smpc.h b/include/asm-sh/saturn/smpc.h
deleted file mode 100644 (file)
index 5de5c12..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * include/asm-sh/saturn/smpc.h
- *
- * System Manager / Peripheral Control definitions.
- *
- * Copyright (C) 2002 Paul Mundt
- *
- * Released under the terms of the GNU GPL v2.0.
- */
-#ifndef __ASM_SH_SATURN_SMPC_H
-#define __ASM_SH_SATURN_SMPC_H
-
-#include <asm/io.h>
-
-#define SMPC_COMMAND   0x2010001f      /* SMPC command register */
-#define SMPC_RESULT    0x2010005f      /* SMPC result register */
-#define SMPC_STATUS    0x20100063      /* SMPC status register */
-
-#define SMPC_CMD_MSHON 0x0001          /* Master SH On */
-#define SMPC_CMD_SSHON 0x0002          /* Slave SH On */
-#define SMPC_CMD_SSHOFF        0x0003          /* Slave SH Off */
-#define SMPC_CMD_SNDON 0x0004          /* Sound On */
-#define SMPC_CMD_SNDOFF        0x0005          /* Sound Off */
-#define SMPC_CMD_CDON  0x0006          /* CD On */
-#define SMPC_CMD_CDOFF 0x0007          /* CD Off */
-
-static inline void smpc_barrier(void)
-{
-       while ((ctrl_inb(SMPC_STATUS) & 0x0001) == 0x0001)
-               ;
-}
-
-#endif /* __ASM_SH_SATURN_SMPC_H */
-
index 57abd708b236dc71b4097d8358ba4c9e6ebb1174..2a696b8ee4f55d690d1370abd840d865a24d4c68 100644 (file)
@@ -3,7 +3,7 @@
 
 #include <asm-generic/sections.h>
 
-extern char _end[];
+extern long __machvec_start, __machvec_end;
 
 #endif /* __ASM_SH_SECTIONS_H */
 
index 1583c6b7bdaa6a4d411895a5af7e4311185b2a0a..586a9711a75dbec4ef86557fef94a71cc26e03ee 100644 (file)
@@ -6,6 +6,7 @@
 #ifdef __KERNEL__
 
 int setup_early_printk(char *);
+void sh_mv_setup(void);
 
 #endif /* __KERNEL__ */
 
index df3b187ef8836e7168264e5546ae0017b494964b..4ff1eb9003013370b4ed062ec601d0bd1d7609cc 100644 (file)
 #define INTC_IPRD      0xffd00010UL
 
 #define IRL0_IRQ       2
-#define IRL0_IPR_ADDR  INTC_IPRD
 #define IRL0_IPR_POS   3
 #define IRL0_PRIORITY  13
 
 #define IRL1_IRQ       5
-#define IRL1_IPR_ADDR  INTC_IPRD
 #define IRL1_IPR_POS   2
 #define IRL1_PRIORITY  10
 
 #define IRL2_IRQ       8
-#define IRL2_IPR_ADDR  INTC_IPRD
 #define IRL2_IPR_POS   1
 #define IRL2_PRIORITY  7
 
 #define IRL3_IRQ       11
-#define IRL3_IPR_ADDR  INTC_IPRD
 #define IRL3_IPR_POS   0
 #define IRL3_PRIORITY  4
 
index caa7b93f1bce4f2276e142fff92b081f92425855..b99ca786c0c1986c028c7dc325e91ca97ae26e7b 100644 (file)
@@ -39,4 +39,6 @@ extern struct smp_fn_call_struct smp_fn_call;
 
 #endif /* CONFIG_SMP */
 
+#define hard_smp_processor_id()        (0)
+
 #endif /* __ASM_SH_SMP_H */
index 2d712e72c9e5ab9cae0afd1b32a2ab8201e5b792..3554e3a74e99703e06adb84c7b1b3ed618fac2f3 100644 (file)
  */
 
 #define IRL0_IRQ               2
-#define IRL0_IPR_ADDR  INTC_IPRD
 #define IRL0_IPR_POS   3
 #define IRL0_PRIORITY  13
 
 #define IRL1_IRQ               5
-#define IRL1_IPR_ADDR  INTC_IPRD
 #define IRL1_IPR_POS   2
 #define IRL1_PRIORITY  10
 
 #define IRL2_IRQ               8
-#define IRL2_IPR_ADDR  INTC_IPRD
 #define IRL2_IPR_POS   1
 #define IRL2_PRIORITY  7
 
 #define IRL3_IRQ               11
-#define IRL3_IPR_ADDR  INTC_IPRD
 #define IRL3_IPR_POS   0
 #define IRL3_PRIORITY  4
 #endif
diff --git a/include/asm-sh/sparsemem.h b/include/asm-sh/sparsemem.h
new file mode 100644 (file)
index 0000000..547a540
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef __ASM_SH_SPARSEMEM_H
+#define __ASM_SH_SPARSEMEM_H
+
+#ifdef __KERNEL__
+/*
+ * SECTION_SIZE_BITS           2^N: how big each section will be
+ * MAX_PHYSADDR_BITS           2^N: how much physical address space we have
+ * MAX_PHYSMEM_BITS            2^N: how much memory we can have in that space
+ */
+#define SECTION_SIZE_BITS      26
+#define MAX_PHYSADDR_BITS      32
+#define MAX_PHYSMEM_BITS       32
+
+#endif
+
+#endif /* __ASM_SH_SPARSEMEM_H */
index 82f3e229e62135c2e944e1fbbe5e316744e2c4c1..7c75045ae22b419da64e094f53bf35feb79484a0 100644 (file)
@@ -8,9 +8,13 @@
 
 #include <linux/irqflags.h>
 #include <linux/compiler.h>
+#include <linux/linkage.h>
 #include <asm/types.h>
 #include <asm/ptrace.h>
 
+struct task_struct *__switch_to(struct task_struct *prev,
+                               struct task_struct *next);
+
 /*
  *     switch_to() should switch tasks to task nr n, first
  */
@@ -122,7 +126,7 @@ static inline void sched_cacheflush(void)
 #define smp_read_barrier_depends()     do { } while(0)
 #endif
 
-#define set_mb(var, value) do { xchg(&var, value); } while (0)
+#define set_mb(var, value) do { (void)xchg(&var, value); } while (0)
 
 /*
  * Jump to P2 area.
@@ -271,6 +275,16 @@ extern unsigned int instruction_size(unsigned int insn);
 void disable_hlt(void);
 void enable_hlt(void);
 
+void default_idle(void);
+
+asmlinkage void break_point_trap(void);
+asmlinkage void debug_trap_handler(unsigned long r4, unsigned long r5,
+                                  unsigned long r6, unsigned long r7,
+                                  struct pt_regs __regs);
+asmlinkage void bug_trap_handler(unsigned long r4, unsigned long r5,
+                                unsigned long r6, unsigned long r7,
+                                struct pt_regs __regs);
+
 #define arch_align_stack(x) (x)
 
 #endif
index cff001c316feb98c80782c094437a8f90e977a1a..f402a3b1cfa48fd4b0d626d80ef3837305c4f41a 100644 (file)
@@ -1,6 +1,36 @@
 #ifndef _ASM_SH_TOPOLOGY_H
 #define _ASM_SH_TOPOLOGY_H
 
+#ifdef CONFIG_NUMA
+
+/* sched_domains SD_NODE_INIT for sh machines */
+#define SD_NODE_INIT (struct sched_domain) {           \
+       .span                   = CPU_MASK_NONE,        \
+       .parent                 = NULL,                 \
+       .child                  = NULL,                 \
+       .groups                 = NULL,                 \
+       .min_interval           = 8,                    \
+       .max_interval           = 32,                   \
+       .busy_factor            = 32,                   \
+       .imbalance_pct          = 125,                  \
+       .cache_nice_tries       = 2,                    \
+       .busy_idx               = 3,                    \
+       .idle_idx               = 2,                    \
+       .newidle_idx            = 0,                    \
+       .wake_idx               = 1,                    \
+       .forkexec_idx           = 1,                    \
+       .flags                  = SD_LOAD_BALANCE       \
+                               | SD_BALANCE_FORK       \
+                               | SD_BALANCE_EXEC       \
+                               | SD_SERIALIZE          \
+                               | SD_WAKE_BALANCE,      \
+       .last_balance           = jiffies,              \
+       .balance_interval       = 1,                    \
+       .nr_balance_failed      = 0,                    \
+}
+
+#endif
+
 #include <asm-generic/topology.h>
 
 #endif /* _ASM_SH_TOPOLOGY_H */
index 5c49ed6715f2a620a6d75d02583d76c16e1a6ee7..f18a1a5c95c0ad4856685ab050d71a48b8cf5081 100644 (file)
@@ -61,8 +61,6 @@ static inline void set_fs(mm_segment_t s)
  */
 static inline int __access_ok(unsigned long addr, unsigned long size)
 {
-       extern unsigned long memory_start, memory_end;
-
        return ((addr >= memory_start) && ((addr + size) < memory_end));
 }
 #else /* CONFIG_MMU */
@@ -76,7 +74,7 @@ static inline int __access_ok(unsigned long addr, unsigned long size)
  * __access_ok: Check if address with size is OK or not.
  *
  * We do three checks:
- * (1) is it user space? 
+ * (1) is it user space?
  * (2) addr + size --> carry?
  * (3) addr + size >= 0x80000000  (PAGE_OFFSET)
  *
@@ -142,11 +140,12 @@ static inline int access_ok(int type, const void __user *p, unsigned long size)
   __get_user_nocheck((x),(ptr),sizeof(*(ptr)))
 
 struct __large_struct { unsigned long buf[100]; };
-#define __m(x) (*(struct __large_struct *)(x))
+#define __m(x) (*(struct __large_struct __user *)(x))
 
 #define __get_user_size(x,ptr,size,retval)                     \
 do {                                                           \
        retval = 0;                                             \
+       __chk_user_ptr(ptr);                                    \
        switch (size) {                                         \
        case 1:                                                 \
                __get_user_asm(x, ptr, retval, "b");            \
@@ -175,6 +174,7 @@ do {                                                                \
 #define __get_user_check(x,ptr,size)                           \
 ({                                                             \
        long __gu_err, __gu_val;                                \
+       __chk_user_ptr(ptr);                                    \
        switch (size) {                                         \
        case 1:                                                 \
                __get_user_1(__gu_val, (ptr), __gu_err);        \
@@ -300,6 +300,7 @@ extern void __get_user_unknown(void);
 #define __put_user_size(x,ptr,size,retval)             \
 do {                                                   \
        retval = 0;                                     \
+       __chk_user_ptr(ptr);                            \
        switch (size) {                                 \
        case 1:                                         \
                __put_user_asm(x, ptr, retval, "b");    \
@@ -328,7 +329,7 @@ do {                                                        \
 #define __put_user_check(x,ptr,size)                           \
 ({                                                             \
        long __pu_err = -EFAULT;                                \
-       __typeof__(*(ptr)) *__pu_addr = (ptr);                  \
+       __typeof__(*(ptr)) __user *__pu_addr = (ptr);           \
                                                                \
        if (__access_ok((unsigned long)__pu_addr,size))         \
                __put_user_size((x),__pu_addr,(size),__pu_err); \
@@ -406,10 +407,10 @@ __asm__ __volatile__( \
 #endif
 
 extern void __put_user_unknown(void);
-\f
+
 /* Generic arbitrary sized copy.  */
 /* Return the number of bytes NOT copied */
-extern __kernel_size_t __copy_user(void *to, const void *from, __kernel_size_t n);
+__kernel_size_t __copy_user(void *to, const void *from, __kernel_size_t n);
 
 #define copy_to_user(to,from,n) ({ \
 void *__copy_to = (void *) (to); \
@@ -420,14 +421,6 @@ __copy_res = __copy_user(__copy_to, (void *) (from), __copy_size); \
 } else __copy_res = __copy_size; \
 __copy_res; })
 
-#define __copy_to_user(to,from,n)              \
-       __copy_user((void *)(to),               \
-                   (void *)(from), n)
-
-#define __copy_to_user_inatomic __copy_to_user
-#define __copy_from_user_inatomic __copy_from_user
-
-
 #define copy_from_user(to,from,n) ({ \
 void *__copy_to = (void *) (to); \
 void *__copy_from = (void *) (from); \
@@ -438,9 +431,20 @@ __copy_res = __copy_user(__copy_to, __copy_from, __copy_size); \
 } else __copy_res = __copy_size; \
 __copy_res; })
 
-#define __copy_from_user(to,from,n)            \
-       __copy_user((void *)(to),               \
-                   (void *)(from), n)
+static __always_inline unsigned long
+__copy_from_user(void *to, const void __user *from, unsigned long n)
+{
+       return __copy_user(to, (__force void *)from, n);
+}
+
+static __always_inline unsigned long __must_check
+__copy_to_user(void __user *to, const void *from, unsigned long n)
+{
+       return __copy_user((__force void *)to, from, n);
+}
+
+#define __copy_to_user_inatomic __copy_to_user
+#define __copy_from_user_inatomic __copy_from_user
 
 /*
  * Clear the area and return remaining number of bytes
index ae9bbdeefbe128035cee2cae9b28419436b814ff..38d46e01b8463dd04e20f664041a0df8d469a039 100644 (file)
 #define BRCR_UBDE              (1 << 0)
 
 #ifndef __ASSEMBLY__
-/* arch/sh/kernel/ubc.S */
-extern void ubc_wakeup(void);
+/* arch/sh/kernel/cpu/ubc.S */
 extern void ubc_sleep(void);
+
+#ifdef CONFIG_UBC_WAKEUP
+extern void ubc_wakeup(void);
+#else
+#define ubc_wakeup()   do { } while (0)
+#endif
 #endif
 
 #endif /* __KERNEL__ */
index b875482eb592d8dc4ce87b1f1ba83279e8989594..3488fe32e436ba503316313d82496069e78b7d79 100644 (file)
@@ -415,22 +415,15 @@ extern void __handle_bad_pmd_kernel(pmd_t * pmd);
 /*
  * The following have defined behavior only work if pte_present() is true.
  */
-static inline int pte_read(pte_t pte) { return pte_val(pte) & _PAGE_READ; }
-static inline int pte_exec(pte_t pte) { return pte_val(pte) & _PAGE_EXECUTE; }
 static inline int pte_dirty(pte_t pte){ return pte_val(pte) & _PAGE_DIRTY; }
 static inline int pte_young(pte_t pte){ return pte_val(pte) & _PAGE_ACCESSED; }
 static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE; }
 static inline int pte_write(pte_t pte){ return pte_val(pte) & _PAGE_WRITE; }
 
-static inline pte_t pte_rdprotect(pte_t pte)   { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_READ)); return pte; }
 static inline pte_t pte_wrprotect(pte_t pte)   { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_WRITE)); return pte; }
-static inline pte_t pte_exprotect(pte_t pte)   { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_EXECUTE)); return pte; }
 static inline pte_t pte_mkclean(pte_t pte)     { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_DIRTY)); return pte; }
 static inline pte_t pte_mkold(pte_t pte)       { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_ACCESSED)); return pte; }
-
-static inline pte_t pte_mkread(pte_t pte)      { set_pte(&pte, __pte(pte_val(pte) | _PAGE_READ)); return pte; }
 static inline pte_t pte_mkwrite(pte_t pte)     { set_pte(&pte, __pte(pte_val(pte) | _PAGE_WRITE)); return pte; }
-static inline pte_t pte_mkexec(pte_t pte)      { set_pte(&pte, __pte(pte_val(pte) | _PAGE_EXECUTE)); return pte; }
 static inline pte_t pte_mkdirty(pte_t pte)     { set_pte(&pte, __pte(pte_val(pte) | _PAGE_DIRTY)); return pte; }
 static inline pte_t pte_mkyoung(pte_t pte)     { set_pte(&pte, __pte(pte_val(pte) | _PAGE_ACCESSED)); return pte; }
 static inline pte_t pte_mkhuge(pte_t pte)      { set_pte(&pte, __pte(pte_val(pte) | _PAGE_SZHUGE)); return pte; }
index 59229aeba27b9c51a15a39985c088719d8bb5811..a55f4c3488b071d19c757742e0b34a1c6ffad78f 100644 (file)
@@ -151,7 +151,6 @@ BTFIXUPDEF_CALL_CONST(unsigned long, pgd_page_vaddr, pgd_t)
 BTFIXUPDEF_SETHI(none_mask)
 BTFIXUPDEF_CALL_CONST(int, pte_present, pte_t)
 BTFIXUPDEF_CALL(void, pte_clear, pte_t *)
-BTFIXUPDEF_CALL(int, pte_read, pte_t)
 
 static inline int pte_none(pte_t pte)
 {
@@ -160,7 +159,6 @@ static inline int pte_none(pte_t pte)
 
 #define pte_present(pte) BTFIXUP_CALL(pte_present)(pte)
 #define pte_clear(mm,addr,pte) BTFIXUP_CALL(pte_clear)(pte)
-#define pte_read(pte) BTFIXUP_CALL(pte_read)(pte)
 
 BTFIXUPDEF_CALL_CONST(int, pmd_bad, pmd_t)
 BTFIXUPDEF_CALL_CONST(int, pmd_present, pmd_t)
index bf39d86c0c9ec6f3c74a8ff430109b4b431df615..11ade6841971f22e671cd26578bb851eac6ba02c 100644 (file)
@@ -4,12 +4,7 @@
  */
 #include <asm/sstate.h>
 
-extern unsigned long loops_per_jiffy;
-
 static void __init check_bugs(void)
 {
-#ifndef CONFIG_SMP
-       cpu_data(0).udelay_val = loops_per_jiffy;
-#endif
        sstate_running();
 }
index 36511ca514165b4307033de76e7b09db646509c1..01fe6682b4054237ee55d8d4418310aaf68947cd 100644 (file)
@@ -31,8 +31,10 @@ typedef s32          compat_timer_t;
 
 typedef s32            compat_int_t;
 typedef s32            compat_long_t;
+typedef s64            compat_s64;
 typedef u32            compat_uint_t;
 typedef u32            compat_ulong_t;
+typedef u64            compat_u64;
 
 struct compat_timespec {
        compat_time_t   tv_sec;
index 445026fbec35e4619ca3b5a1b005a88f9841d5d6..98a6e609163e7cb149324682fb82df0c735a71ce 100644 (file)
@@ -19,7 +19,7 @@ typedef struct {
        unsigned int    __softirq_pending; /* must be 1st, see rtrap.S */
        unsigned int    __pad0;
        unsigned long   clock_tick;     /* %tick's per second */
-       unsigned long   udelay_val;
+       unsigned long   __pad;
        unsigned int    __pad1;
        unsigned int    __pad2;
 
@@ -80,7 +80,8 @@ struct trap_per_cpu {
        unsigned int            dev_mondo_qmask;
        unsigned int            resum_qmask;
        unsigned int            nonresum_qmask;
-       unsigned int            __pad2[3];
+       unsigned int            __pad2[1];
+       void                    *hdesc;
 } __attribute__((aligned(64)));
 extern struct trap_per_cpu trap_block[NR_CPUS];
 extern void init_cur_cpu_trap(struct thread_info *);
index a4aae6f8062741a757fcd2636228fd68b6bab68b..a77aa622d7622cfd17d69568b3ca3f59b9250d13 100644 (file)
@@ -1,37 +1,17 @@
 /* delay.h: Linux delay routines on sparc64.
  *
- * Copyright (C) 1996, 2004 David S. Miller (davem@davemloft.net).
- *
- * Based heavily upon x86 variant which is:
- * Copyright (C) 1993 Linus Torvalds
- *
- * Delay routines calling functions in arch/sparc64/lib/delay.c
+ * Copyright (C) 1996, 2004, 2007 David S. Miller (davem@davemloft.net).
  */
 
-#ifndef __SPARC64_DELAY_H
-#define __SPARC64_DELAY_H
-
-#include <linux/param.h>
-#include <asm/cpudata.h>
+#ifndef _SPARC64_DELAY_H
+#define _SPARC64_DELAY_H
 
 #ifndef __ASSEMBLY__
 
-extern void __bad_udelay(void);
-extern void __bad_ndelay(void);
-
-extern void __udelay(unsigned long usecs);
-extern void __ndelay(unsigned long nsecs);
-extern void __const_udelay(unsigned long usecs);
 extern void __delay(unsigned long loops);
-
-#define udelay(n) (__builtin_constant_p(n) ? \
-       ((n) > 20000 ? __bad_udelay() : __const_udelay((n) * 0x10c7ul)) : \
-       __udelay(n))
-       
-#define ndelay(n) (__builtin_constant_p(n) ? \
-       ((n) > 20000 ? __bad_ndelay() : __const_udelay((n) * 5ul)) : \
-       __ndelay(n))
+extern void udelay(unsigned long usecs);
+#define mdelay(n)      udelay((n) * 1000)
 
 #endif /* !__ASSEMBLY__ */
 
-#endif /* defined(__SPARC64_DELAY_H) */
+#endif /* _SPARC64_DELAY_H */
diff --git a/include/asm-sparc64/hvtramp.h b/include/asm-sparc64/hvtramp.h
new file mode 100644 (file)
index 0000000..c7dd6ad
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef _SPARC64_HVTRAP_H
+#define _SPARC64_HVTRAP_H
+
+#ifndef __ASSEMBLY__
+
+#include <linux/types.h>
+
+struct hvtramp_mapping {
+       __u64           vaddr;
+       __u64           tte;
+};
+
+struct hvtramp_descr {
+       __u32                   cpu;
+       __u32                   num_mappings;
+       __u64                   fault_info_va;
+       __u64                   fault_info_pa;
+       __u64                   thread_reg;
+       struct hvtramp_mapping  maps[2];
+};
+
+extern void hv_cpu_startup(unsigned long hvdescr_pa);
+
+#endif
+
+#define HVTRAMP_DESCR_CPU              0x00
+#define HVTRAMP_DESCR_NUM_MAPPINGS     0x04
+#define HVTRAMP_DESCR_FAULT_INFO_VA    0x08
+#define HVTRAMP_DESCR_FAULT_INFO_PA    0x10
+#define HVTRAMP_DESCR_THREAD_REG       0x18
+#define HVTRAMP_DESCR_MAPS             0x20
+
+#define HVTRAMP_MAPPING_VADDR          0x00
+#define HVTRAMP_MAPPING_TTE            0x08
+#define HVTRAMP_MAPPING_SIZE           0x10
+
+#endif /* _SPARC64_HVTRAP_H */
index db2130a95d68dea4f49e88aca19c9cb0c8a43105..524d49835dfd2002484bfecaec3d47e5fc957dea 100644 (file)
@@ -98,7 +98,7 @@
 #define HV_FAST_MACH_EXIT              0x00
 
 #ifndef __ASSEMBLY__
-extern void sun4v_mach_exit(unsigned long exit_core);
+extern void sun4v_mach_exit(unsigned long exit_code);
 #endif
 
 /* Domain services.  */
index 90781e34a95ca9b67bf1414ccd191466b9139300..e6c436ef9356c3b0c3a7e7e1dec455e4d06c798d 100644 (file)
@@ -53,6 +53,8 @@ extern unsigned int sun4v_build_msi(u32 devhandle, unsigned int *virt_irq_p,
 extern void sun4v_destroy_msi(unsigned int virt_irq);
 extern unsigned int sbus_build_irq(void *sbus, unsigned int ino);
 
+extern void fixup_irqs(void);
+
 static __inline__ void set_softint(unsigned long bits)
 {
        __asm__ __volatile__("wr        %0, 0x0, %%set_softint"
diff --git a/include/asm-sparc64/ldc.h b/include/asm-sparc64/ldc.h
new file mode 100644 (file)
index 0000000..bdb524a
--- /dev/null
@@ -0,0 +1,138 @@
+#ifndef _SPARC64_LDC_H
+#define _SPARC64_LDC_H
+
+#include <asm/hypervisor.h>
+
+extern int ldom_domaining_enabled;
+extern void ldom_set_var(const char *var, const char *value);
+extern void ldom_reboot(const char *boot_command);
+extern void ldom_power_off(void);
+
+/* The event handler will be evoked when link state changes
+ * or data becomes available on the receive side.
+ *
+ * For non-RAW links, if the LDC_EVENT_RESET event arrives the
+ * driver should reset all of it's internal state and reinvoke
+ * ldc_connect() to try and bring the link up again.
+ *
+ * For RAW links, ldc_connect() is not used.  Instead the driver
+ * just waits for the LDC_EVENT_UP event.
+ */
+struct ldc_channel_config {
+       void (*event)(void *arg, int event);
+
+       u32                     mtu;
+       unsigned int            rx_irq;
+       unsigned int            tx_irq;
+       u8                      mode;
+#define LDC_MODE_RAW           0x00
+#define LDC_MODE_UNRELIABLE    0x01
+#define LDC_MODE_RESERVED      0x02
+#define LDC_MODE_STREAM                0x03
+
+       u8                      debug;
+#define LDC_DEBUG_HS           0x01
+#define LDC_DEBUG_STATE                0x02
+#define LDC_DEBUG_RX           0x04
+#define LDC_DEBUG_TX           0x08
+#define LDC_DEBUG_DATA         0x10
+};
+
+#define LDC_EVENT_RESET                0x01
+#define LDC_EVENT_UP           0x02
+#define LDC_EVENT_DATA_READY   0x04
+
+#define LDC_STATE_INVALID      0x00
+#define LDC_STATE_INIT         0x01
+#define LDC_STATE_BOUND                0x02
+#define LDC_STATE_READY                0x03
+#define LDC_STATE_CONNECTED    0x04
+
+struct ldc_channel;
+
+/* Allocate state for a channel.  */
+extern struct ldc_channel *ldc_alloc(unsigned long id,
+                                    const struct ldc_channel_config *cfgp,
+                                    void *event_arg);
+
+/* Shut down and free state for a channel.  */
+extern void ldc_free(struct ldc_channel *lp);
+
+/* Register TX and RX queues of the link with the hypervisor.  */
+extern int ldc_bind(struct ldc_channel *lp, const char *name);
+
+/* For non-RAW protocols we need to complete a handshake before
+ * communication can proceed.  ldc_connect() does that, if the
+ * handshake completes successfully, an LDC_EVENT_UP event will
+ * be sent up to the driver.
+ */
+extern int ldc_connect(struct ldc_channel *lp);
+extern int ldc_disconnect(struct ldc_channel *lp);
+
+extern int ldc_state(struct ldc_channel *lp);
+
+/* Read and write operations.  Only valid when the link is up.  */
+extern int ldc_write(struct ldc_channel *lp, const void *buf,
+                    unsigned int size);
+extern int ldc_read(struct ldc_channel *lp, void *buf, unsigned int size);
+
+#define LDC_MAP_SHADOW 0x01
+#define LDC_MAP_DIRECT 0x02
+#define LDC_MAP_IO     0x04
+#define LDC_MAP_R      0x08
+#define LDC_MAP_W      0x10
+#define LDC_MAP_X      0x20
+#define LDC_MAP_RW     (LDC_MAP_R | LDC_MAP_W)
+#define LDC_MAP_RWX    (LDC_MAP_R | LDC_MAP_W | LDC_MAP_X)
+#define LDC_MAP_ALL    0x03f
+
+struct ldc_trans_cookie {
+       u64                     cookie_addr;
+       u64                     cookie_size;
+};
+
+struct scatterlist;
+extern int ldc_map_sg(struct ldc_channel *lp,
+                     struct scatterlist *sg, int num_sg,
+                     struct ldc_trans_cookie *cookies, int ncookies,
+                     unsigned int map_perm);
+
+extern int ldc_map_single(struct ldc_channel *lp,
+                         void *buf, unsigned int len,
+                         struct ldc_trans_cookie *cookies, int ncookies,
+                         unsigned int map_perm);
+
+extern void ldc_unmap(struct ldc_channel *lp, struct ldc_trans_cookie *cookies,
+                     int ncookies);
+
+extern int ldc_copy(struct ldc_channel *lp, int copy_dir,
+                   void *buf, unsigned int len, unsigned long offset,
+                   struct ldc_trans_cookie *cookies, int ncookies);
+
+static inline int ldc_get_dring_entry(struct ldc_channel *lp,
+                                     void *buf, unsigned int len,
+                                     unsigned long offset,
+                                     struct ldc_trans_cookie *cookies,
+                                     int ncookies)
+{
+       return ldc_copy(lp, LDC_COPY_IN, buf, len, offset, cookies, ncookies);
+}
+
+static inline int ldc_put_dring_entry(struct ldc_channel *lp,
+                                     void *buf, unsigned int len,
+                                     unsigned long offset,
+                                     struct ldc_trans_cookie *cookies,
+                                     int ncookies)
+{
+       return ldc_copy(lp, LDC_COPY_OUT, buf, len, offset, cookies, ncookies);
+}
+
+extern void *ldc_alloc_exp_dring(struct ldc_channel *lp, unsigned int len,
+                                struct ldc_trans_cookie *cookies,
+                                int *ncookies, unsigned int map_perm);
+
+extern void ldc_free_exp_dring(struct ldc_channel *lp, void *buf,
+                              unsigned int len,
+                              struct ldc_trans_cookie *cookies, int ncookies);
+
+#endif /* _SPARC64_LDC_H */
index c6383982b53ddfcfa4da57ec27a3ddd52de70dd5..e97c43133752ad3b6258cf5ada95adbe574f06e0 100644 (file)
@@ -2,38 +2,66 @@
 #define _SPARC64_MDESC_H
 
 #include <linux/types.h>
+#include <linux/cpumask.h>
 #include <asm/prom.h>
 
-struct mdesc_node;
-struct mdesc_arc {
-       const char              *name;
-       struct mdesc_node       *arc;
-};
-
-struct mdesc_node {
-       const char              *name;
-       u64                     node;
-       unsigned int            unique_id;
-       unsigned int            num_arcs;
-       unsigned int            irqs[2];
-       struct property         *properties;
-       struct mdesc_node       *hash_next;
-       struct mdesc_node       *allnodes_next;
-       struct mdesc_arc        arcs[0];
-};
-
-extern struct mdesc_node *md_find_node_by_name(struct mdesc_node *from,
-                                              const char *name);
-#define md_for_each_node_by_name(__mn, __name) \
-       for (__mn = md_find_node_by_name(NULL, __name); __mn; \
-            __mn = md_find_node_by_name(__mn, __name))
-
-extern struct property *md_find_property(const struct mdesc_node *mp,
-                                        const char *name,
-                                        int *lenp);
-extern const void *md_get_property(const struct mdesc_node *mp,
-                                  const char *name,
-                                  int *lenp);
+struct mdesc_handle;
+
+/* Machine description operations are to be surrounded by grab and
+ * release calls.  The mdesc_handle returned from the grab is
+ * the first argument to all of the operational calls that work
+ * on mdescs.
+ */
+extern struct mdesc_handle *mdesc_grab(void);
+extern void mdesc_release(struct mdesc_handle *);
+
+#define MDESC_NODE_NULL                (~(u64)0)
+
+extern u64 mdesc_node_by_name(struct mdesc_handle *handle,
+                             u64 from_node, const char *name);
+#define mdesc_for_each_node_by_name(__hdl, __node, __name) \
+       for (__node = mdesc_node_by_name(__hdl, MDESC_NODE_NULL, __name); \
+            (__node) != MDESC_NODE_NULL; \
+            __node = mdesc_node_by_name(__hdl, __node, __name))
+
+/* Access to property values returned from mdesc_get_property() are
+ * only valid inside of a mdesc_grab()/mdesc_release() sequence.
+ * Once mdesc_release() is called, the memory backed up by these
+ * pointers may reference freed up memory.
+ *
+ * Therefore callers must make copies of any property values
+ * they need.
+ *
+ * These same rules apply to mdesc_node_name().
+ */
+extern const void *mdesc_get_property(struct mdesc_handle *handle,
+                                     u64 node, const char *name, int *lenp);
+extern const char *mdesc_node_name(struct mdesc_handle *hp, u64 node);
+
+/* MD arc iteration, the standard sequence is:
+ *
+ *     unsigned long arc;
+ *     mdesc_for_each_arc(arc, handle, node, MDESC_ARC_TYPE_{FWD,BACK}) {
+ *             unsigned long target = mdesc_arc_target(handle, arc);
+ *             ...
+ *     }
+ */
+
+#define MDESC_ARC_TYPE_FWD     "fwd"
+#define MDESC_ARC_TYPE_BACK    "back"
+
+extern u64 mdesc_next_arc(struct mdesc_handle *handle, u64 from,
+                         const char *arc_type);
+#define mdesc_for_each_arc(__arc, __hdl, __node, __type) \
+       for (__arc = mdesc_next_arc(__hdl, __node, __type); \
+            (__arc) != MDESC_NODE_NULL; \
+            __arc = mdesc_next_arc(__hdl, __arc, __type))
+
+extern u64 mdesc_arc_target(struct mdesc_handle *hp, u64 arc);
+
+extern void mdesc_update(void);
+
+extern void mdesc_fill_in_cpu_data(cpumask_t mask);
 
 extern void sun4v_mdesc_init(void);
 
index 8d129032013e9b3e8fcf35a040f5438dab02959a..9fc225ed5500d20c5372653389d8783ffc49ef4b 100644 (file)
@@ -76,6 +76,9 @@ static inline void switch_mm(struct mm_struct *old_mm, struct mm_struct *mm, str
        unsigned long ctx_valid, flags;
        int cpu;
 
+       if (unlikely(mm == &init_mm))
+               return;
+
        spin_lock_irqsave(&mm->context.lock, flags);
        ctx_valid = CTX_VALID(mm->context);
        if (!ctx_valid)
index 9e80ad43b29ccc004cbf952497f5d91711e4ddf1..0393380d754a8a8782847c45f9fb6dafd98f91fe 100644 (file)
@@ -573,24 +573,6 @@ static inline unsigned long pte_exec(pte_t pte)
        return (pte_val(pte) & mask);
 }
 
-static inline unsigned long pte_read(pte_t pte)
-{
-       unsigned long mask;
-
-       __asm__ __volatile__(
-       "\n661: mov             %1, %0\n"
-       "       nop\n"
-       "       .section        .sun4v_2insn_patch, \"ax\"\n"
-       "       .word           661b\n"
-       "       sethi           %%uhi(%2), %0\n"
-       "       sllx            %0, 32, %0\n"
-       "       .previous\n"
-       : "=r" (mask)
-       : "i" (_PAGE_READ_4U), "i" (_PAGE_READ_4V));
-
-       return (pte_val(pte) & mask);
-}
-
 static inline unsigned long pte_file(pte_t pte)
 {
        unsigned long val = pte_val(pte);
diff --git a/include/asm-sparc64/power.h b/include/asm-sparc64/power.h
new file mode 100644 (file)
index 0000000..94495c1
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef _SPARC64_POWER_H
+#define _SPARC64_POWER_H
+
+extern void wake_up_powerd(void);
+extern int start_powerd(void);
+
+#endif /* !(_SPARC64_POWER_H) */
index 4fb8c4bfb84869bf58c302f811bdb2857aecd69d..e8a96a31761bad24b17d33911f1e942e26a1b415 100644 (file)
@@ -29,9 +29,6 @@
 #include <asm/bitops.h>
 #include <asm/atomic.h>
 
-extern cpumask_t phys_cpu_present_map;
-#define cpu_possible_map phys_cpu_present_map
-
 extern cpumask_t cpu_sibling_map[NR_CPUS];
 extern cpumask_t cpu_core_map[NR_CPUS];
 extern int sparc64_multi_core;
@@ -44,7 +41,12 @@ extern int hard_smp_processor_id(void);
 #define raw_smp_processor_id() (current_thread_info()->cpu)
 
 extern void smp_fill_in_sib_core_maps(void);
-extern unsigned char boot_cpu_id;
+extern void cpu_play_dead(void);
+
+#ifdef CONFIG_HOTPLUG_CPU
+extern int __cpu_disable(void);
+extern void __cpu_die(unsigned int cpu);
+#endif
 
 #endif /* !(__ASSEMBLY__) */
 
@@ -52,7 +54,6 @@ extern unsigned char boot_cpu_id;
 
 #define hard_smp_processor_id()                0
 #define smp_fill_in_sib_core_maps() do { } while (0)
-#define boot_cpu_id    (0)
 
 #endif /* !(CONFIG_SMP) */
 
diff --git a/include/asm-sparc64/vio.h b/include/asm-sparc64/vio.h
new file mode 100644 (file)
index 0000000..83c9642
--- /dev/null
@@ -0,0 +1,404 @@
+#ifndef _SPARC64_VIO_H
+#define _SPARC64_VIO_H
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/mod_devicetable.h>
+#include <linux/timer.h>
+#include <linux/spinlock.h>
+#include <linux/completion.h>
+#include <linux/list.h>
+
+#include <asm/ldc.h>
+#include <asm/mdesc.h>
+
+struct vio_msg_tag {
+       u8                      type;
+#define VIO_TYPE_CTRL          0x01
+#define VIO_TYPE_DATA          0x02
+#define VIO_TYPE_ERR           0x04
+
+       u8                      stype;
+#define VIO_SUBTYPE_INFO       0x01
+#define VIO_SUBTYPE_ACK                0x02
+#define VIO_SUBTYPE_NACK       0x04
+
+       u16                     stype_env;
+#define VIO_VER_INFO           0x0001
+#define VIO_ATTR_INFO          0x0002
+#define VIO_DRING_REG          0x0003
+#define VIO_DRING_UNREG                0x0004
+#define VIO_RDX                        0x0005
+#define VIO_PKT_DATA           0x0040
+#define VIO_DESC_DATA          0x0041
+#define VIO_DRING_DATA         0x0042
+#define VNET_MCAST_INFO                0x0101
+
+       u32             sid;
+};
+
+struct vio_rdx {
+       struct vio_msg_tag      tag;
+       u64                     resv[6];
+};
+
+struct vio_ver_info {
+       struct vio_msg_tag      tag;
+       u16                     major;
+       u16                     minor;
+       u8                      dev_class;
+#define VDEV_NETWORK           0x01
+#define VDEV_NETWORK_SWITCH    0x02
+#define VDEV_DISK              0x03
+#define VDEV_DISK_SERVER       0x04
+
+       u8                      resv1[3];
+       u64                     resv2[5];
+};
+
+struct vio_dring_register {
+       struct vio_msg_tag      tag;
+       u64                     dring_ident;
+       u32                     num_descr;
+       u32                     descr_size;
+       u16                     options;
+#define VIO_TX_DRING           0x0001
+#define VIO_RX_DRING           0x0002
+       u16                     resv;
+       u32                     num_cookies;
+       struct ldc_trans_cookie cookies[0];
+};
+
+struct vio_dring_unregister {
+       struct vio_msg_tag      tag;
+       u64                     dring_ident;
+       u64                     resv[5];
+};
+
+/* Data transfer modes */
+#define VIO_PKT_MODE           0x01 /* Packet based transfer   */
+#define VIO_DESC_MODE          0x02 /* In-band descriptors     */
+#define VIO_DRING_MODE         0x03 /* Descriptor rings        */
+
+struct vio_dring_data {
+       struct vio_msg_tag      tag;
+       u64                     seq;
+       u64                     dring_ident;
+       u32                     start_idx;
+       u32                     end_idx;
+       u8                      state;
+#define VIO_DRING_ACTIVE       0x01
+#define VIO_DRING_STOPPED      0x02
+
+       u8                      __pad1;
+       u16                     __pad2;
+       u32                     __pad3;
+       u64                     __par4[2];
+};
+
+struct vio_dring_hdr {
+       u8                      state;
+#define VIO_DESC_FREE          0x01
+#define VIO_DESC_READY         0x02
+#define VIO_DESC_ACCEPTED      0x03
+#define VIO_DESC_DONE          0x04
+       u8                      ack;
+#define VIO_ACK_ENABLE         0x01
+#define VIO_ACK_DISABLE                0x00
+
+       u16                     __pad1;
+       u32                     __pad2;
+};
+
+/* VIO disk specific structures and defines */
+struct vio_disk_attr_info {
+       struct vio_msg_tag      tag;
+       u8                      xfer_mode;
+       u8                      vdisk_type;
+#define VD_DISK_TYPE_SLICE     0x01 /* Slice in block device   */
+#define VD_DISK_TYPE_DISK      0x02 /* Entire block device     */
+       u16                     resv1;
+       u32                     vdisk_block_size;
+       u64                     operations;
+       u64                     vdisk_size;
+       u64                     max_xfer_size;
+       u64                     resv2[2];
+};
+
+struct vio_disk_desc {
+       struct vio_dring_hdr    hdr;
+       u64                     req_id;
+       u8                      operation;
+#define VD_OP_BREAD            0x01 /* Block read                      */
+#define VD_OP_BWRITE           0x02 /* Block write                     */
+#define VD_OP_FLUSH            0x03 /* Flush disk contents             */
+#define VD_OP_GET_WCE          0x04 /* Get write-cache status          */
+#define VD_OP_SET_WCE          0x05 /* Enable/disable write-cache      */
+#define VD_OP_GET_VTOC         0x06 /* Get VTOC                        */
+#define VD_OP_SET_VTOC         0x07 /* Set VTOC                        */
+#define VD_OP_GET_DISKGEOM     0x08 /* Get disk geometry               */
+#define VD_OP_SET_DISKGEOM     0x09 /* Set disk geometry               */
+#define VD_OP_SCSICMD          0x0a /* SCSI control command            */
+#define VD_OP_GET_DEVID                0x0b /* Get device ID                   */
+#define VD_OP_GET_EFI          0x0c /* Get EFI                         */
+#define VD_OP_SET_EFI          0x0d /* Set EFI                         */
+       u8                      slice;
+       u16                     resv1;
+       u32                     status;
+       u64                     offset;
+       u64                     size;
+       u32                     ncookies;
+       u32                     resv2;
+       struct ldc_trans_cookie cookies[0];
+};
+
+#define VIO_DISK_VNAME_LEN     8
+#define VIO_DISK_ALABEL_LEN    128
+#define VIO_DISK_NUM_PART      8
+
+struct vio_disk_vtoc {
+       u8                      volume_name[VIO_DISK_VNAME_LEN];
+       u16                     sector_size;
+       u16                     num_partitions;
+       u8                      ascii_label[VIO_DISK_ALABEL_LEN];
+       struct {
+               u16             id;
+               u16             perm_flags;
+               u32             resv;
+               u64             start_block;
+               u64             num_blocks;
+       } partitions[VIO_DISK_NUM_PART];
+};
+
+struct vio_disk_geom {
+       u16                     num_cyl; /* Num data cylinders          */
+       u16                     alt_cyl; /* Num alternate cylinders     */
+       u16                     beg_cyl; /* Cyl off of fixed head area  */
+       u16                     num_hd;  /* Num heads                   */
+       u16                     num_sec; /* Num sectors                 */
+       u16                     ifact;   /* Interleave factor           */
+       u16                     apc;     /* Alts per cylinder (SCSI)    */
+       u16                     rpm;     /* Revolutions per minute      */
+       u16                     phy_cyl; /* Num physical cylinders      */
+       u16                     wr_skip; /* Num sects to skip, writes   */
+       u16                     rd_skip; /* Num sects to skip, writes   */
+};
+
+struct vio_disk_devid {
+       u16                     resv;
+       u16                     type;
+       u32                     len;
+       char                    id[0];
+};
+
+struct vio_disk_efi {
+       u64                     lba;
+       u64                     len;
+       char                    data[0];
+};
+
+/* VIO net specific structures and defines */
+struct vio_net_attr_info {
+       struct vio_msg_tag      tag;
+       u8                      xfer_mode;
+       u8                      addr_type;
+#define VNET_ADDR_ETHERMAC     0x01
+       u16                     ack_freq;
+       u32                     resv1;
+       u64                     addr;
+       u64                     mtu;
+       u64                     resv2[3];
+};
+
+#define VNET_NUM_MCAST         7
+
+struct vio_net_mcast_info {
+       struct vio_msg_tag      tag;
+       u8                      set;
+       u8                      count;
+       u8                      mcast_addr[VNET_NUM_MCAST * 6];
+       u32                     resv;
+};
+
+struct vio_net_desc {
+       struct vio_dring_hdr    hdr;
+       u32                     size;
+       u32                     ncookies;
+       struct ldc_trans_cookie cookies[0];
+};
+
+#define VIO_MAX_RING_COOKIES   24
+
+struct vio_dring_state {
+       u64                     ident;
+       void                    *base;
+       u64                     snd_nxt;
+       u64                     rcv_nxt;
+       u32                     entry_size;
+       u32                     num_entries;
+       u32                     prod;
+       u32                     cons;
+       u32                     pending;
+       int                     ncookies;
+       struct ldc_trans_cookie cookies[VIO_MAX_RING_COOKIES];
+};
+
+static inline void *vio_dring_cur(struct vio_dring_state *dr)
+{
+       return dr->base + (dr->entry_size * dr->prod);
+}
+
+static inline void *vio_dring_entry(struct vio_dring_state *dr,
+                                   unsigned int index)
+{
+       return dr->base + (dr->entry_size * index);
+}
+
+static inline u32 vio_dring_avail(struct vio_dring_state *dr,
+                                 unsigned int ring_size)
+{
+       /* Ensure build-time power-of-2.  */
+       BUILD_BUG_ON(ring_size & (ring_size - 1));
+
+       return (dr->pending -
+               ((dr->prod - dr->cons) & (ring_size - 1)));
+}
+
+#define VIO_MAX_TYPE_LEN       64
+#define VIO_MAX_COMPAT_LEN     64
+
+struct vio_dev {
+       u64                     mp;
+       struct device_node      *dp;
+
+       char                    type[VIO_MAX_TYPE_LEN];
+       char                    compat[VIO_MAX_COMPAT_LEN];
+       int                     compat_len;
+
+       unsigned long           channel_id;
+
+       unsigned int            tx_irq;
+       unsigned int            rx_irq;
+
+       struct device           dev;
+};
+
+struct vio_driver {
+       struct list_head                node;
+       const struct vio_device_id      *id_table;
+       int (*probe)(struct vio_dev *dev, const struct vio_device_id *id);
+       int (*remove)(struct vio_dev *dev);
+       void (*shutdown)(struct vio_dev *dev);
+       unsigned long                   driver_data;
+       struct device_driver            driver;
+};
+
+struct vio_version {
+       u16             major;
+       u16             minor;
+};
+
+struct vio_driver_state;
+struct vio_driver_ops {
+       int     (*send_attr)(struct vio_driver_state *vio);
+       int     (*handle_attr)(struct vio_driver_state *vio, void *pkt);
+       void    (*handshake_complete)(struct vio_driver_state *vio);
+};
+
+struct vio_completion {
+       struct completion       com;
+       int                     err;
+       int                     waiting_for;
+};
+
+struct vio_driver_state {
+       /* Protects VIO handshake and, optionally, driver private state.  */
+       spinlock_t              lock;
+
+       struct ldc_channel      *lp;
+
+       u32                     _peer_sid;
+       u32                     _local_sid;
+       struct vio_dring_state  drings[2];
+#define VIO_DRIVER_TX_RING     0
+#define VIO_DRIVER_RX_RING     1
+
+       u8                      hs_state;
+#define VIO_HS_INVALID         0x00
+#define VIO_HS_GOTVERS         0x01
+#define VIO_HS_GOT_ATTR                0x04
+#define VIO_HS_SENT_DREG       0x08
+#define VIO_HS_SENT_RDX                0x10
+#define VIO_HS_GOT_RDX_ACK     0x20
+#define VIO_HS_GOT_RDX         0x40
+#define VIO_HS_SENT_RDX_ACK    0x80
+#define VIO_HS_COMPLETE                (VIO_HS_GOT_RDX_ACK | VIO_HS_SENT_RDX_ACK)
+
+       u8                      dev_class;
+
+       u8                      dr_state;
+#define VIO_DR_STATE_TXREG     0x01
+#define VIO_DR_STATE_RXREG     0x02
+#define VIO_DR_STATE_TXREQ     0x10
+#define VIO_DR_STATE_RXREQ     0x20
+
+       u8                      debug;
+#define VIO_DEBUG_HS           0x01
+#define VIO_DEBUG_DATA         0x02
+
+       void                    *desc_buf;
+       unsigned int            desc_buf_len;
+
+       struct vio_completion   *cmp;
+
+       struct vio_dev          *vdev;
+
+       struct timer_list       timer;
+
+       struct vio_version      ver;
+
+       struct vio_version      *ver_table;
+       int                     ver_table_entries;
+
+       char                    *name;
+
+       struct vio_driver_ops   *ops;
+};
+
+#define viodbg(TYPE, f, a...) \
+do {   if (vio->debug & VIO_DEBUG_##TYPE) \
+               printk(KERN_INFO "vio: ID[%lu] " f, \
+                      vio->vdev->channel_id, ## a); \
+} while (0)
+
+extern int vio_register_driver(struct vio_driver *drv);
+extern void vio_unregister_driver(struct vio_driver *drv);
+
+static inline struct vio_driver *to_vio_driver(struct device_driver *drv)
+{
+       return container_of(drv, struct vio_driver, driver);
+}
+
+static inline struct vio_dev *to_vio_dev(struct device *dev)
+{
+       return container_of(dev, struct vio_dev, dev);
+}
+
+extern int vio_ldc_send(struct vio_driver_state *vio, void *data, int len);
+extern void vio_link_state_change(struct vio_driver_state *vio, int event);
+extern void vio_conn_reset(struct vio_driver_state *vio);
+extern int vio_control_pkt_engine(struct vio_driver_state *vio, void *pkt);
+extern int vio_validate_sid(struct vio_driver_state *vio,
+                           struct vio_msg_tag *tp);
+extern u32 vio_send_sid(struct vio_driver_state *vio);
+extern int vio_ldc_alloc(struct vio_driver_state *vio,
+                        struct ldc_channel_config *base_cfg, void *event_arg);
+extern void vio_ldc_free(struct vio_driver_state *vio);
+extern int vio_driver_init(struct vio_driver_state *vio, struct vio_dev *vdev,
+                          u8 dev_class, struct vio_version *ver_table,
+                          int ver_table_size, struct vio_driver_ops *ops,
+                          char *name);
+
+extern void vio_port_up(struct vio_driver_state *vio);
+
+#endif /* _SPARC64_VIO_H */
index 1b1090a91a58f2954bfe5455edcc561e253cc83f..830fc6e5d49d0f41c87ab3e555ecea3a9fa3287f 100644 (file)
@@ -175,12 +175,6 @@ static inline int pte_none(pte_t pte)
  * The following only work if pte_present() is true.
  * Undefined behaviour if not..
  */
-static inline int pte_user(pte_t pte)
-{
-       return((pte_get_bits(pte, _PAGE_USER)) &&
-              !(pte_get_bits(pte, _PAGE_PROTNONE)));
-}
-
 static inline int pte_read(pte_t pte)
 { 
        return((pte_get_bits(pte, _PAGE_USER)) &&
@@ -238,18 +232,6 @@ static inline pte_t pte_mknewprot(pte_t pte)
        return(pte);
 }
 
-static inline pte_t pte_rdprotect(pte_t pte)
-{ 
-       pte_clear_bits(pte, _PAGE_USER);
-       return(pte_mknewprot(pte));
-}
-
-static inline pte_t pte_exprotect(pte_t pte)
-{ 
-       pte_clear_bits(pte, _PAGE_USER);
-       return(pte_mknewprot(pte));
-}
-
 static inline pte_t pte_mkclean(pte_t pte)
 {
        pte_clear_bits(pte, _PAGE_DIRTY);
index 18a13ba746053eb8da1dc912fda5957d0dc57577..6e5fd5c892d069439ed56191d837df54dd94dd58 100644 (file)
@@ -52,10 +52,21 @@ static inline struct thread_info *current_thread_info(void)
        return ti;
 }
 
+#ifdef CONFIG_DEBUG_STACK_USAGE
+
+#define alloc_thread_info(tsk) \
+       ((struct thread_info *) __get_free_pages(GFP_KERNEL | __GFP_ZERO, \
+                                                CONFIG_KERNEL_STACK_ORDER))
+#else
+
 /* thread information allocation */
 #define alloc_thread_info(tsk) \
-       ((struct thread_info *) kmalloc(THREAD_SIZE, GFP_KERNEL))
-#define free_thread_info(ti) kfree(ti)
+       ((struct thread_info *) __get_free_pages(GFP_KERNEL, \
+                                                CONFIG_KERNEL_STACK_ORDER))
+#endif
+
+#define free_thread_info(ti) \
+       free_pages((unsigned long)(ti),CONFIG_KERNEL_STACK_ORDER)
 
 #endif
 
index 05c0dc9ce1ea8b149a6dabe22d9ce1ccd4f4034f..5313abd5f388e9851c8049d83c063f25233e22de 100644 (file)
 #define TIOCSBRK       0x5427  /* BSD compatibility */
 #define TIOCCBRK       0x5428  /* BSD compatibility */
 #define TIOCGSID       0x5429  /* Return the session ID of FD */
+#define TCGETS2                _IOR('T',0x2A, struct termios2)
+#define TCSETS2                _IOW('T',0x2B, struct termios2)
+#define TCSETSW2       _IOW('T',0x2C, struct termios2)
+#define TCSETSF2       _IOW('T',0x2D, struct termios2)
 #define TIOCGPTN       _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
 #define TIOCSPTLCK     _IOW('T',0x31, int)  /* Lock/unlock Pty */
 
index 35412f7f3eeac6859b6e2b615ffd0d486c65350c..295d7bf69451bd18d75a4aefb11d263171d93165 100644 (file)
@@ -141,6 +141,7 @@ struct ktermios {
 #define HUPCL  0002000
 #define CLOCAL 0004000
 #define CBAUDEX 0010000
+#define    BOTHER 0010000
 #define    B57600 0010001
 #define   B115200 0010002
 #define   B230400 0010003
@@ -156,10 +157,12 @@ struct ktermios {
 #define  B3000000 0010015
 #define  B3500000 0010016
 #define  B4000000 0010017
-#define CIBAUD   002003600000  /* input baud rate (not used) */
+#define CIBAUD   002003600000          /* input baud rate */
 #define CMSPAR   010000000000          /* mark or space (stick) parity */
 #define CRTSCTS          020000000000          /* flow control */
 
+#define        IBSHIFT 16              /* Shifr from CBAUD to CIBAUD */
+
 /* c_lflag bits */
 #define ISIG   0000001
 #define ICANON 0000002
index c2c2b1d5877618f49ce3b6a2829c340fa1e2b7a4..fcd171838d9cefa3bf377ec1bf2cd0c099241b98 100644 (file)
@@ -80,8 +80,10 @@ struct termio {
        copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
 })
 
-#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios))
-#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios))
+#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2))
+#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2))
+#define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios))
+#define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios))
 
 #endif /* __KERNEL__ */
 
index b37ab8218ef03634e90d5dd8d59b2546e088481c..53cb96b68a62bcb1f040e78381e9e9e562cbb0f8 100644 (file)
@@ -33,8 +33,10 @@ typedef s32          compat_key_t;
 
 typedef s32            compat_int_t;
 typedef s32            compat_long_t;
+typedef s64 __attribute__((aligned(4))) compat_s64;
 typedef u32            compat_uint_t;
 typedef u32            compat_ulong_t;
+typedef u64 __attribute__((aligned(4))) compat_u64;
 
 struct compat_timespec {
        compat_time_t   tv_sec;
index e90e1677531be3fdd0820771720a44c6845a5eac..2acb9b7f6418ba25b03c9c576b46843a9b8a9bf7 100644 (file)
@@ -35,6 +35,8 @@ enum fixed_addresses {
        VSYSCALL_LAST_PAGE,
        VSYSCALL_FIRST_PAGE = VSYSCALL_LAST_PAGE + ((VSYSCALL_END-VSYSCALL_START) >> PAGE_SHIFT) - 1,
        VSYSCALL_HPET,
+       FIX_DBGP_BASE,
+       FIX_EARLYCON_MEM_BASE,
        FIX_HPET_BASE,
        FIX_APIC_BASE,  /* local (CPU) APIC) -- required for SMP or not */
        FIX_IO_APIC_BASE_0,
@@ -84,7 +86,7 @@ static __always_inline unsigned long fix_to_virt(const unsigned int idx)
        if (idx >= __end_of_fixed_addresses)
                __this_fixmap_does_not_exist();
 
-        return __fix_to_virt(idx);
+       return __fix_to_virt(idx);
 }
 
 #endif
index de2cd9a2303a92922a9dea817cd127841bf32765..7475095c5061b1634066f439c3112a209b6c7c29 100644 (file)
@@ -144,6 +144,7 @@ extern void early_iounmap(void *addr, unsigned long size);
  */
 extern void __iomem * ioremap_nocache (unsigned long offset, unsigned long size);
 extern void iounmap(volatile void __iomem *addr);
+extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys);
 
 /*
  * ISA I/O bus memory addresses are 1:1 with the physical address.
index 0a71e0b9a619c162235f50bdd358da0a4942ff78..4f169ac6b10ad06c39118eeee063e96ba289ff6c 100644 (file)
@@ -266,21 +266,15 @@ static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot)
  * Undefined behaviour if not..
  */
 #define __LARGE_PTE (_PAGE_PSE|_PAGE_PRESENT)
-static inline int pte_user(pte_t pte)          { return pte_val(pte) & _PAGE_USER; }
-static inline int pte_read(pte_t pte)          { return pte_val(pte) & _PAGE_USER; }
-static inline int pte_exec(pte_t pte)          { return !(pte_val(pte) & _PAGE_NX); }
 static inline int pte_dirty(pte_t pte)         { return pte_val(pte) & _PAGE_DIRTY; }
 static inline int pte_young(pte_t pte)         { return pte_val(pte) & _PAGE_ACCESSED; }
 static inline int pte_write(pte_t pte)         { return pte_val(pte) & _PAGE_RW; }
 static inline int pte_file(pte_t pte)          { return pte_val(pte) & _PAGE_FILE; }
 static inline int pte_huge(pte_t pte)          { return pte_val(pte) & _PAGE_PSE; }
 
-static inline pte_t pte_rdprotect(pte_t pte)   { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_USER)); return pte; }
-static inline pte_t pte_exprotect(pte_t pte)   { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_USER)); return pte; }
 static inline pte_t pte_mkclean(pte_t pte)     { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_DIRTY)); return pte; }
 static inline pte_t pte_mkold(pte_t pte)       { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_ACCESSED)); return pte; }
 static inline pte_t pte_wrprotect(pte_t pte)   { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_RW)); return pte; }
-static inline pte_t pte_mkread(pte_t pte)      { set_pte(&pte, __pte(pte_val(pte) | _PAGE_USER)); return pte; }
 static inline pte_t pte_mkexec(pte_t pte)      { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_NX)); return pte; }
 static inline pte_t pte_mkdirty(pte_t pte)     { set_pte(&pte, __pte(pte_val(pte) | _PAGE_DIRTY)); return pte; }
 static inline pte_t pte_mkyoung(pte_t pte)     { set_pte(&pte, __pte(pte_val(pte) | _PAGE_ACCESSED)); return pte; }
index 2d4b5db6ea6340406c62e99be1bc1398daa5770d..e9fc512cc2473a3585d425713637807120ef5722 100644 (file)
@@ -197,16 +197,13 @@ extern pgd_t swapper_pg_dir[PAGE_SIZE/sizeof(pgd_t)];
 
 /* Note: We use the _PAGE_USER bit to indicate write-protect kernel memory */
 
-static inline int pte_read(pte_t pte)  { return pte_val(pte) & _PAGE_USER; }
 static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW; }
 static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; }
 static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; }
 static inline int pte_file(pte_t pte)  { return pte_val(pte) & _PAGE_FILE; }
 static inline pte_t pte_wrprotect(pte_t pte)   { pte_val(pte) &= ~(_PAGE_RW | _PAGE_WRENABLE); return pte; }
-static inline pte_t pte_rdprotect(pte_t pte)   { pte_val(pte) &= ~_PAGE_USER; return pte; }
 static inline pte_t pte_mkclean(pte_t pte)     { pte_val(pte) &= ~_PAGE_DIRTY; return pte; }
 static inline pte_t pte_mkold(pte_t pte)       { pte_val(pte) &= ~_PAGE_ACCESSED; return pte; }
-static inline pte_t pte_mkread(pte_t pte)      { pte_val(pte) |= _PAGE_USER; return pte; }
 static inline pte_t pte_mkdirty(pte_t pte)     { pte_val(pte) |= _PAGE_DIRTY; return pte; }
 static inline pte_t pte_mkyoung(pte_t pte)     { pte_val(pte) |= _PAGE_ACCESSED; return pte; }
 static inline pte_t pte_mkwrite(pte_t pte)     { pte_val(pte) |= _PAGE_RW; return pte; }
index 127d2d192b5a097d3414bb1338f705e4cc165b41..bcf875e844fe79fc2bb7e5a93614d8af740bcb51 100644 (file)
@@ -247,7 +247,6 @@ unifdef-y += isdn.h
 unifdef-y += isdnif.h
 unifdef-y += isdn_divertif.h
 unifdef-y += isdn_ppp.h
-unifdef-y += isicom.h
 unifdef-y += jbd.h
 unifdef-y += joystick.h
 unifdef-y += kdev_t.h
index 93bfb0beb62a9f1903d37e266fcb22b8284cf5ec..8ff2749339484fdddd066bab4ab971916a510b93 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/device.h>
 #include <linux/list.h>
 #include <linux/klist.h>
-#include <linux/spinlock.h>
 
 struct attribute_container {
        struct list_head        node;
index fccc6e50298a20cb89eda2fd8a7dc11c7864cd77..8ca7ca0b47f0ebecd6be51ad1c2ed4529cd12bc7 100644 (file)
 #define AUDIT_ADD_RULE         1011    /* Add syscall filtering rule */
 #define AUDIT_DEL_RULE         1012    /* Delete syscall filtering rule */
 #define AUDIT_LIST_RULES       1013    /* List syscall filtering rules */
+#define AUDIT_TTY_GET          1014    /* Get TTY auditing status */
+#define AUDIT_TTY_SET          1015    /* Set TTY auditing status */
 
 #define AUDIT_FIRST_USER_MSG   1100    /* Userspace messages mostly uninteresting to kernel */
 #define AUDIT_USER_AVC         1107    /* We filter this differently */
+#define AUDIT_USER_TTY         1124    /* Non-ICANON TTY input meaning */
 #define AUDIT_LAST_USER_MSG    1199
 #define AUDIT_FIRST_USER_MSG2  2100    /* More user space messages */
 #define AUDIT_LAST_USER_MSG2   2999
@@ -92,6 +95,7 @@
 #define AUDIT_KERNEL_OTHER     1316    /* For use by 3rd party modules */
 #define AUDIT_FD_PAIR          1317    /* audit record for pipe/socketpair */
 #define AUDIT_OBJ_PID          1318    /* ptrace target */
+#define AUDIT_TTY              1319    /* Input on an administrative TTY */
 
 #define AUDIT_AVC              1400    /* SE Linux avc denial or grant */
 #define AUDIT_SELINUX_ERR      1401    /* Internal SE Linux Errors */
@@ -289,6 +293,10 @@ struct audit_status {
        __u32           backlog;        /* messages waiting in queue */
 };
 
+struct audit_tty_status {
+       __u32           enabled; /* 1 = enabled, 0 = disabled */
+};
+
 /* audit_rule_data supports filter rules with both integer and string
  * fields.  It corresponds with AUDIT_ADD_RULE, AUDIT_DEL_RULE and
  * AUDIT_LIST_RULES requests.
@@ -515,11 +523,13 @@ extern void                   audit_log_d_path(struct audit_buffer *ab,
                                             const char *prefix,
                                             struct dentry *dentry,
                                             struct vfsmount *vfsmnt);
+extern void                audit_log_lost(const char *message);
                                /* Private API (for audit.c only) */
 extern int audit_filter_user(struct netlink_skb_parms *cb, int type);
 extern int audit_filter_type(int type);
 extern int  audit_receive_filter(int type, int pid, int uid, int seq,
                         void *data, size_t datasz, uid_t loginuid, u32 sid);
+extern int audit_enabled;
 #else
 #define audit_log(c,g,t,f,...) do { ; } while (0)
 #define audit_log_start(c,g,t) ({ NULL; })
@@ -530,6 +540,7 @@ extern int  audit_receive_filter(int type, int pid, int uid, int seq,
 #define audit_log_untrustedstring(a,s) do { ; } while (0)
 #define audit_log_n_untrustedstring(a,n,s) do { ; } while (0)
 #define audit_log_d_path(b,p,d,v) do { ; } while (0)
+#define audit_enabled 0
 #endif
 #endif
 #endif
index f2542c24b328b291c23b3cbee3a12a9f1ae45e86..7011d6255593dda940f859ab02e89e505d1a57ae 100644 (file)
@@ -93,7 +93,6 @@ static inline int bdi_rw_congested(struct backing_dev_info *bdi)
 void clear_bdi_congested(struct backing_dev_info *bdi, int rw);
 void set_bdi_congested(struct backing_dev_info *bdi, int rw);
 long congestion_wait(int rw, long timeout);
-long congestion_wait_interruptible(int rw, long timeout);
 void congestion_end(int rw);
 
 #define bdi_cap_writeback_dirty(bdi) \
index 42aa0a54b6f4d919a1568a881aeaabb9469640d7..54398d2c6d8df6cab9c898d91ee775acfabab108 100644 (file)
@@ -10,6 +10,8 @@ enum bug_trap_type {
        BUG_TRAP_TYPE_BUG = 2,
 };
 
+struct pt_regs;
+
 #ifdef CONFIG_GENERIC_BUG
 #include <asm-generic/bug.h>
 
@@ -20,7 +22,7 @@ static inline int is_warning_bug(const struct bug_entry *bug)
 
 const struct bug_entry *find_bug(unsigned long bugaddr);
 
-enum bug_trap_type report_bug(unsigned long bug_addr);
+enum bug_trap_type report_bug(unsigned long bug_addr, struct pt_regs *regs);
 
 int  module_bug_finalize(const Elf_Ehdr *, const Elf_Shdr *,
                         struct module *);
@@ -31,7 +33,8 @@ int is_valid_bugaddr(unsigned long addr);
 
 #else  /* !CONFIG_GENERIC_BUG */
 
-static inline enum bug_trap_type report_bug(unsigned long bug_addr)
+static inline enum bug_trap_type report_bug(unsigned long bug_addr,
+                                           struct pt_regs *regs)
 {
        return BUG_TRAP_TYPE_BUG;
 }
index bbf8df7de28f0991fcc7a240eb8f70723b38eb35..2dfa58555934c28dd8bd3c4e27b56ec79ada5b28 100644 (file)
@@ -44,7 +44,6 @@ typedef struct __user_cap_data_struct {
   
 #ifdef __KERNEL__
 
-#include <linux/spinlock.h>
 #include <asm/current.h>
 
 /* #define STRICT_CAP_T_TYPECHECKS */
index f50f04bdbc166ab1df21c60ef67760aaae942236..2b641b176e7f2c51708d0d99b91f5daf41be2549 100644 (file)
@@ -414,8 +414,8 @@ struct cdrom_generic_command
 #define CDO_CHECK_TYPE         0x10    /* check type on open for data */
 
 /* Special codes used when specifying changer slots. */
-#define CDSL_NONE              ((int) (~0U>>1)-1)
-#define CDSL_CURRENT           ((int) (~0U>>1))
+#define CDSL_NONE              (INT_MAX-1)
+#define CDSL_CURRENT           INT_MAX
 
 /* For partition based multisession access. IDE can handle 64 partitions
  * per drive - SCSI CD-ROM's use minors to differentiate between the
diff --git a/include/linux/cobalt-nvram.h b/include/linux/cobalt-nvram.h
deleted file mode 100644 (file)
index ea42956..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * $Id: cobalt-nvram.h,v 1.20 2001/10/17 23:16:55 thockin Exp $
- * cobalt-nvram.h : defines for the various fields in the cobalt NVRAM
- *
- * Copyright 2001,2002 Sun Microsystems, Inc.
- */
-
-#ifndef COBALT_NVRAM_H
-#define COBALT_NVRAM_H
-
-#include <linux/nvram.h>
-
-#define COBT_CMOS_INFO_MAX             0x7f    /* top address allowed */
-#define COBT_CMOS_BIOS_DRIVE_INFO      0x12    /* drive info would go here */
-
-#define COBT_CMOS_CKS_START            NVRAM_OFFSET(0x0e)
-#define COBT_CMOS_CKS_END              NVRAM_OFFSET(0x7f)
-
-/* flag bytes - 16 flags for now, leave room for more */
-#define COBT_CMOS_FLAG_BYTE_0          NVRAM_OFFSET(0x10)
-#define COBT_CMOS_FLAG_BYTE_1          NVRAM_OFFSET(0x11)
-
-/* flags in flag bytes - up to 16 */
-#define COBT_CMOS_FLAG_MIN             0x0001
-#define COBT_CMOS_CONSOLE_FLAG         0x0001 /* console on/off */
-#define COBT_CMOS_DEBUG_FLAG           0x0002 /* ROM debug messages */
-#define COBT_CMOS_AUTO_PROMPT_FLAG     0x0004 /* boot to ROM prompt? */
-#define COBT_CMOS_CLEAN_BOOT_FLAG      0x0008 /* set by a clean shutdown */
-#define COBT_CMOS_HW_NOPROBE_FLAG      0x0010 /* go easy on the probing */
-#define COBT_CMOS_SYSFAULT_FLAG                0x0020 /* system fault detected */
-#define COBT_CMOS_OOPSPANIC_FLAG       0x0040 /* panic on oops */
-#define COBT_CMOS_DELAY_CACHE_FLAG     0x0080 /* delay cache initialization */
-#define COBT_CMOS_NOLOGO_FLAG          0x0100 /* hide "C" logo @ boot */
-#define COBT_CMOS_VERSION_FLAG         0x0200 /* the version field is valid */
-#define COBT_CMOS_FLAG_MAX             0x0200
-
-/* leave byte 0x12 blank - Linux looks for drive info here */
-
-/* CMOS structure version, valid if COBT_CMOS_VERSION_FLAG is true */
-#define COBT_CMOS_VERSION              NVRAM_OFFSET(0x13)
-#define COBT_CMOS_VER_BTOCODE          1 /* min. version needed for btocode */
-
-/* index of default boot method */
-#define COBT_CMOS_BOOT_METHOD          NVRAM_OFFSET(0x20)
-#define COBT_CMOS_BOOT_METHOD_DISK     0
-#define COBT_CMOS_BOOT_METHOD_ROM      1
-#define COBT_CMOS_BOOT_METHOD_NET      2
-
-#define COBT_CMOS_BOOT_DEV_MIN         NVRAM_OFFSET(0x21)
-/* major #, minor # of first through fourth boot device */
-#define COBT_CMOS_BOOT_DEV0_MAJ                NVRAM_OFFSET(0x21)
-#define COBT_CMOS_BOOT_DEV0_MIN                NVRAM_OFFSET(0x22)
-#define COBT_CMOS_BOOT_DEV1_MAJ                NVRAM_OFFSET(0x23)
-#define COBT_CMOS_BOOT_DEV1_MIN                NVRAM_OFFSET(0x24)
-#define COBT_CMOS_BOOT_DEV2_MAJ                NVRAM_OFFSET(0x25)
-#define COBT_CMOS_BOOT_DEV2_MIN                NVRAM_OFFSET(0x26)
-#define COBT_CMOS_BOOT_DEV3_MAJ                NVRAM_OFFSET(0x27)
-#define COBT_CMOS_BOOT_DEV3_MIN                NVRAM_OFFSET(0x28)
-#define COBT_CMOS_BOOT_DEV_MAX         NVRAM_OFFSET(0x28)
-
-/* checksum of bytes 0xe-0x7f */
-#define COBT_CMOS_CHECKSUM             NVRAM_OFFSET(0x2e)
-
-/* running uptime counter, units of 5 minutes (32 bits =~ 41000 years) */
-#define COBT_CMOS_UPTIME_0             NVRAM_OFFSET(0x30)
-#define COBT_CMOS_UPTIME_1             NVRAM_OFFSET(0x31)
-#define COBT_CMOS_UPTIME_2             NVRAM_OFFSET(0x32)
-#define COBT_CMOS_UPTIME_3             NVRAM_OFFSET(0x33)
-
-/* count of successful boots (32 bits) */
-#define COBT_CMOS_BOOTCOUNT_0          NVRAM_OFFSET(0x38)
-#define COBT_CMOS_BOOTCOUNT_1          NVRAM_OFFSET(0x39)
-#define COBT_CMOS_BOOTCOUNT_2          NVRAM_OFFSET(0x3a)
-#define COBT_CMOS_BOOTCOUNT_3          NVRAM_OFFSET(0x3b)
-
-/* 13 bytes: system serial number, same as on the back of the system */
-#define COBT_CMOS_SYS_SERNUM_LEN       13
-#define COBT_CMOS_SYS_SERNUM_0         NVRAM_OFFSET(0x40)
-#define COBT_CMOS_SYS_SERNUM_1         NVRAM_OFFSET(0x41)
-#define COBT_CMOS_SYS_SERNUM_2         NVRAM_OFFSET(0x42)
-#define COBT_CMOS_SYS_SERNUM_3         NVRAM_OFFSET(0x43)
-#define COBT_CMOS_SYS_SERNUM_4         NVRAM_OFFSET(0x44)
-#define COBT_CMOS_SYS_SERNUM_5         NVRAM_OFFSET(0x45)
-#define COBT_CMOS_SYS_SERNUM_6         NVRAM_OFFSET(0x46)
-#define COBT_CMOS_SYS_SERNUM_7         NVRAM_OFFSET(0x47)
-#define COBT_CMOS_SYS_SERNUM_8         NVRAM_OFFSET(0x48)
-#define COBT_CMOS_SYS_SERNUM_9         NVRAM_OFFSET(0x49)
-#define COBT_CMOS_SYS_SERNUM_10                NVRAM_OFFSET(0x4a)
-#define COBT_CMOS_SYS_SERNUM_11                NVRAM_OFFSET(0x4b)
-#define COBT_CMOS_SYS_SERNUM_12                NVRAM_OFFSET(0x4c)
-/* checksum for serial num - 1 byte */
-#define COBT_CMOS_SYS_SERNUM_CSUM      NVRAM_OFFSET(0x4f)
-
-#define COBT_CMOS_ROM_REV_MAJ          NVRAM_OFFSET(0x50)
-#define COBT_CMOS_ROM_REV_MIN          NVRAM_OFFSET(0x51)
-#define COBT_CMOS_ROM_REV_REV          NVRAM_OFFSET(0x52)
-
-#define COBT_CMOS_BTO_CODE_0           NVRAM_OFFSET(0x53)
-#define COBT_CMOS_BTO_CODE_1           NVRAM_OFFSET(0x54)
-#define COBT_CMOS_BTO_CODE_2           NVRAM_OFFSET(0x55)
-#define COBT_CMOS_BTO_CODE_3           NVRAM_OFFSET(0x56)
-
-#define COBT_CMOS_BTO_IP_CSUM          NVRAM_OFFSET(0x57)
-#define COBT_CMOS_BTO_IP_0             NVRAM_OFFSET(0x58)
-#define COBT_CMOS_BTO_IP_1             NVRAM_OFFSET(0x59)
-#define COBT_CMOS_BTO_IP_2             NVRAM_OFFSET(0x5a)
-#define COBT_CMOS_BTO_IP_3             NVRAM_OFFSET(0x5b)
-
-#endif /* COBALT_NVRAM_H */
index 62ef6e11d0d25cb49fc5c33951a89c8d2e8b62b3..56a7bcda49cb202cdbcc0093ee8fd8437edbd5d2 100644 (file)
@@ -15,7 +15,6 @@
 #define _LINUX_CONSOLE_H_ 1
 
 #include <linux/types.h>
-#include <linux/spinlock.h>
 
 struct vc_data;
 struct console_font_op;
@@ -99,6 +98,7 @@ struct console {
        struct tty_driver *(*device)(struct console *, int *);
        void    (*unblank)(void);
        int     (*setup)(struct console *, char *);
+       int     (*early_setup)(void);
        short   flags;
        short   index;
        int     cflag;
@@ -107,6 +107,7 @@ struct console {
 };
 
 extern int add_preferred_console(char *name, int idx, char *options);
+extern int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options);
 extern void register_console(struct console *);
 extern int unregister_console(struct console *);
 extern struct console *console_drivers;
index 82c9a1f11020b2ecfd1f3947d42ac6218b50a841..06b2768c603f6a9ff0aeb70ef050245698b5ee78 100644 (file)
@@ -8,9 +8,12 @@
 #define IBMPC_MAP 2
 #define USER_MAP 3
 
+#include <linux/types.h>
+
 struct vc_data;
 
-extern unsigned char inverse_translate(struct vc_data *conp, int glyph);
+extern u16 inverse_translate(struct vc_data *conp, int glyph, int use_unicode);
 extern unsigned short *set_translate(int m, struct vc_data *vc);
 extern int conv_uni_to_pc(struct vc_data *conp, long ucs);
+extern u32 conv_8bit_to_uni(unsigned char c);
 void console_map_init(void);
index 3b2df2523f1d79d4ce0d0c2f35e1c0a83df7bd65..c2236bbff412cfac46bdd2c1cb84ebd7c3f961ec 100644 (file)
@@ -120,7 +120,6 @@ static inline void cpuhotplug_mutex_unlock(struct mutex *cpu_hp_mutex)
 
 #define lock_cpu_hotplug()     do { } while (0)
 #define unlock_cpu_hotplug()   do { } while (0)
-#define lock_cpu_hotplug_interruptible() 0
 #define hotcpu_notifier(fn, pri)       do { (void)(fn); } while (0)
 #define register_hotcpu_notifier(nb)   do { (void)(nb); } while (0)
 #define unregister_hotcpu_notifier(nb) do { (void)(nb); } while (0)
index 9a663c6db16a09faf68fe0d544e1c41695a9a6ef..2dc21cbeb3049a0d9a2ffa2d0ee27271c66d1c62 100644 (file)
@@ -31,7 +31,11 @@ static inline int valid_dma_direction(int dma_direction)
                (dma_direction == DMA_FROM_DEVICE));
 }
 
+#ifdef CONFIG_HAS_DMA
 #include <asm/dma-mapping.h>
+#else
+#include <asm-generic/dma-mapping-broken.h>
+#endif
 
 /* Backwards compat, remove in 2.7.x */
 #define dma_sync_single                dma_sync_single_for_cpu
index c281ba42e28fc021a5bc570a559103e085cb575d..d85d3f497b96166716d0d4c736f15282c1ebab81 100644 (file)
@@ -11,7 +11,6 @@
 #define __LINUX_DS17287RTC_H
 
 #include <linux/rtc.h>                 /* get the user-level API */
-#include <linux/spinlock.h>            /* spinlock_t */
 #include <linux/mc146818rtc.h>
 
 /* Register A */
index 4eda0ed76a4898cfb46581b9bddbd710ca91303e..d149f2959e671093bea029d5f43da4a7b53453a3 100644 (file)
@@ -33,6 +33,8 @@ struct ext2_sb_info {
        unsigned long s_gdb_count;      /* Number of group descriptor blocks */
        unsigned long s_desc_per_block; /* Number of group descriptors per block */
        unsigned long s_groups_count;   /* Number of groups in the fs */
+       unsigned long s_overhead_last;  /* Last calculated overhead */
+       unsigned long s_blocks_last;    /* Last seen block count */
        struct buffer_head * s_sbh;     /* Buffer containing the super block */
        struct ext2_super_block * s_es; /* Pointer to the super block in the buffer */
        struct buffer_head ** s_group_desc;
index f61309c81cc4f70124ad6bc7142b9343c460a641..d3c08353edf62e195ae1bcbceadc1afaffc1c915 100644 (file)
@@ -38,6 +38,8 @@ struct ext3_sb_info {
        unsigned long s_gdb_count;      /* Number of group descriptor blocks */
        unsigned long s_desc_per_block; /* Number of group descriptors per block */
        unsigned long s_groups_count;   /* Number of groups in the fs */
+       unsigned long s_overhead_last;  /* Last calculated overhead */
+       unsigned long s_blocks_last;    /* Last seen block count */
        struct buffer_head * s_sbh;     /* Buffer containing the super block */
        struct ext3_super_block * s_es; /* Pointer to the super block in the buffer */
        struct buffer_head ** s_group_desc;
index 691a713139ceea2b9457d16ab86286f2d1a972fe..2347557a327ae7b29dec75f153432cfda2c3137c 100644 (file)
@@ -39,6 +39,8 @@ struct ext4_sb_info {
        unsigned long s_gdb_count;      /* Number of group descriptor blocks */
        unsigned long s_desc_per_block; /* Number of group descriptors per block */
        unsigned long s_groups_count;   /* Number of groups in the fs */
+       unsigned long s_overhead_last;  /* Last calculated overhead */
+       unsigned long s_blocks_last;    /* Last seen block count */
        struct buffer_head * s_sbh;     /* Buffer containing the super block */
        struct ext4_super_block * s_es; /* Pointer to the super block in the buffer */
        struct buffer_head ** s_group_desc;
index a59001e9ea58bb2cd91c999d6b0f9dba6ac06f7e..0114fbc78061249fc765e8197fb06f5a512a6ea9 100644 (file)
@@ -73,6 +73,7 @@ extern struct file * FASTCALL(fget_light(unsigned int fd, int *fput_needed));
 extern void FASTCALL(set_close_on_exec(unsigned int fd, int flag));
 extern void put_filp(struct file *);
 extern int get_unused_fd(void);
+extern int get_unused_fd_flags(int flags);
 extern void FASTCALL(put_unused_fd(unsigned int fd));
 struct kmem_cache;
 
index 4f0b3bf5983c81fb495794d09b9b5e7c632b17dd..e687808102793fade448c1147faab0046f801e50 100644 (file)
@@ -44,7 +44,7 @@ extern int get_max_files(void);
 struct inodes_stat_t {
        int nr_inodes;
        int nr_unused;
-       int dummy[5];
+       int dummy[5];           /* padding for sysctl ABI compatibility */
 };
 extern struct inodes_stat_t inodes_stat;
 
@@ -820,6 +820,10 @@ struct file_lock {
        union {
                struct nfs_lock_info    nfs_fl;
                struct nfs4_lock_info   nfs4_fl;
+               struct {
+                       struct list_head link;  /* link in AFS vnode's pending_locks list */
+                       int state;              /* state of grant or error if -ve */
+               } afs;
        } fl_u;
 };
 
@@ -1610,6 +1614,9 @@ extern int __invalidate_device(struct block_device *);
 extern int invalidate_partition(struct gendisk *, int);
 #endif
 extern int invalidate_inodes(struct super_block *);
+unsigned long __invalidate_mapping_pages(struct address_space *mapping,
+                                       pgoff_t start, pgoff_t end,
+                                       bool be_atomic);
 unsigned long invalidate_mapping_pages(struct address_space *mapping,
                                        pgoff_t start, pgoff_t end);
 
index 534744efe30d764abaf8c8aa10baa03821153c24..9fbe9d258e2259b196fc752213dd84ea03a2f5d4 100644 (file)
@@ -339,7 +339,7 @@ struct fuse_dirent {
        char name[0];
 };
 
-#define FUSE_NAME_OFFSET ((unsigned) ((struct fuse_dirent *) 0)->name)
+#define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name)
 #define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(__u64) - 1) & ~(sizeof(__u64) - 1))
 #define FUSE_DIRENT_SIZE(d) \
        FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen)
index 17c29dca8354d2e88e8b971b5b02d290713e8b8b..540799bc85f864ad7569b50804ac7843ccdbe750 100644 (file)
@@ -329,12 +329,13 @@ extern void sysrq_timer_list_show(void);
 #ifdef CONFIG_TIMER_STATS
 
 extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
-                                    void *timerf, char * comm);
+                                    void *timerf, char *comm,
+                                    unsigned int timer_flag);
 
 static inline void timer_stats_account_hrtimer(struct hrtimer *timer)
 {
        timer_stats_update_stats(timer, timer->start_pid, timer->start_site,
-                                timer->function, timer->start_comm);
+                                timer->function, timer->start_comm, 0);
 }
 
 extern void __timer_stats_hrtimer_set_start_info(struct hrtimer *timer,
index 52f53e2e70c3c2cf6e89e8069f93dddbec24c806..333a370a3bdce0d2f6603ab90d01cf455ad49c84 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/slab.h>
 #include <linux/workqueue.h>   /* work_struct */
 #include <linux/mempool.h>
+#include <linux/mutex.h>
 
 #include <asm/io.h>
 #include <asm/semaphore.h>     /* Needed for MUTEX init macros */
@@ -425,7 +426,7 @@ struct i2o_device {
 
        struct device device;
 
-       struct semaphore lock;  /* device lock */
+       struct mutex lock;      /* device lock */
 };
 
 /*
@@ -544,7 +545,7 @@ struct i2o_controller {
        struct i2o_dma hrt;     /* HW Resource Table */
        i2o_lct *lct;           /* Logical Config Table */
        struct i2o_dma dlct;    /* Temp LCT */
-       struct semaphore lct_lock;      /* Lock for LCT updates */
+       struct mutex lct_lock;  /* Lock for LCT updates */
        struct i2o_dma status_block;    /* IOP status block */
 
        struct i2o_io base;     /* controller messaging unit */
index 915572fa030b678835732a166b0f7b86e4dc1fb6..0edda411959cb3126d81a7f87c2542ff4f5a57be 100644 (file)
@@ -78,8 +78,11 @@ void *idr_find(struct idr *idp, int id);
 int idr_pre_get(struct idr *idp, gfp_t gfp_mask);
 int idr_get_new(struct idr *idp, void *ptr, int *id);
 int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id);
+int idr_for_each(struct idr *idp,
+                int (*fn)(int id, void *p, void *data), void *data);
 void *idr_replace(struct idr *idp, void *ptr, int id);
 void idr_remove(struct idr *idp, int id);
+void idr_remove_all(struct idr *idp);
 void idr_destroy(struct idr *idp);
 void idr_init(struct idr *idp);
 
index 56ec4c62eee066d6886ec2f0bfe96fa273368785..5b528531633969ded20d830fd60272065c0932ce 100644 (file)
@@ -171,9 +171,6 @@ struct obs_kernel_param {
 #define __setup(str, fn)                                       \
        __setup_param(str, fn, fn, 0)
 
-#define __obsolete_setup(str)                                  \
-       __setup_null_param(str, __LINE__)
-
 /* NOTE: fn is as per module_param, not __setup!  Emits warning if fn
  * returns non-zero. */
 #define early_param(str, fn)                                   \
@@ -239,7 +236,6 @@ void __init parse_early_param(void);
 #define __setup_param(str, unique_id, fn)      /* nothing */
 #define __setup_null_param(str, unique_id)     /* nothing */
 #define __setup(str, func)                     /* nothing */
-#define __obsolete_setup(str)                  /* nothing */
 #endif
 
 /* Data marked not to be saved by software suspend */
index 276ccaa2670c06892b8e5b402c1561750da6bc03..cab741c2d6033ad937b761852def3fbbf60b763b 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/lockdep.h>
 #include <linux/ipc.h>
 #include <linux/pid_namespace.h>
+#include <linux/user_namespace.h>
 
 #define INIT_FDTABLE \
 {                                                      \
@@ -78,6 +79,7 @@ extern struct nsproxy init_nsproxy;
        .uts_ns         = &init_uts_ns,                                 \
        .mnt_ns         = NULL,                                         \
        INIT_IPC_NS(ipc_ns)                                             \
+       .user_ns        = &init_user_ns,                                \
 }
 
 #define INIT_SIGHAND(sighand) {                                                \
index 8423dd376514aee8d93cbeb2155647a78d54ee33..e3b2dda6c8eb5dd97c3ec78befe9c5c0cdb735a0 100644 (file)
@@ -63,32 +63,7 @@ void __iomem * devm_ioremap(struct device *dev, unsigned long offset,
 void __iomem * devm_ioremap_nocache(struct device *dev, unsigned long offset,
                                    unsigned long size);
 void devm_iounmap(struct device *dev, void __iomem *addr);
-
-/**
- *     check_signature         -       find BIOS signatures
- *     @io_addr: mmio address to check
- *     @signature:  signature block
- *     @length: length of signature
- *
- *     Perform a signature comparison with the mmio address io_addr. This
- *     address should have been obtained by ioremap.
- *     Returns 1 on a match.
- */
-
-static inline int check_signature(const volatile void __iomem *io_addr,
-       const unsigned char *signature, int length)
-{
-       int retval = 0;
-       do {
-               if (readb(io_addr) != *signature)
-                       goto out;
-               io_addr++;
-               signature++;
-               length--;
-       } while (length);
-       retval = 1;
-out:
-       return retval;
-}
+int check_signature(const volatile void __iomem *io_addr,
+                       const unsigned char *signature, int length);
 
 #endif /* _LINUX_IO_H */
index 1980867a64a4cb3e84ab57f5ee93cd66fefb8419..3fd3ddd5f0d9e4bb885367f8de6fde50dc00918d 100644 (file)
@@ -52,6 +52,7 @@ struct ipc_perm
 #ifdef __KERNEL__
 
 #include <linux/kref.h>
+#include <linux/spinlock.h>
 
 #define IPCMNI 32768  /* <= MAX_INT limit for ipc arrays (including sysctl changes) */
 
@@ -92,6 +93,7 @@ extern struct ipc_namespace init_ipc_ns;
 
 #ifdef CONFIG_SYSVIPC
 #define INIT_IPC_NS(ns)                .ns             = &init_ipc_ns,
+extern void free_ipc_ns(struct kref *kref);
 extern struct ipc_namespace *copy_ipcs(unsigned long flags,
                                                struct ipc_namespace *ns);
 #else
@@ -103,13 +105,9 @@ static inline struct ipc_namespace *copy_ipcs(unsigned long flags,
 }
 #endif
 
-#ifdef CONFIG_IPC_NS
-extern void free_ipc_ns(struct kref *kref);
-#endif
-
 static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
 {
-#ifdef CONFIG_IPC_NS
+#ifdef CONFIG_SYSVIPC
        if (ns)
                kref_get(&ns->kref);
 #endif
@@ -118,7 +116,7 @@ static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
 
 static inline void put_ipc_ns(struct ipc_namespace *ns)
 {
-#ifdef CONFIG_IPC_NS
+#ifdef CONFIG_SYSVIPC
        kref_put(&ns->kref, free_ipc_ns);
 #endif
 }
@@ -126,5 +124,3 @@ static inline void put_ipc_ns(struct ipc_namespace *ns)
 #endif /* __KERNEL__ */
 
 #endif /* _LINUX_IPC_H */
-
-
index 1695054e8c63909a62b8e12d16fe5ca1c8cc625c..44657197fcb03de46c060e7634c73f3e126038d7 100644 (file)
@@ -161,6 +161,7 @@ struct irq_desc {
        unsigned int            wake_depth;     /* nested wake enables */
        unsigned int            irq_count;      /* For detecting broken IRQs */
        unsigned int            irqs_unhandled;
+       unsigned long           last_unhandled; /* Aging timer for unhandled count */
        spinlock_t              lock;
 #ifdef CONFIG_SMP
        cpumask_t               affinity;
index 88afceffb7cb45df03ecbcd1045af2117f429fb1..494bed7c2fc12f5133504daa7b4a2cc0e3b4b326 100644 (file)
@@ -13,7 +13,6 @@
 #define __LINUX_LEDS_H_INCLUDED
 
 #include <linux/list.h>
-#include <linux/spinlock.h>
 
 struct device;
 struct class_device;
index 582d8b711a13c895d73ad6babd828615054598fe..d793497ec1ca92ddfc0b12ba9854650b64f7beb1 100644 (file)
@@ -17,7 +17,7 @@
 #define LZO1X_MEM_COMPRESS     (16384 * sizeof(unsigned char *))
 #define LZO1X_1_MEM_COMPRESS   LZO1X_MEM_COMPRESS
 
-#define lzo1x_worst_compress(x) (x + (x / 64) + 16 + 3)
+#define lzo1x_worst_compress(x) ((x) + ((x) / 16) + 64 + 3)
 
 /* This requires 'workmem' of size LZO1X_1_MEM_COMPRESS */
 int lzo1x_1_compress(const unsigned char *src, size_t src_len,
index 1c1207472bb45657553ff349cf081c44840b310c..97d0cddfd223577dce88fbda95b14e8f6f80cfb2 100644 (file)
@@ -2,7 +2,6 @@
 #define _LINUX_MM_H
 
 #include <linux/errno.h>
-#include <linux/capability.h>
 
 #ifdef __KERNEL__
 
@@ -27,7 +26,6 @@ extern unsigned long max_mapnr;
 
 extern unsigned long num_physpages;
 extern void * high_memory;
-extern unsigned long vmalloc_earlyreserve;
 extern int page_cluster;
 
 #ifdef CONFIG_SYSCTL
@@ -1072,6 +1070,10 @@ extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned lo
 extern unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
        unsigned long len, unsigned long prot,
        unsigned long flag, unsigned long pgoff);
+extern unsigned long mmap_region(struct file *file, unsigned long addr,
+       unsigned long len, unsigned long flags,
+       unsigned int vm_flags, unsigned long pgoff,
+       int accountable);
 
 static inline unsigned long do_mmap(struct file *file, unsigned long addr,
        unsigned long len, unsigned long prot,
index d09b1345a3a14fcf7f5115a2d6efc092e25bd8ed..04b1636a970bdd77d1788272d8286dc9b41fdf2e 100644 (file)
@@ -566,6 +566,11 @@ int sysctl_min_unmapped_ratio_sysctl_handler(struct ctl_table *, int,
 int sysctl_min_slab_ratio_sysctl_handler(struct ctl_table *, int,
                        struct file *, void __user *, size_t *, loff_t *);
 
+extern int numa_zonelist_order_handler(struct ctl_table *, int,
+                       struct file *, void __user *, size_t *, loff_t *);
+extern char numa_zonelist_order[];
+#define NUMA_ZONELIST_ORDER_LEN 16     /* string buffer size */
+
 #include <linux/topology.h>
 /* Returns the number of the current Node. */
 #ifndef numa_node_id
index 1fa4d9813b318043d8f291b231ad15431818b5db..8eed44f8ca732877dc1bbf5d4c15c7fcc1f1a568 100644 (file)
@@ -14,7 +14,7 @@ struct mnt_namespace {
        int event;
 };
 
-extern struct mnt_namespace *copy_mnt_ns(int, struct mnt_namespace *,
+extern struct mnt_namespace *copy_mnt_ns(unsigned long, struct mnt_namespace *,
                struct fs_struct *);
 extern void __put_mnt_ns(struct mnt_namespace *ns);
 
index e6e0f86ef5fc8b2302d2711b5c8f99ccfd437e54..b6a646cea1cba4f1a3cbd9a3139077a3c162e21d 100644 (file)
@@ -6,7 +6,6 @@
  * Rewritten by Richard Henderson <rth@tamu.edu> Dec 1996
  * Rewritten again by Rusty Russell, 2002
  */
-#include <linux/spinlock.h>
 #include <linux/list.h>
 #include <linux/stat.h>
 #include <linux/compiler.h>
index 0e09c005dda87d435ced705a25e852b7f5cca2de..f950921523f55316e2ede3f73c7e4a5d22e98b34 100644 (file)
@@ -146,7 +146,7 @@ struct fat_boot_fsinfo {
 };
 
 struct msdos_dir_entry {
-       __u8    name[8],ext[3]; /* name and extension */
+       __u8    name[MSDOS_NAME];/* name and extension */
        __u8    attr;           /* attribute bits */
        __u8    lcase;          /* Case for base and extension */
        __u8    ctime_cs;       /* Creation time, centiseconds (0-199) */
index 83e39eb054d3b62eb07c12c471cf7ca322d56f7c..88766e43e121a5a3d5e6c627f2d91f6bc9b8b7db 100644 (file)
@@ -148,8 +148,6 @@ struct ncp_nls_ioctl
 #include <linux/ncp_fs_i.h>
 #include <linux/ncp_fs_sb.h>
 
-/* undef because public define in umsdos_fs.h (ncp_fs.h isn't public) */
-#undef PRINTK
 /* define because it is easy to change PRINTK to {*}PRINTK */
 #define PRINTK(format, args...) printk(KERN_DEBUG format , ## args)
 
index 189e0dc993ab6ab84a577d1ee0635946ec077072..ce06188b7a56796cb63736a7d03f62f7c623b10c 100644 (file)
@@ -28,10 +28,11 @@ struct nsproxy {
        struct ipc_namespace *ipc_ns;
        struct mnt_namespace *mnt_ns;
        struct pid_namespace *pid_ns;
+       struct user_namespace *user_ns;
 };
 extern struct nsproxy init_nsproxy;
 
-int copy_namespaces(int flags, struct task_struct *tsk);
+int copy_namespaces(unsigned long flags, struct task_struct *tsk);
 void get_task_namespaces(struct task_struct *tsk);
 void free_nsproxy(struct nsproxy *ns);
 int unshare_nsproxy_namespaces(unsigned long, struct nsproxy **,
index 37a71580ad8a4f8b9e099e1e6e51b155ef50526b..5e84f2e8d54cf5a9b8cd8fe702ee4186e0068c7e 100644 (file)
@@ -432,6 +432,8 @@ extern struct bus_type pci_bus_type;
  * code, or pci core code. */
 extern struct list_head pci_root_buses;        /* list of all known PCI buses */
 extern struct list_head pci_devices;   /* list of all devices */
+/* Some device drivers need know if pci is initiated */
+extern int no_pci_devices(void);
 
 void pcibios_fixup_bus(struct pci_bus *);
 int __must_check pcibios_enable_device(struct pci_dev *, int mask);
@@ -724,6 +726,7 @@ static inline struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *
 { return NULL; }
 
 #define pci_dev_present(ids)   (0)
+#define no_pci_devices()       (1)
 #define pci_find_present(ids)  (NULL)
 #define pci_dev_put(dev)       do { } while (0)
 
index b72be2f79e6a3d8d6b5c14aac33127e7544ab35b..926adaae0f9610885d5d64e341410a9b96900312 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef __LINUX_PERCPU_H
 #define __LINUX_PERCPU_H
 
-#include <linux/spinlock.h> /* For preempt_disable() */
+#include <linux/preempt.h>
 #include <linux/slab.h> /* For kmalloc() */
 #include <linux/smp.h>
 #include <linux/string.h> /* For memset() */
index f5aa593ccf32fe358da38271e4a25d0653cfd8a0..3d9f70972cdfa7a0943653037f777b548dc85478 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <linux/spinlock.h>
 #include <linux/smp.h>
+#include <linux/list.h>
 #include <linux/threads.h>
 #include <linux/percpu.h>
 #include <linux/types.h>
@@ -17,6 +18,9 @@
 struct percpu_counter {
        spinlock_t lock;
        s64 count;
+#ifdef CONFIG_HOTPLUG_CPU
+       struct list_head list;  /* All percpu_counters are on a list */
+#endif
        s32 *counters;
 };
 
@@ -26,18 +30,8 @@ struct percpu_counter {
 #define FBC_BATCH      (NR_CPUS*4)
 #endif
 
-static inline void percpu_counter_init(struct percpu_counter *fbc, s64 amount)
-{
-       spin_lock_init(&fbc->lock);
-       fbc->count = amount;
-       fbc->counters = alloc_percpu(s32);
-}
-
-static inline void percpu_counter_destroy(struct percpu_counter *fbc)
-{
-       free_percpu(fbc->counters);
-}
-
+void percpu_counter_init(struct percpu_counter *fbc, s64 amount);
+void percpu_counter_destroy(struct percpu_counter *fbc);
 void percpu_counter_mod(struct percpu_counter *fbc, s32 amount);
 s64 percpu_counter_sum(struct percpu_counter *fbc);
 
index 169c6c24209b471e63a61c48ef4d16cd9ad95717..b9a17e08ff0fa6cd24202defde59f46f31da351e 100644 (file)
@@ -29,7 +29,7 @@ static inline void get_pid_ns(struct pid_namespace *ns)
        kref_get(&ns->kref);
 }
 
-extern struct pid_namespace *copy_pid_ns(int flags, struct pid_namespace *ns);
+extern struct pid_namespace *copy_pid_ns(unsigned long flags, struct pid_namespace *ns);
 extern void free_pid_ns(struct kref *kref);
 
 static inline void put_pid_ns(struct pid_namespace *ns)
index 52a9be41250deae36aa604664b296563ce0fcf7f..e2eff9079fe9ff9f02f7e9704479571c02cdd9aa 100644 (file)
@@ -59,4 +59,8 @@
 # define PR_ENDIAN_LITTLE      1       /* True little endian mode */
 # define PR_ENDIAN_PPC_LITTLE  2       /* "PowerPC" pseudo little endian */
 
+/* Get/set process seccomp mode */
+#define PR_GET_SECCOMP 21
+#define PR_SET_SECCOMP 22
+
 #endif /* _LINUX_PRCTL_H */
index fc86f274147fa5accdcbd7920944c2f15c8dea7a..1adfe668d031ff62485cd2fb5071bdfa85b7b952 100644 (file)
@@ -27,7 +27,7 @@
        
        prefetch(x)     - prefetches the cacheline at "x" for read
        prefetchw(x)    - prefetches the cacheline at "x" for write
-       spin_lock_prefetch(x) - prefectches the spinlock *x for taking
+       spin_lock_prefetch(x) - prefetches the spinlock *x for taking
        
        there is also PREFETCH_STRIDE which is the architecure-prefered 
        "lookahead" size for prefetching streamed operations.
index 3469f96bc8b2d0e11543d57246f4c4ae75f64115..28e3664fdf1b860155157b3e1317b83a0203864f 100644 (file)
@@ -7,6 +7,8 @@
 #include <linux/magic.h>
 #include <asm/atomic.h>
 
+struct completion;
+
 /*
  * The proc filesystem constants/structures
  */
@@ -56,6 +58,14 @@ struct proc_dir_entry {
        gid_t gid;
        loff_t size;
        const struct inode_operations *proc_iops;
+       /*
+        * NULL ->proc_fops means "PDE is going away RSN" or
+        * "PDE is just created". In either case, e.g. ->read_proc won't be
+        * called because it's too late or too early, respectively.
+        *
+        * If you're allocating ->proc_fops dynamically, save a pointer
+        * somewhere.
+        */
        const struct file_operations *proc_fops;
        get_info_t *get_info;
        struct module *owner;
@@ -66,6 +76,9 @@ struct proc_dir_entry {
        atomic_t count;         /* use count */
        int deleted;            /* delete flag */
        void *set;
+       int pde_users;  /* number of callers into module in progress */
+       spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */
+       struct completion *pde_unload_completion;
 };
 
 struct kcore_list {
index cfb680585ab8bd87762fe3e9b2bedfb404882760..731edaca8ffda05f19f5aefa0ce5c580c0a51450 100644 (file)
@@ -26,6 +26,7 @@
 #define CLONE_STOPPED          0x02000000      /* Start in stopped state */
 #define CLONE_NEWUTS           0x04000000      /* New utsname group? */
 #define CLONE_NEWIPC           0x08000000      /* New ipcs */
+#define CLONE_NEWUSER          0x10000000      /* New user namespace */
 
 /*
  * Scheduling policies
@@ -287,6 +288,7 @@ extern signed long schedule_timeout_uninterruptible(signed long timeout);
 asmlinkage void schedule(void);
 
 struct nsproxy;
+struct user_namespace;
 
 /* Maximum number of active map areas.. This is a random (large) number */
 #define DEFAULT_MAX_MAP_COUNT  65536
@@ -529,6 +531,10 @@ struct signal_struct {
 #ifdef CONFIG_TASKSTATS
        struct taskstats *stats;
 #endif
+#ifdef CONFIG_AUDIT
+       unsigned audit_tty;
+       struct tty_audit_buf *tty_audit_buf;
+#endif
 };
 
 /* Context switch must be unlocked if interrupts are to be enabled */
@@ -972,7 +978,8 @@ struct task_struct {
        unsigned int rt_priority;
        cputime_t utime, stime;
        unsigned long nvcsw, nivcsw; /* context switch counts */
-       struct timespec start_time;
+       struct timespec start_time;             /* monotonic time */
+       struct timespec real_start_time;        /* boot based time */
 /* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */
        unsigned long min_flt, maj_flt;
 
@@ -1403,7 +1410,7 @@ extern struct task_struct *find_task_by_pid_type(int type, int pid);
 extern void __set_special_pids(pid_t session, pid_t pgrp);
 
 /* per-UID process charging. */
-extern struct user_struct * alloc_uid(uid_t);
+extern struct user_struct * alloc_uid(struct user_namespace *, uid_t);
 static inline struct user_struct *get_uid(struct user_struct *u)
 {
        atomic_inc(&u->__count);
index 1a82d30c4b17eea493a8f1ff3fd6c293d48dc434..d2b058130eb123586c95d843521f4cbbfdab6629 100644 (file)
@@ -1,5 +1,3 @@
-#include <linux/spinlock.h>
-
 u32 scx200_gpio_configure(unsigned index, u32 set, u32 clear);
 
 extern unsigned scx200_gpio_base;
index 3e8b1cf54303cf42f155c36630162b3fadcbeded..262a8dccfa812d193ccff7893c26ee7388116f72 100644 (file)
@@ -4,8 +4,6 @@
 
 #ifdef CONFIG_SECCOMP
 
-#define NR_SECCOMP_MODES 1
-
 #include <linux/thread_info.h>
 #include <asm/seccomp.h>
 
@@ -18,20 +16,23 @@ static inline void secure_computing(int this_syscall)
                __secure_computing(this_syscall);
 }
 
-static inline int has_secure_computing(struct thread_info *ti)
-{
-       return unlikely(test_ti_thread_flag(ti, TIF_SECCOMP));
-}
+extern long prctl_get_seccomp(void);
+extern long prctl_set_seccomp(unsigned long);
 
 #else /* CONFIG_SECCOMP */
 
 typedef struct { } seccomp_t;
 
 #define secure_computing(x) do { } while (0)
-/* static inline to preserve typechecking */
-static inline int has_secure_computing(struct thread_info *ti)
+
+static inline long prctl_get_seccomp(void)
+{
+       return -EINVAL;
+}
+
+static inline long prctl_set_seccomp(unsigned long arg2)
 {
-       return 0;
+       return -EINVAL;
 }
 
 #endif /* CONFIG_SECCOMP */
index 33fc8cb8ddfbaedf234300c397a87b50895e1ec7..deb714314fb169de39bf195921c01b2a7e8085a6 100644 (file)
@@ -177,11 +177,5 @@ struct serial_icounter_struct {
 #ifdef __KERNEL__
 #include <linux/compiler.h>
 
-/* Allow architectures to override entries in serial8250_ports[] at run time: */
-struct uart_port;      /* forward declaration */
-extern int early_serial_setup(struct uart_port *port);
-extern int early_serial_console_init(char *options);
-extern int serial8250_start_console(struct uart_port *port, char *options);
-
 #endif /* __KERNEL__ */
 #endif /* _LINUX_SERIAL_H */
index 71310d80c09aae4d866f743baeb6e5ae932651e2..706ee9a4c80ca50d956c358e07630f68cf6669ed 100644 (file)
@@ -60,4 +60,8 @@ void serial8250_unregister_port(int line);
 void serial8250_suspend_port(int line);
 void serial8250_resume_port(int line);
 
+extern int serial8250_find_port(struct uart_port *p);
+extern int serial8250_find_port_for_earlycon(void);
+extern int setup_early_serial8250_console(char *cmdline);
+
 #endif
index 9a5eac508e5e2497b5936e7b6a07166958af52b4..ea91abe740da0b76810b19a522b9d814f0e8aa6e 100644 (file)
@@ -6,7 +6,6 @@
 
 #ifdef __KERNEL__
 #include <linux/list.h>
-#include <linux/spinlock.h>
 
 /*
  * Real Time signals may be queued.
index cebcd3833c767e4849a59eb29277eec0e73ec89d..27402fea9b794d5e0f0960dd41bc67069ba4af49 100644 (file)
@@ -14,8 +14,6 @@
 #include <linux/gfp.h>
 #include <linux/types.h>
 
-typedef struct kmem_cache kmem_cache_t __deprecated;
-
 /*
  * Flags to pass to kmem_cache_create().
  * The ones marked DEBUG are only valid if CONFIG_SLAB_DEBUG is set.
@@ -44,7 +42,6 @@ struct kmem_cache *kmem_cache_create(const char *, size_t, size_t,
                        void (*)(void *, struct kmem_cache *, unsigned long));
 void kmem_cache_destroy(struct kmem_cache *);
 int kmem_cache_shrink(struct kmem_cache *);
-void *kmem_cache_alloc(struct kmem_cache *, gfp_t);
 void *kmem_cache_zalloc(struct kmem_cache *, gfp_t);
 void kmem_cache_free(struct kmem_cache *, void *);
 unsigned int kmem_cache_size(struct kmem_cache *);
@@ -63,16 +60,6 @@ int kmem_ptr_validate(struct kmem_cache *cachep, const void *ptr);
                sizeof(struct __struct), __alignof__(struct __struct),\
                (__flags), NULL, NULL)
 
-#ifdef CONFIG_NUMA
-extern void *kmem_cache_alloc_node(struct kmem_cache *, gfp_t flags, int node);
-#else
-static inline void *kmem_cache_alloc_node(struct kmem_cache *cachep,
-                                       gfp_t flags, int node)
-{
-       return kmem_cache_alloc(cachep, flags);
-}
-#endif
-
 /*
  * The largest kmalloc size supported by the slab allocators is
  * 32 megabyte (2^25) or the maximum allocatable page order if that is
@@ -91,7 +78,6 @@ static inline void *kmem_cache_alloc_node(struct kmem_cache *cachep,
 /*
  * Common kmalloc functions provided by all allocators
  */
-void *__kmalloc(size_t, gfp_t);
 void *__kzalloc(size_t, gfp_t);
 void * __must_check krealloc(const void *, size_t, gfp_t);
 void kfree(const void *);
@@ -102,40 +88,6 @@ size_t ksize(const void *);
  * @n: number of elements.
  * @size: element size.
  * @flags: the type of memory to allocate.
- */
-static inline void *kcalloc(size_t n, size_t size, gfp_t flags)
-{
-       if (n != 0 && size > ULONG_MAX / n)
-               return NULL;
-       return __kzalloc(n * size, flags);
-}
-
-/*
- * Allocator specific definitions. These are mainly used to establish optimized
- * ways to convert kmalloc() calls to kmem_cache_alloc() invocations by selecting
- * the appropriate general cache at compile time.
- */
-
-#if defined(CONFIG_SLAB) || defined(CONFIG_SLUB)
-#ifdef CONFIG_SLUB
-#include <linux/slub_def.h>
-#else
-#include <linux/slab_def.h>
-#endif /* !CONFIG_SLUB */
-#else
-
-/*
- * Fallback definitions for an allocator not wanting to provide
- * its own optimized kmalloc definitions (like SLOB).
- */
-
-/**
- * kmalloc - allocate memory
- * @size: how many bytes of memory are required.
- * @flags: the type of memory to allocate.
- *
- * kmalloc is the normal method of allocating memory
- * in the kernel.
  *
  * The @flags argument may be one of:
  *
@@ -143,7 +95,7 @@ static inline void *kcalloc(size_t n, size_t size, gfp_t flags)
  *
  * %GFP_KERNEL - Allocate normal kernel ram.  May sleep.
  *
- * %GFP_ATOMIC - Allocation will not sleep.
+ * %GFP_ATOMIC - Allocation will not sleep.  May use emergency pools.
  *   For example, use this inside interrupt handlers.
  *
  * %GFP_HIGHUSER - Allocate pages from high memory.
@@ -152,18 +104,22 @@ static inline void *kcalloc(size_t n, size_t size, gfp_t flags)
  *
  * %GFP_NOFS - Do not make any fs calls while trying to get memory.
  *
+ * %GFP_NOWAIT - Allocation will not sleep.
+ *
+ * %GFP_THISNODE - Allocate node-local memory only.
+ *
+ * %GFP_DMA - Allocation suitable for DMA.
+ *   Should only be used for kmalloc() caches. Otherwise, use a
+ *   slab created with SLAB_DMA.
+ *
  * Also it is possible to set different flags by OR'ing
  * in one or more of the following additional @flags:
  *
  * %__GFP_COLD - Request cache-cold pages instead of
  *   trying to return cache-warm pages.
  *
- * %__GFP_DMA - Request memory from the DMA-capable zone.
- *
  * %__GFP_HIGH - This allocation has high priority and may use emergency pools.
  *
- * %__GFP_HIGHMEM - Allocated memory may be from highmem.
- *
  * %__GFP_NOFAIL - Indicate that this allocation is in no way allowed to fail
  *   (think twice before using).
  *
@@ -173,24 +129,57 @@ static inline void *kcalloc(size_t n, size_t size, gfp_t flags)
  * %__GFP_NOWARN - If allocation fails, don't issue any warnings.
  *
  * %__GFP_REPEAT - If allocation fails initially, try once more before failing.
+ *
+ * There are other flags available as well, but these are not intended
+ * for general use, and so are not documented here. For a full list of
+ * potential flags, always refer to linux/gfp.h.
  */
-static inline void *kmalloc(size_t size, gfp_t flags)
+static inline void *kcalloc(size_t n, size_t size, gfp_t flags)
 {
-       return __kmalloc(size, flags);
+       if (n != 0 && size > ULONG_MAX / n)
+               return NULL;
+       return __kzalloc(n * size, flags);
 }
 
-/**
- * kzalloc - allocate memory. The memory is set to zero.
- * @size: how many bytes of memory are required.
- * @flags: the type of memory to allocate (see kmalloc).
+/*
+ * Allocator specific definitions. These are mainly used to establish optimized
+ * ways to convert kmalloc() calls to kmem_cache_alloc() invocations by
+ * selecting the appropriate general cache at compile time.
+ *
+ * Allocators must define at least:
+ *
+ *     kmem_cache_alloc()
+ *     __kmalloc()
+ *     kmalloc()
+ *     kzalloc()
+ *
+ * Those wishing to support NUMA must also define:
+ *
+ *     kmem_cache_alloc_node()
+ *     kmalloc_node()
+ *
+ * See each allocator definition file for additional comments and
+ * implementation notes.
  */
-static inline void *kzalloc(size_t size, gfp_t flags)
-{
-       return __kzalloc(size, flags);
-}
+#ifdef CONFIG_SLUB
+#include <linux/slub_def.h>
+#elif defined(CONFIG_SLOB)
+#include <linux/slob_def.h>
+#else
+#include <linux/slab_def.h>
 #endif
 
-#ifndef CONFIG_NUMA
+#if !defined(CONFIG_NUMA) && !defined(CONFIG_SLOB)
+/**
+ * kmalloc_node - allocate memory from a specific node
+ * @size: how many bytes of memory are required.
+ * @flags: the type of memory to allocate (see kcalloc).
+ * @node: node to allocate from.
+ *
+ * kmalloc() for non-local nodes, used to allocate from a specific node
+ * if available. Equivalent to kmalloc() in the non-NUMA single-node
+ * case.
+ */
 static inline void *kmalloc_node(size_t size, gfp_t flags, int node)
 {
        return kmalloc(size, flags);
@@ -200,7 +189,15 @@ static inline void *__kmalloc_node(size_t size, gfp_t flags, int node)
 {
        return __kmalloc(size, flags);
 }
-#endif /* !CONFIG_NUMA */
+
+void *kmem_cache_alloc(struct kmem_cache *, gfp_t);
+
+static inline void *kmem_cache_alloc_node(struct kmem_cache *cachep,
+                                       gfp_t flags, int node)
+{
+       return kmem_cache_alloc(cachep, flags);
+}
+#endif /* !CONFIG_NUMA && !CONFIG_SLOB */
 
 /*
  * kmalloc_track_caller is a special version of kmalloc that records the
@@ -247,4 +244,3 @@ extern void *__kmalloc_node_track_caller(size_t, gfp_t, int, void *);
 
 #endif /* __KERNEL__ */
 #endif /* _LINUX_SLAB_H */
-
index 8d81a60518e4c615a89a1993f82a3bc2c9a4ac1b..365d036c454ad11b051f50e8a236fc5de8d9f734 100644 (file)
@@ -25,6 +25,9 @@ struct cache_sizes {
 };
 extern struct cache_sizes malloc_sizes[];
 
+void *kmem_cache_alloc(struct kmem_cache *, gfp_t);
+void *__kmalloc(size_t size, gfp_t flags);
+
 static inline void *kmalloc(size_t size, gfp_t flags)
 {
        if (__builtin_constant_p(size)) {
@@ -79,6 +82,7 @@ found:
 
 #ifdef CONFIG_NUMA
 extern void *__kmalloc_node(size_t size, gfp_t flags, int node);
+extern void *kmem_cache_alloc_node(struct kmem_cache *, gfp_t flags, int node);
 
 static inline void *kmalloc_node(size_t size, gfp_t flags, int node)
 {
diff --git a/include/linux/slob_def.h b/include/linux/slob_def.h
new file mode 100644 (file)
index 0000000..a2daf2d
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef __LINUX_SLOB_DEF_H
+#define __LINUX_SLOB_DEF_H
+
+void *kmem_cache_alloc_node(struct kmem_cache *, gfp_t flags, int node);
+
+static inline void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
+{
+       return kmem_cache_alloc_node(cachep, flags, -1);
+}
+
+void *__kmalloc_node(size_t size, gfp_t flags, int node);
+
+static inline void *kmalloc_node(size_t size, gfp_t flags, int node)
+{
+       return __kmalloc_node(size, flags, node);
+}
+
+/**
+ * kmalloc - allocate memory
+ * @size: how many bytes of memory are required.
+ * @flags: the type of memory to allocate (see kcalloc).
+ *
+ * kmalloc is the normal method of allocating memory
+ * in the kernel.
+ */
+static inline void *kmalloc(size_t size, gfp_t flags)
+{
+       return __kmalloc_node(size, flags, -1);
+}
+
+static inline void *__kmalloc(size_t size, gfp_t flags)
+{
+       return kmalloc(size, flags);
+}
+
+/**
+ * kzalloc - allocate memory. The memory is set to zero.
+ * @size: how many bytes of memory are required.
+ * @flags: the type of memory to allocate (see kcalloc).
+ */
+static inline void *kzalloc(size_t size, gfp_t flags)
+{
+       return __kzalloc(size, flags);
+}
+
+#endif /* __LINUX_SLOB_DEF_H */
index 6207a3d8da7150abbb8c1361331b5f4945162b66..a582f677152520ae1cf8f2a3e802030b4873b4d8 100644 (file)
@@ -171,6 +171,9 @@ static inline struct kmem_cache *kmalloc_slab(size_t size)
 #define ZERO_SIZE_PTR ((void *)16)
 
 
+void *kmem_cache_alloc(struct kmem_cache *, gfp_t);
+void *__kmalloc(size_t size, gfp_t flags);
+
 static inline void *kmalloc(size_t size, gfp_t flags)
 {
        if (__builtin_constant_p(size) && !(flags & SLUB_DMA)) {
@@ -198,7 +201,8 @@ static inline void *kzalloc(size_t size, gfp_t flags)
 }
 
 #ifdef CONFIG_NUMA
-extern void *__kmalloc_node(size_t size, gfp_t flags, int node);
+void *__kmalloc_node(size_t size, gfp_t flags, int node);
+void *kmem_cache_alloc_node(struct kmem_cache *, gfp_t flags, int node);
 
 static inline void *kmalloc_node(size_t size, gfp_t flags, int node)
 {
index cf715a40d833909e9ce04d6bea75a4f7656d2ee2..58962c51dee108d3f9e5d12a23ce40e6e9387608 100644 (file)
@@ -3,7 +3,6 @@
 
 #ifdef CONFIG_LOCK_KERNEL
 #include <linux/sched.h>
-#include <linux/spinlock.h>
 
 #define kernel_locked()                (current->lock_depth >= 0)
 
index fe195c97a89d9d00346312b8c79fb11ed818c0bf..f852e1afd65a74ee34400b7bc4d9ef668d38a62c 100644 (file)
@@ -253,6 +253,9 @@ struct ucred {
 
 #define MSG_EOF         MSG_FIN
 
+#define MSG_CMSG_CLOEXEC 0x40000000    /* Set close_on_exit for file
+                                          descriptor received through
+                                          SCM_RIGHTS */
 #if defined(CONFIG_COMPAT)
 #define MSG_CMSG_COMPAT        0x80000000      /* This message needs 32 bit fixups */
 #else
index 34d4b075f7b86013a3399a928dfe303147bbffba..40c7b5d993b932f83864f04255e1853acd099dc5 100644 (file)
 #define SONYPI_COMMAND_GETCAMERAROMVERSION     18      /* obsolete */
 #define SONYPI_COMMAND_GETCAMERAREVISION       19      /* obsolete */
 
-int sonypi_camera_command(int command, u8 value);
-
 #endif                         /* __KERNEL__ */
 
 #endif                         /* _SONYPI_H_ */
index a946176db638c7198705a20a7d2fd715279dfc2d..c376f3b36c8980c9b434cabc693e7ef9b4ab43f3 100644 (file)
@@ -282,6 +282,13 @@ do {                                               \
        1 : ({ local_irq_restore(flags); 0; }); \
 })
 
+#define write_trylock_irqsave(lock, flags) \
+({ \
+       local_irq_save(flags); \
+       write_trylock(lock) ? \
+       1 : ({ local_irq_restore(flags); 0; }); \
+})
+
 /*
  * Locks two spinlocks l1 and l2.
  * l1_first indicates if spinlock l1 should be taken first.
index a46104a28f66db62236b34c587e09a9422213574..dce1ed2049727a9b7a3576abc0c075440bc121e6 100644 (file)
@@ -31,7 +31,7 @@
  */
 
 
-#define TASKSTATS_VERSION      4
+#define TASKSTATS_VERSION      5
 #define TS_COMM_LEN            32      /* should be >= TASK_COMM_LEN
                                         * in linux/sched.h */
 
@@ -149,6 +149,9 @@ struct taskstats {
        __u64   read_bytes;             /* bytes of read I/O */
        __u64   write_bytes;            /* bytes of write I/O */
        __u64   cancelled_write_bytes;  /* bytes of cancelled write I/O */
+
+       __u64  nvcsw;                   /* voluntary_ctxt_switches */
+       __u64  nivcsw;                  /* nonvoluntary_ctxt_switches */
 };
 
 
index dda9be685ab62871c116054394cecb29aec0502f..4bb05a829be9c3370e21778a4232053a56620ad7 100644 (file)
@@ -116,6 +116,8 @@ extern int do_setitimer(int which, struct itimerval *value,
 extern unsigned int alarm_setitimer(unsigned int seconds);
 extern int do_getitimer(int which, struct itimerval *value);
 extern void getnstimeofday(struct timespec *tv);
+extern void getboottime(struct timespec *ts);
+extern void monotonic_to_bootbased(struct timespec *ts);
 
 extern struct timespec timespec_trunc(struct timespec t, unsigned gran);
 extern int timekeeping_is_continuous(void);
index c661710d3627daeeb40dca898ef48e4123d023cb..78cf899b440969a44049f7c052e2f9e167b47bd5 100644 (file)
@@ -3,7 +3,6 @@
 
 #include <linux/list.h>
 #include <linux/ktime.h>
-#include <linux/spinlock.h>
 #include <linux/stddef.h>
 
 struct tvec_t_base_s;
@@ -91,16 +90,13 @@ extern unsigned long get_next_timer_interrupt(unsigned long now);
  */
 #ifdef CONFIG_TIMER_STATS
 
+#define TIMER_STATS_FLAG_DEFERRABLE    0x1
+
 extern void init_timer_stats(void);
 
 extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
-                                    void *timerf, char * comm);
-
-static inline void timer_stats_account_timer(struct timer_list *timer)
-{
-       timer_stats_update_stats(timer, timer->start_pid, timer->start_site,
-                                timer->function, timer->start_comm);
-}
+                                    void *timerf, char *comm,
+                                    unsigned int timer_flag);
 
 extern void __timer_stats_timer_set_start_info(struct timer_list *timer,
                                               void *addr);
@@ -119,10 +115,6 @@ static inline void init_timer_stats(void)
 {
 }
 
-static inline void timer_stats_account_timer(struct timer_list *timer)
-{
-}
-
 static inline void timer_stats_timer_set_start_info(struct timer_list *timer)
 {
 }
index bb4576085203cb12fbc6e367efff3f8d82933f05..691a1748d9d235a732346711c1ca84aeeb1251f9 100644 (file)
@@ -178,6 +178,7 @@ struct tty_bufhead {
 #define L_IEXTEN(tty)  _L_FLAG((tty),IEXTEN)
 
 struct device;
+struct signal_struct;
 /*
  * Where all of the state associated with a tty is kept while the tty
  * is open.  Since the termios state should be kept even if the tty
@@ -310,6 +311,7 @@ extern void tty_hangup(struct tty_struct * tty);
 extern void tty_vhangup(struct tty_struct * tty);
 extern void tty_unhangup(struct file *filp);
 extern int tty_hung_up_p(struct file * filp);
+extern int is_tty(struct file *filp);
 extern void do_SAK(struct tty_struct *tty);
 extern void __do_SAK(struct tty_struct *tty);
 extern void disassociate_ctty(int priv);
@@ -338,9 +340,46 @@ extern struct tty_struct *get_current_tty(void);
 
 extern struct mutex tty_mutex;
 
+extern void tty_write_unlock(struct tty_struct *tty);
+extern int tty_write_lock(struct tty_struct *tty, int ndelay);
+#define tty_is_writelocked(tty)  (mutex_is_locked(&tty->atomic_write_lock))
+
+
+
 /* n_tty.c */
 extern struct tty_ldisc tty_ldisc_N_TTY;
 
+/* tty_audit.c */
+#ifdef CONFIG_AUDIT
+extern void tty_audit_add_data(struct tty_struct *tty, unsigned char *data,
+                              size_t size);
+extern void tty_audit_exit(void);
+extern void tty_audit_fork(struct signal_struct *sig);
+extern void tty_audit_push(struct tty_struct *tty);
+extern void tty_audit_push_task(struct task_struct *tsk, uid_t loginuid);
+extern void tty_audit_opening(void);
+#else
+static inline void tty_audit_add_data(struct tty_struct *tty,
+                                     unsigned char *data, size_t size)
+{
+}
+static inline void tty_audit_exit(void)
+{
+}
+static inline void tty_audit_fork(struct signal_struct *sig)
+{
+}
+static inline void tty_audit_push(struct tty_struct *tty)
+{
+}
+static inline void tty_audit_push_task(struct task_struct *tsk, uid_t loginuid)
+{
+}
+static inline void tty_audit_opening(void)
+{
+}
+#endif
+
 /* tty_ioctl.c */
 extern int n_tty_ioctl(struct tty_struct * tty, struct file * file,
                       unsigned int cmd, unsigned long arg);
index 9af8bbcd8963a28305271dee71e2ec5bf7ff5a9c..b7fe13883bdb1ba2682b503cff268c7e3618df9b 100644 (file)
  *             2 of the License, or (at your option) any later version.
  */
 
-
-/* A word of warning: Our uio structure will clash with the C library one (which is now obsolete). Remove the C
-   library one from sys/uio.h if you have a very old library set */
-
 struct iovec
 {
        void __user *iov_base;  /* BSD uses caddr_t (1003.1g requires void *) */
@@ -38,11 +34,6 @@ struct kvec {
  
 #define UIO_FASTIOV    8
 #define UIO_MAXIOV     1024
-#if 0
-#define UIO_MAXIOV     16      /* Maximum iovec's in one operation 
-                                  16 matches BSD */
-                                /* Beg pardon: BSD has 1024 --ANK */
-#endif
 
 /*
  * Total number of bytes covered by an iovec.
diff --git a/include/linux/user_namespace.h b/include/linux/user_namespace.h
new file mode 100644 (file)
index 0000000..bb32057
--- /dev/null
@@ -0,0 +1,61 @@
+#ifndef _LINUX_USER_NAMESPACE_H
+#define _LINUX_USER_NAMESPACE_H
+
+#include <linux/kref.h>
+#include <linux/nsproxy.h>
+#include <linux/sched.h>
+#include <linux/err.h>
+
+#define UIDHASH_BITS   (CONFIG_BASE_SMALL ? 3 : 8)
+#define UIDHASH_SZ     (1 << UIDHASH_BITS)
+
+struct user_namespace {
+       struct kref             kref;
+       struct list_head        uidhash_table[UIDHASH_SZ];
+       struct user_struct      *root_user;
+};
+
+extern struct user_namespace init_user_ns;
+
+#ifdef CONFIG_USER_NS
+
+static inline struct user_namespace *get_user_ns(struct user_namespace *ns)
+{
+       if (ns)
+               kref_get(&ns->kref);
+       return ns;
+}
+
+extern struct user_namespace *copy_user_ns(int flags,
+                                          struct user_namespace *old_ns);
+extern void free_user_ns(struct kref *kref);
+
+static inline void put_user_ns(struct user_namespace *ns)
+{
+       if (ns)
+               kref_put(&ns->kref, free_user_ns);
+}
+
+#else
+
+static inline struct user_namespace *get_user_ns(struct user_namespace *ns)
+{
+       return &init_user_ns;
+}
+
+static inline struct user_namespace *copy_user_ns(int flags,
+                                                 struct user_namespace *old_ns)
+{
+       if (flags & CLONE_NEWUSER)
+               return ERR_PTR(-EINVAL);
+
+       return NULL;
+}
+
+static inline void put_user_ns(struct user_namespace *ns)
+{
+}
+
+#endif
+
+#endif /* _LINUX_USER_H */
index f8d3b326e93a2f9b8a2f5bc616877a433acfa73a..923db99175f2144a8df2ad0c8e3e2e5aaff6ebcc 100644 (file)
@@ -48,26 +48,14 @@ static inline void get_uts_ns(struct uts_namespace *ns)
        kref_get(&ns->kref);
 }
 
-#ifdef CONFIG_UTS_NS
-extern struct uts_namespace *copy_utsname(int flags, struct uts_namespace *ns);
+extern struct uts_namespace *copy_utsname(unsigned long flags,
+                                       struct uts_namespace *ns);
 extern void free_uts_ns(struct kref *kref);
 
 static inline void put_uts_ns(struct uts_namespace *ns)
 {
        kref_put(&ns->kref, free_uts_ns);
 }
-#else
-static inline struct uts_namespace *copy_utsname(int flags,
-                                               struct uts_namespace *ns)
-{
-       return ns;
-}
-
-static inline void put_uts_ns(struct uts_namespace *ns)
-{
-}
-#endif
-
 static inline struct new_utsname *utsname(void)
 {
        return &current->nsproxy->uts_ns->name;
index ce0719a2cfeb03f7fc542f79cd70210ba838d15d..ce6badc98f6dcb3f2b78615cd4aa382d6d956abd 100644 (file)
@@ -148,7 +148,7 @@ extern int keventd_up(void);
 extern void init_workqueues(void);
 int execute_in_process_context(work_func_t fn, struct execute_work *);
 
-extern void cancel_work_sync(struct work_struct *work);
+extern int cancel_work_sync(struct work_struct *work);
 
 /*
  * Kill off a pending schedule_delayed_work().  Note that the work callback
@@ -166,14 +166,21 @@ static inline int cancel_delayed_work(struct delayed_work *work)
        return ret;
 }
 
-extern void cancel_rearming_delayed_work(struct delayed_work *work);
+extern int cancel_delayed_work_sync(struct delayed_work *work);
 
-/* Obsolete. use cancel_rearming_delayed_work() */
+/* Obsolete. use cancel_delayed_work_sync() */
 static inline
 void cancel_rearming_delayed_workqueue(struct workqueue_struct *wq,
                                        struct delayed_work *work)
 {
-       cancel_rearming_delayed_work(work);
+       cancel_delayed_work_sync(work);
+}
+
+/* Obsolete. use cancel_delayed_work_sync() */
+static inline
+void cancel_rearming_delayed_work(struct delayed_work *work)
+{
+       cancel_delayed_work_sync(work);
 }
 
 #endif
index d9d878a3bb46835e1f2c4301620975e05757ee1d..0b0e29ed82d12456860e70484d5a73877d5ef7d3 100644 (file)
@@ -120,15 +120,6 @@ config SYSVIPC
          section 6.4 of the Linux Programmer's Guide, available from
          <http://www.tldp.org/guides.html>.
 
-config IPC_NS
-       bool "IPC Namespaces"
-       depends on SYSVIPC
-       default n
-       help
-         Support ipc namespaces.  This allows containers, i.e. virtual
-         environments, to use ipc namespaces to provide different ipc
-         objects for different servers.  If unsure, say N.
-
 config SYSVIPC_SYSCTL
        bool
        depends on SYSVIPC
@@ -218,13 +209,14 @@ config TASK_IO_ACCOUNTING
 
          Say N if unsure.
 
-config UTS_NS
-       bool "UTS Namespaces"
+config USER_NS
+       bool "User Namespaces (EXPERIMENTAL)"
        default n
+       depends on EXPERIMENTAL
        help
-         Support uts namespaces.  This allows containers, i.e.
-         vservers, to use uts namespaces to provide different
-         uts info for different servers.  If unsure, say N.
+         Support user namespaces.  This allows containers, i.e.
+         vservers, to use user namespaces to provide different
+         user info for different servers.  If unsure, say N.
 
 config AUDIT
        bool "Auditing support"
@@ -576,7 +568,7 @@ config SLUB
           and has enhanced diagnostics.
 
 config SLOB
-       depends on EMBEDDED && !SPARSEMEM
+       depends on EMBEDDED
        bool "SLOB (Simple Allocator)"
        help
           SLOB replaces the SLAB allocator with a drastically simpler
@@ -602,9 +594,7 @@ config BASE_SMALL
        default 0 if BASE_FULL
        default 1 if !BASE_FULL
 
-menu "Loadable module support"
-
-config MODULES
+menuconfig MODULES
        bool "Enable loadable module support"
        help
          Kernel modules are small pieces of compiled code which can
@@ -684,6 +674,5 @@ config STOP_MACHINE
        depends on (SMP && MODULE_UNLOAD) || HOTPLUG_CPU
        help
          Need stop_machine() primitive.
-endmenu
 
 source "block/Kconfig"
index 46fe407fb03eb6be6236378be2daa79a61cd5aa1..4efa1e5385e3a1b110b29b46ceccedf36a8c4138 100644 (file)
@@ -25,6 +25,7 @@ int __initdata rd_doload;     /* 1 = load RAM disk, 0 = don't load */
 int root_mountflags = MS_RDONLY | MS_SILENT;
 char * __initdata root_device_name;
 static char __initdata saved_root_name[64];
+static int __initdata root_wait;
 
 dev_t ROOT_DEV;
 
@@ -216,6 +217,16 @@ static int __init root_dev_setup(char *line)
 
 __setup("root=", root_dev_setup);
 
+static int __init rootwait_setup(char *str)
+{
+       if (*str)
+               return 0;
+       root_wait = 1;
+       return 1;
+}
+
+__setup("rootwait", rootwait_setup);
+
 static char * __initdata root_mount_data;
 static int __init root_data_setup(char *str)
 {
@@ -438,11 +449,20 @@ void __init prepare_namespace(void)
                        root_device_name += 5;
        }
 
-       is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
-
        if (initrd_load())
                goto out;
 
+       /* wait for any asynchronous scanning to complete */
+       if ((ROOT_DEV == 0) && root_wait) {
+               printk(KERN_INFO "Waiting for root device %s...\n",
+                       saved_root_name);
+               while (driver_probe_done() != 0 ||
+                       (ROOT_DEV = name_to_dev_t(saved_root_name)) == 0)
+                       msleep(100);
+       }
+
+       is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
+
        if (is_floppy && rd_doload && rd_load_disk(0))
                ROOT_DEV = Root_RAM0;
 
index 0eb1c7463fe4d08c3012ee66cb486c72122a26d5..d3bcb3b11620784a37dd6d44561a874e9df1d982 100644 (file)
@@ -132,20 +132,9 @@ static char *static_command_line;
 static char *execute_command;
 static char *ramdisk_execute_command;
 
+#ifdef CONFIG_SMP
 /* Setup configured maximum number of CPUs to activate */
-static unsigned int max_cpus = NR_CPUS;
-
-/*
- * If set, this is an indication to the drivers that reset the underlying
- * device before going ahead with the initialization otherwise driver might
- * rely on the BIOS and skip the reset operation.
- *
- * This is useful if kernel is booting in an unreliable environment.
- * For ex. kdump situaiton where previous kernel has crashed, BIOS has been
- * skipped and devices will be in unknown state.
- */
-unsigned int reset_devices;
-EXPORT_SYMBOL(reset_devices);
+static unsigned int __initdata max_cpus = NR_CPUS;
 
 /*
  * Setup routine for controlling SMP activation
@@ -160,10 +149,10 @@ EXPORT_SYMBOL(reset_devices);
 static int __init nosmp(char *str)
 {
        max_cpus = 0;
-       return 1;
+       return 0;
 }
 
-__setup("nosmp", nosmp);
+early_param("nosmp", nosmp);
 
 static int __init maxcpus(char *str)
 {
@@ -172,6 +161,21 @@ static int __init maxcpus(char *str)
 }
 
 __setup("maxcpus=", maxcpus);
+#else
+#define max_cpus NR_CPUS
+#endif
+
+/*
+ * If set, this is an indication to the drivers that reset the underlying
+ * device before going ahead with the initialization otherwise driver might
+ * rely on the BIOS and skip the reset operation.
+ *
+ * This is useful if kernel is booting in an unreliable environment.
+ * For ex. kdump situaiton where previous kernel has crashed, BIOS has been
+ * skipped and devices will be in unknown state.
+ */
+unsigned int reset_devices;
+EXPORT_SYMBOL(reset_devices);
 
 static int __init set_reset_devices(char *str)
 {
@@ -385,6 +389,10 @@ static void __init smp_init(void)
 {
        unsigned int cpu;
 
+#ifndef CONFIG_HOTPLUG_CPU
+       cpu_possible_map = cpu_present_map;
+#endif
+
        /* FIXME: This should be done in userspace --RR */
        for_each_present_cpu(cpu) {
                if (num_online_cpus() >= max_cpus)
@@ -453,7 +461,10 @@ static int __init do_early_param(char *param, char *val)
        struct obs_kernel_param *p;
 
        for (p = __setup_start; p < __setup_end; p++) {
-               if (p->early && strcmp(param, p->str) == 0) {
+               if ((p->early && strcmp(param, p->str) == 0) ||
+                   (strcmp(param, "console") == 0 &&
+                    strcmp(p->str, "earlycon") == 0)
+               ) {
                        if (p->setup_func(val) != 0)
                                printk(KERN_WARNING
                                       "Malformed early option '%s'\n", param);
@@ -526,6 +537,10 @@ asmlinkage void __init start_kernel(void)
        setup_arch(&command_line);
        setup_command_line(command_line);
        unwind_setup();
+#ifndef CONFIG_HOTPLUG_CPU
+       if (max_cpus < 2)
+               cpu_possible_map = cpu_online_map;
+#endif
        setup_per_cpu_areas();
        smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */
 
@@ -725,6 +740,15 @@ static void __init do_basic_setup(void)
        do_initcalls();
 }
 
+static int __initdata nosoftlockup;
+
+static int __init nosoftlockup_setup(char *str)
+{
+       nosoftlockup = 1;
+       return 1;
+}
+__setup("nosoftlockup", nosoftlockup_setup);
+
 static void __init do_pre_smp_initcalls(void)
 {
        extern int spawn_ksoftirqd(void);
@@ -734,7 +758,8 @@ static void __init do_pre_smp_initcalls(void)
        migration_init();
 #endif
        spawn_ksoftirqd();
-       spawn_softlockup_task();
+       if (!nosoftlockup)
+               spawn_softlockup_task();
 }
 
 static void run_init_process(char *init_filename)
index a388824740e7e9c1e770dde9d3082609c0e8f017..cbd27e519943b140a2f291cecbf3e0e89820172a 100644 (file)
--- a/ipc/msg.c
+++ b/ipc/msg.c
@@ -87,7 +87,7 @@ static int newque (struct ipc_namespace *ns, key_t key, int msgflg);
 static int sysvipc_msg_proc_show(struct seq_file *s, void *it);
 #endif
 
-static void __ipc_init __msg_init_ns(struct ipc_namespace *ns, struct ipc_ids *ids)
+static void __msg_init_ns(struct ipc_namespace *ns, struct ipc_ids *ids)
 {
        ns->ids[IPC_MSG_IDS] = ids;
        ns->msg_ctlmax = MSGMAX;
@@ -96,7 +96,6 @@ static void __ipc_init __msg_init_ns(struct ipc_namespace *ns, struct ipc_ids *i
        ipc_init_ids(ids, ns->msg_ctlmni);
 }
 
-#ifdef CONFIG_IPC_NS
 int msg_init_ns(struct ipc_namespace *ns)
 {
        struct ipc_ids *ids;
@@ -128,7 +127,6 @@ void msg_exit_ns(struct ipc_namespace *ns)
        kfree(ns->ids[IPC_MSG_IDS]);
        ns->ids[IPC_MSG_IDS] = NULL;
 }
-#endif
 
 void __init msg_init(void)
 {
index 9964b2224c707d48c6aec6ef658bd3506e12467a..89bfdffb38d8f590818b28ae6844d0b40fb1095f 100644 (file)
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -121,7 +121,7 @@ static int sysvipc_sem_proc_show(struct seq_file *s, void *it);
 #define sc_semopm      sem_ctls[2]
 #define sc_semmni      sem_ctls[3]
 
-static void __ipc_init __sem_init_ns(struct ipc_namespace *ns, struct ipc_ids *ids)
+static void __sem_init_ns(struct ipc_namespace *ns, struct ipc_ids *ids)
 {
        ns->ids[IPC_SEM_IDS] = ids;
        ns->sc_semmsl = SEMMSL;
@@ -132,7 +132,6 @@ static void __ipc_init __sem_init_ns(struct ipc_namespace *ns, struct ipc_ids *i
        ipc_init_ids(ids, ns->sc_semmni);
 }
 
-#ifdef CONFIG_IPC_NS
 int sem_init_ns(struct ipc_namespace *ns)
 {
        struct ipc_ids *ids;
@@ -164,7 +163,6 @@ void sem_exit_ns(struct ipc_namespace *ns)
        kfree(ns->ids[IPC_SEM_IDS]);
        ns->ids[IPC_SEM_IDS] = NULL;
 }
-#endif
 
 void __init sem_init (void)
 {
index 0852f206d8951cb4f53071b36e159ae0332e5093..242c3f66493a1c1cdf578a1b5fd9eb7777ade965 100644 (file)
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -77,7 +77,7 @@ static void shm_destroy (struct ipc_namespace *ns, struct shmid_kernel *shp);
 static int sysvipc_shm_proc_show(struct seq_file *s, void *it);
 #endif
 
-static void __ipc_init __shm_init_ns(struct ipc_namespace *ns, struct ipc_ids *ids)
+static void __shm_init_ns(struct ipc_namespace *ns, struct ipc_ids *ids)
 {
        ns->ids[IPC_SHM_IDS] = ids;
        ns->shm_ctlmax = SHMMAX;
@@ -98,7 +98,6 @@ static void do_shm_rmid(struct ipc_namespace *ns, struct shmid_kernel *shp)
                shm_destroy(ns, shp);
 }
 
-#ifdef CONFIG_IPC_NS
 int shm_init_ns(struct ipc_namespace *ns)
 {
        struct ipc_ids *ids;
@@ -130,7 +129,6 @@ void shm_exit_ns(struct ipc_namespace *ns)
        kfree(ns->ids[IPC_SHM_IDS]);
        ns->ids[IPC_SHM_IDS] = NULL;
 }
-#endif
 
 void __init shm_init (void)
 {
index 7536a7292d4821ae7b64b4f79f6f32f6657c40da..44e5135aee4785e2da26de92e0d3b52b02246842 100644 (file)
@@ -50,7 +50,6 @@ struct ipc_namespace init_ipc_ns = {
        },
 };
 
-#ifdef CONFIG_IPC_NS
 static struct ipc_namespace *clone_ipc_ns(struct ipc_namespace *old_ns)
 {
        int err;
@@ -110,14 +109,6 @@ void free_ipc_ns(struct kref *kref)
        shm_exit_ns(ns);
        kfree(ns);
 }
-#else
-struct ipc_namespace *copy_ipcs(unsigned long flags, struct ipc_namespace *ns)
-{
-       if (flags & CLONE_NEWIPC)
-               return ERR_PTR(-EINVAL);
-       return ns;
-}
-#endif
 
 /**
  *     ipc_init        -       initialise IPC subsystem
@@ -145,7 +136,7 @@ __initcall(ipc_init);
  *     array itself. 
  */
  
-void __ipc_init ipc_init_ids(struct ipc_ids* ids, int size)
+void ipc_init_ids(struct ipc_ids* ids, int size)
 {
        int i;
 
index e3aa2c5c97dc1f996add0ba9e2827c8cca8d7b28..333e891bcaca838cf71bfb27d5d9c6296a6102bd 100644 (file)
@@ -41,12 +41,8 @@ struct ipc_ids {
 };
 
 struct seq_file;
-#ifdef CONFIG_IPC_NS
-#define __ipc_init
-#else
-#define __ipc_init     __init
-#endif
-void __ipc_init ipc_init_ids(struct ipc_ids *ids, int size);
+
+void ipc_init_ids(struct ipc_ids *ids, int size);
 #ifdef CONFIG_PROC_FS
 void __init ipc_init_proc_interface(const char *path, const char *header,
                int ids, int (*show)(struct seq_file *, void *));
index 642d4277c2ea4c13dcc0269dcaeaa224cff8f5ab..2a999836ca18092e172280d346a63c4a6763d776 100644 (file)
@@ -4,11 +4,12 @@
 
 obj-y     = sched.o fork.o exec_domain.o panic.o printk.o profile.o \
            exit.o itimer.o time.o softirq.o resource.o \
-           sysctl.o capability.o ptrace.o timer.o user.o \
+           sysctl.o capability.o ptrace.o timer.o user.o user_namespace.o \
            signal.o sys.o kmod.o workqueue.o pid.o \
            rcupdate.o extable.o params.o posix-timers.o \
            kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o mutex.o \
-           hrtimer.o rwsem.o latency.o nsproxy.o srcu.o die_notifier.o
+           hrtimer.o rwsem.o latency.o nsproxy.o srcu.o die_notifier.o \
+           utsname.o
 
 obj-$(CONFIG_STACKTRACE) += stacktrace.o
 obj-y += time/
@@ -48,7 +49,6 @@ obj-$(CONFIG_SECCOMP) += seccomp.o
 obj-$(CONFIG_RCU_TORTURE_TEST) += rcutorture.o
 obj-$(CONFIG_RELAY) += relay.o
 obj-$(CONFIG_SYSCTL) += utsname_sysctl.o
-obj-$(CONFIG_UTS_NS) += utsname.o
 obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o
 obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o
 
index d13276d41410c28a21bdc3e69cf7104b02e28bc4..5ce8851facf7d61a6a45b0254866f388d8af5e55 100644 (file)
@@ -58,6 +58,7 @@
 #include <linux/selinux.h>
 #include <linux/inotify.h>
 #include <linux/freezer.h>
+#include <linux/tty.h>
 
 #include "audit.h"
 
@@ -423,6 +424,31 @@ static int kauditd_thread(void *dummy)
        return 0;
 }
 
+static int audit_prepare_user_tty(pid_t pid, uid_t loginuid)
+{
+       struct task_struct *tsk;
+       int err;
+
+       read_lock(&tasklist_lock);
+       tsk = find_task_by_pid(pid);
+       err = -ESRCH;
+       if (!tsk)
+               goto out;
+       err = 0;
+
+       spin_lock_irq(&tsk->sighand->siglock);
+       if (!tsk->signal->audit_tty)
+               err = -EPERM;
+       spin_unlock_irq(&tsk->sighand->siglock);
+       if (err)
+               goto out;
+
+       tty_audit_push_task(tsk, loginuid);
+out:
+       read_unlock(&tasklist_lock);
+       return err;
+}
+
 int audit_send_list(void *_dest)
 {
        struct audit_netlink_list *dest = _dest;
@@ -511,6 +537,8 @@ static int audit_netlink_ok(struct sk_buff *skb, u16 msg_type)
        case AUDIT_DEL:
        case AUDIT_DEL_RULE:
        case AUDIT_SIGNAL_INFO:
+       case AUDIT_TTY_GET:
+       case AUDIT_TTY_SET:
                if (security_netlink_recv(skb, CAP_AUDIT_CONTROL))
                        err = -EPERM;
                break;
@@ -622,6 +650,11 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
                err = audit_filter_user(&NETLINK_CB(skb), msg_type);
                if (err == 1) {
                        err = 0;
+                       if (msg_type == AUDIT_USER_TTY) {
+                               err = audit_prepare_user_tty(pid, loginuid);
+                               if (err)
+                                       break;
+                       }
                        ab = audit_log_start(NULL, GFP_KERNEL, msg_type);
                        if (ab) {
                                audit_log_format(ab,
@@ -638,8 +671,17 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
                                                        " subj=%s", ctx);
                                        kfree(ctx);
                                }
-                               audit_log_format(ab, " msg='%.1024s'",
-                                        (char *)data);
+                               if (msg_type != AUDIT_USER_TTY)
+                                       audit_log_format(ab, " msg='%.1024s'",
+                                                        (char *)data);
+                               else {
+                                       int size;
+
+                                       audit_log_format(ab, " msg=");
+                                       size = nlmsg_len(nlh);
+                                       audit_log_n_untrustedstring(ab, size,
+                                                                   data);
+                               }
                                audit_set_pid(ab, pid);
                                audit_log_end(ab);
                        }
@@ -730,6 +772,45 @@ static int audit_receive_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
                                0, 0, sig_data, sizeof(*sig_data) + len);
                kfree(sig_data);
                break;
+       case AUDIT_TTY_GET: {
+               struct audit_tty_status s;
+               struct task_struct *tsk;
+
+               read_lock(&tasklist_lock);
+               tsk = find_task_by_pid(pid);
+               if (!tsk)
+                       err = -ESRCH;
+               else {
+                       spin_lock_irq(&tsk->sighand->siglock);
+                       s.enabled = tsk->signal->audit_tty != 0;
+                       spin_unlock_irq(&tsk->sighand->siglock);
+               }
+               read_unlock(&tasklist_lock);
+               audit_send_reply(NETLINK_CB(skb).pid, seq, AUDIT_TTY_GET, 0, 0,
+                                &s, sizeof(s));
+               break;
+       }
+       case AUDIT_TTY_SET: {
+               struct audit_tty_status *s;
+               struct task_struct *tsk;
+
+               if (nlh->nlmsg_len < sizeof(struct audit_tty_status))
+                       return -EINVAL;
+               s = data;
+               if (s->enabled != 0 && s->enabled != 1)
+                       return -EINVAL;
+               read_lock(&tasklist_lock);
+               tsk = find_task_by_pid(pid);
+               if (!tsk)
+                       err = -ESRCH;
+               else {
+                       spin_lock_irq(&tsk->sighand->siglock);
+                       tsk->signal->audit_tty = s->enabled != 0;
+                       spin_unlock_irq(&tsk->sighand->siglock);
+               }
+               read_unlock(&tasklist_lock);
+               break;
+       }
        default:
                err = -EINVAL;
                break;
@@ -1185,7 +1266,7 @@ static void audit_log_n_string(struct audit_buffer *ab, size_t slen,
 }
 
 /**
- * audit_log_n_unstrustedstring - log a string that may contain random characters
+ * audit_log_n_untrustedstring - log a string that may contain random characters
  * @ab: audit_buffer
  * @len: lenth of string (not including trailing null)
  * @string: string to be logged
@@ -1201,25 +1282,24 @@ static void audit_log_n_string(struct audit_buffer *ab, size_t slen,
 const char *audit_log_n_untrustedstring(struct audit_buffer *ab, size_t len,
                                        const char *string)
 {
-       const unsigned char *p = string;
+       const unsigned char *p;
 
-       while (*p) {
+       for (p = string; p < (const unsigned char *)string + len && *p; p++) {
                if (*p == '"' || *p < 0x21 || *p > 0x7f) {
                        audit_log_hex(ab, string, len);
                        return string + len + 1;
                }
-               p++;
        }
        audit_log_n_string(ab, len, string);
        return p + 1;
 }
 
 /**
- * audit_log_unstrustedstring - log a string that may contain random characters
+ * audit_log_untrustedstring - log a string that may contain random characters
  * @ab: audit_buffer
  * @string: string to be logged
  *
- * Same as audit_log_n_unstrustedstring(), except that strlen is used to
+ * Same as audit_log_n_untrustedstring(), except that strlen is used to
  * determine string length.
  */
 const char *audit_log_untrustedstring(struct audit_buffer *ab, const char *string)
index 815d6f5c04ee041e0c33b52b84480152ec1ab548..95877435c347c06a58caeca23de249cdc24a1301 100644 (file)
@@ -115,7 +115,6 @@ extern struct sk_buff *         audit_make_reply(int pid, int seq, int type,
 extern void                audit_send_reply(int pid, int seq, int type,
                                             int done, int multi,
                                             void *payload, int size);
-extern void                audit_log_lost(const char *message);
 extern void                audit_panic(const char *message);
 
 struct audit_netlink_list {
index e36481ed61b4d0b138fa43e7662c0b65cfb021a5..b7640a5f382aa6e766fc09785242466ef693fbb6 100644 (file)
@@ -71,9 +71,6 @@
 
 extern struct list_head audit_filter_list[];
 
-/* No syscall auditing will take place unless audit_enabled != 0. */
-extern int audit_enabled;
-
 /* AUDIT_NAMES is the number of slots we reserve in the audit_context
  * for saving names from getname(). */
 #define AUDIT_NAMES    20
@@ -2040,7 +2037,7 @@ int __audit_signal_info(int sig, struct task_struct *t)
 
 /**
  * audit_core_dumps - record information about processes that end abnormally
- * @sig: signal value
+ * @signr: signal value
  *
  * If a process ends with a core dump, something fishy is going on and we
  * should record the event for investigation.
index 4c49188cc49b67d6f172c5d7d12743109c1f9e3e..824b1c01f4107667abb7d0e4e8923678a15966c4 100644 (file)
@@ -981,10 +981,10 @@ static int update_nodemask(struct cpuset *cs, char *buf)
                mmarray = kmalloc(ntasks * sizeof(*mmarray), GFP_KERNEL);
                if (!mmarray)
                        goto done;
-               write_lock_irq(&tasklist_lock);         /* block fork */
+               read_lock(&tasklist_lock);              /* block fork */
                if (atomic_read(&cs->count) <= ntasks)
                        break;                          /* got enough */
-               write_unlock_irq(&tasklist_lock);       /* try again */
+               read_unlock(&tasklist_lock);            /* try again */
                kfree(mmarray);
        }
 
@@ -1006,7 +1006,7 @@ static int update_nodemask(struct cpuset *cs, char *buf)
                        continue;
                mmarray[n++] = mm;
        } while_each_thread(g, p);
-       write_unlock_irq(&tasklist_lock);
+       read_unlock(&tasklist_lock);
 
        /*
         * Now that we've dropped the tasklist spinlock, we can
index ca6a11b730231bd0d6d9ece041e1a2f537223582..57626692cd90202a08ad86b032f432bf543f7a21 100644 (file)
@@ -858,6 +858,34 @@ static void exit_notify(struct task_struct *tsk)
                release_task(tsk);
 }
 
+#ifdef CONFIG_DEBUG_STACK_USAGE
+static void check_stack_usage(void)
+{
+       static DEFINE_SPINLOCK(low_water_lock);
+       static int lowest_to_date = THREAD_SIZE;
+       unsigned long *n = end_of_stack(current);
+       unsigned long free;
+
+       while (*n == 0)
+               n++;
+       free = (unsigned long)n - (unsigned long)end_of_stack(current);
+
+       if (free >= lowest_to_date)
+               return;
+
+       spin_lock(&low_water_lock);
+       if (free < lowest_to_date) {
+               printk(KERN_WARNING "%s used greatest stack depth: %lu bytes "
+                               "left\n",
+                               current->comm, free);
+               lowest_to_date = free;
+       }
+       spin_unlock(&low_water_lock);
+}
+#else
+static inline void check_stack_usage(void) {}
+#endif
+
 fastcall NORET_TYPE void do_exit(long code)
 {
        struct task_struct *tsk = current;
@@ -937,6 +965,8 @@ fastcall NORET_TYPE void do_exit(long code)
        if (unlikely(tsk->compat_robust_list))
                compat_exit_robust_list(tsk);
 #endif
+       if (group_dead)
+               tty_audit_exit();
        if (unlikely(tsk->audit_context))
                audit_free(tsk);
 
@@ -949,6 +979,7 @@ fastcall NORET_TYPE void do_exit(long code)
        exit_sem(tsk);
        __exit_files(tsk);
        __exit_fs(tsk);
+       check_stack_usage();
        exit_thread();
        cpuset_exit(tsk);
        exit_keys(tsk);
index da3a155bba0ddc5c50a8082833a90be6fe60e8ce..7c5c5888e00a99d8b33bf59c4fe5056ebc905f81 100644 (file)
@@ -49,6 +49,7 @@
 #include <linux/delayacct.h>
 #include <linux/taskstats_kern.h>
 #include <linux/random.h>
+#include <linux/tty.h>
 
 #include <asm/pgtable.h>
 #include <asm/pgalloc.h>
@@ -897,6 +898,8 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts
        }
        acct_init_pacct(&sig->pacct);
 
+       tty_audit_fork(sig);
+
        return 0;
 }
 
@@ -999,7 +1002,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,
        if (atomic_read(&p->user->processes) >=
                        p->signal->rlim[RLIMIT_NPROC].rlim_cur) {
                if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE) &&
-                               p->user != &root_user)
+                   p->user != current->nsproxy->user_ns->root_user)
                        goto bad_fork_free;
        }
 
@@ -1059,6 +1062,8 @@ static struct task_struct *copy_process(unsigned long clone_flags,
 
        p->lock_depth = -1;             /* -1 = no lock */
        do_posix_clock_monotonic_gettime(&p->start_time);
+       p->real_start_time = p->start_time;
+       monotonic_to_bootbased(&p->real_start_time);
        p->security = NULL;
        p->io_context = NULL;
        p->io_wait = NULL;
@@ -1601,7 +1606,7 @@ asmlinkage long sys_unshare(unsigned long unshare_flags)
        err = -EINVAL;
        if (unshare_flags & ~(CLONE_THREAD|CLONE_FS|CLONE_NEWNS|CLONE_SIGHAND|
                                CLONE_VM|CLONE_FILES|CLONE_SYSVSEM|
-                               CLONE_NEWUTS|CLONE_NEWIPC))
+                               CLONE_NEWUTS|CLONE_NEWIPC|CLONE_NEWUSER))
                goto bad_unshare_out;
 
        if ((err = unshare_thread(unshare_flags)))
index 45490bec5831d5a806c1703251f82dec3e599d63..5c3f45d07c534a7ecc07f50c427e8390809cf165 100644 (file)
@@ -120,6 +120,24 @@ static struct futex_hash_bucket futex_queues[1<<FUTEX_HASHBITS];
 /* Futex-fs vfsmount entry: */
 static struct vfsmount *futex_mnt;
 
+/*
+ * Take mm->mmap_sem, when futex is shared
+ */
+static inline void futex_lock_mm(struct rw_semaphore *fshared)
+{
+       if (fshared)
+               down_read(fshared);
+}
+
+/*
+ * Release mm->mmap_sem, when the futex is shared
+ */
+static inline void futex_unlock_mm(struct rw_semaphore *fshared)
+{
+       if (fshared)
+               up_read(fshared);
+}
+
 /*
  * We hash on the keys returned from get_futex_key (see below).
  */
@@ -287,7 +305,18 @@ void drop_futex_key_refs(union futex_key *key)
 }
 EXPORT_SYMBOL_GPL(drop_futex_key_refs);
 
-static inline int get_futex_value_locked(u32 *dest, u32 __user *from)
+static u32 cmpxchg_futex_value_locked(u32 __user *uaddr, u32 uval, u32 newval)
+{
+       u32 curval;
+
+       pagefault_disable();
+       curval = futex_atomic_cmpxchg_inatomic(uaddr, uval, newval);
+       pagefault_enable();
+
+       return curval;
+}
+
+static int get_futex_value_locked(u32 *dest, u32 __user *from)
 {
        int ret;
 
@@ -620,9 +649,7 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this)
 
                newval = FUTEX_WAITERS | new_owner->pid;
 
-               pagefault_disable();
-               curval = futex_atomic_cmpxchg_inatomic(uaddr, uval, newval);
-               pagefault_enable();
+               curval = cmpxchg_futex_value_locked(uaddr, uval, newval);
 
                if (curval == -EFAULT)
                        ret = -EFAULT;
@@ -659,9 +686,7 @@ static int unlock_futex_pi(u32 __user *uaddr, u32 uval)
         * There is no waiter, so we unlock the futex. The owner died
         * bit has not to be preserved here. We are the owner:
         */
-       pagefault_disable();
-       oldval = futex_atomic_cmpxchg_inatomic(uaddr, uval, 0);
-       pagefault_enable();
+       oldval = cmpxchg_futex_value_locked(uaddr, uval, 0);
 
        if (oldval == -EFAULT)
                return oldval;
@@ -700,8 +725,7 @@ static int futex_wake(u32 __user *uaddr, struct rw_semaphore *fshared,
        union futex_key key;
        int ret;
 
-       if (fshared)
-               down_read(fshared);
+       futex_lock_mm(fshared);
 
        ret = get_futex_key(uaddr, fshared, &key);
        if (unlikely(ret != 0))
@@ -725,8 +749,7 @@ static int futex_wake(u32 __user *uaddr, struct rw_semaphore *fshared,
 
        spin_unlock(&hb->lock);
 out:
-       if (fshared)
-               up_read(fshared);
+       futex_unlock_mm(fshared);
        return ret;
 }
 
@@ -746,8 +769,7 @@ futex_wake_op(u32 __user *uaddr1, struct rw_semaphore *fshared,
        int ret, op_ret, attempt = 0;
 
 retryfull:
-       if (fshared)
-               down_read(fshared);
+       futex_lock_mm(fshared);
 
        ret = get_futex_key(uaddr1, fshared, &key1);
        if (unlikely(ret != 0))
@@ -793,7 +815,7 @@ retry:
                 */
                if (attempt++) {
                        ret = futex_handle_fault((unsigned long)uaddr2,
-                                               fshared, attempt);
+                                                fshared, attempt);
                        if (ret)
                                goto out;
                        goto retry;
@@ -803,8 +825,7 @@ retry:
                 * If we would have faulted, release mmap_sem,
                 * fault it in and start all over again.
                 */
-               if (fshared)
-                       up_read(fshared);
+               futex_unlock_mm(fshared);
 
                ret = get_user(dummy, uaddr2);
                if (ret)
@@ -841,8 +862,8 @@ retry:
        if (hb1 != hb2)
                spin_unlock(&hb2->lock);
 out:
-       if (fshared)
-               up_read(fshared);
+       futex_unlock_mm(fshared);
+
        return ret;
 }
 
@@ -861,8 +882,7 @@ static int futex_requeue(u32 __user *uaddr1, struct rw_semaphore *fshared,
        int ret, drop_count = 0;
 
  retry:
-       if (fshared)
-               down_read(fshared);
+       futex_lock_mm(fshared);
 
        ret = get_futex_key(uaddr1, fshared, &key1);
        if (unlikely(ret != 0))
@@ -890,8 +910,7 @@ static int futex_requeue(u32 __user *uaddr1, struct rw_semaphore *fshared,
                         * If we would have faulted, release mmap_sem, fault
                         * it in and start all over again.
                         */
-                       if (fshared)
-                               up_read(fshared);
+                       futex_unlock_mm(fshared);
 
                        ret = get_user(curval, uaddr1);
 
@@ -944,8 +963,7 @@ out_unlock:
                drop_futex_key_refs(&key1);
 
 out:
-       if (fshared)
-               up_read(fshared);
+       futex_unlock_mm(fshared);
        return ret;
 }
 
@@ -1113,10 +1131,7 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,
        while (!ret) {
                newval = (uval & FUTEX_OWNER_DIED) | newtid;
 
-               pagefault_disable();
-               curval = futex_atomic_cmpxchg_inatomic(uaddr,
-                                                      uval, newval);
-               pagefault_enable();
+               curval = cmpxchg_futex_value_locked(uaddr, uval, newval);
 
                if (curval == -EFAULT)
                        ret = -EFAULT;
@@ -1134,6 +1149,7 @@ static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,
 #define ARG3_SHARED  1
 
 static long futex_wait_restart(struct restart_block *restart);
+
 static int futex_wait(u32 __user *uaddr, struct rw_semaphore *fshared,
                      u32 val, ktime_t *abs_time)
 {
@@ -1148,8 +1164,7 @@ static int futex_wait(u32 __user *uaddr, struct rw_semaphore *fshared,
 
        q.pi_state = NULL;
  retry:
-       if (fshared)
-               down_read(fshared);
+       futex_lock_mm(fshared);
 
        ret = get_futex_key(uaddr, fshared, &q.key);
        if (unlikely(ret != 0))
@@ -1186,8 +1201,7 @@ static int futex_wait(u32 __user *uaddr, struct rw_semaphore *fshared,
                 * If we would have faulted, release mmap_sem, fault it in and
                 * start all over again.
                 */
-               if (fshared)
-                       up_read(fshared);
+               futex_unlock_mm(fshared);
 
                ret = get_user(uval, uaddr);
 
@@ -1206,8 +1220,7 @@ static int futex_wait(u32 __user *uaddr, struct rw_semaphore *fshared,
         * Now the futex is queued and we have checked the data, we
         * don't want to hold mmap_sem while we sleep.
         */
-       if (fshared)
-               up_read(fshared);
+       futex_unlock_mm(fshared);
 
        /*
         * There might have been scheduling since the queue_me(), as we
@@ -1285,8 +1298,7 @@ static int futex_wait(u32 __user *uaddr, struct rw_semaphore *fshared,
        queue_unlock(&q, hb);
 
  out_release_sem:
-       if (fshared)
-               up_read(fshared);
+       futex_unlock_mm(fshared);
        return ret;
 }
 
@@ -1333,8 +1345,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared,
 
        q.pi_state = NULL;
  retry:
-       if (fshared)
-               down_read(fshared);
+       futex_lock_mm(fshared);
 
        ret = get_futex_key(uaddr, fshared, &q.key);
        if (unlikely(ret != 0))
@@ -1353,9 +1364,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared,
         */
        newval = current->pid;
 
-       pagefault_disable();
-       curval = futex_atomic_cmpxchg_inatomic(uaddr, 0, newval);
-       pagefault_enable();
+       curval = cmpxchg_futex_value_locked(uaddr, 0, newval);
 
        if (unlikely(curval == -EFAULT))
                goto uaddr_faulted;
@@ -1398,9 +1407,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared,
                lock_taken = 1;
        }
 
-       pagefault_disable();
-       curval = futex_atomic_cmpxchg_inatomic(uaddr, uval, newval);
-       pagefault_enable();
+       curval = cmpxchg_futex_value_locked(uaddr, uval, newval);
 
        if (unlikely(curval == -EFAULT))
                goto uaddr_faulted;
@@ -1428,8 +1435,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared,
                         * exit to complete.
                         */
                        queue_unlock(&q, hb);
-                       if (fshared)
-                               up_read(fshared);
+                       futex_unlock_mm(fshared);
                        cond_resched();
                        goto retry;
 
@@ -1465,8 +1471,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared,
         * Now the futex is queued and we have checked the data, we
         * don't want to hold mmap_sem while we sleep.
         */
-       if (fshared)
-               up_read(fshared);
+       futex_unlock_mm(fshared);
 
        WARN_ON(!q.pi_state);
        /*
@@ -1480,8 +1485,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared,
                ret = ret ? 0 : -EWOULDBLOCK;
        }
 
-       if (fshared)
-               down_read(fshared);
+       futex_lock_mm(fshared);
        spin_lock(q.lock_ptr);
 
        if (!ret) {
@@ -1518,8 +1522,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared,
 
        /* Unqueue and drop the lock */
        unqueue_me_pi(&q);
-       if (fshared)
-               up_read(fshared);
+       futex_unlock_mm(fshared);
 
        return ret != -EINTR ? ret : -ERESTARTNOINTR;
 
@@ -1527,8 +1530,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared,
        queue_unlock(&q, hb);
 
  out_release_sem:
-       if (fshared)
-               up_read(fshared);
+       futex_unlock_mm(fshared);
        return ret;
 
  uaddr_faulted:
@@ -1550,8 +1552,7 @@ static int futex_lock_pi(u32 __user *uaddr, struct rw_semaphore *fshared,
                goto retry_unlocked;
        }
 
-       if (fshared)
-               up_read(fshared);
+       futex_unlock_mm(fshared);
 
        ret = get_user(uval, uaddr);
        if (!ret && (uval != -EFAULT))
@@ -1585,8 +1586,7 @@ retry:
        /*
         * First take all the futex related locks:
         */
-       if (fshared)
-               down_read(fshared);
+       futex_lock_mm(fshared);
 
        ret = get_futex_key(uaddr, fshared, &key);
        if (unlikely(ret != 0))
@@ -1601,11 +1601,9 @@ retry_unlocked:
         * again. If it succeeds then we can return without waking
         * anyone else up:
         */
-       if (!(uval & FUTEX_OWNER_DIED)) {
-               pagefault_disable();
-               uval = futex_atomic_cmpxchg_inatomic(uaddr, current->pid, 0);
-               pagefault_enable();
-       }
+       if (!(uval & FUTEX_OWNER_DIED))
+               uval = cmpxchg_futex_value_locked(uaddr, current->pid, 0);
+
 
        if (unlikely(uval == -EFAULT))
                goto pi_faulted;
@@ -1647,8 +1645,7 @@ retry_unlocked:
 out_unlock:
        spin_unlock(&hb->lock);
 out:
-       if (fshared)
-               up_read(fshared);
+       futex_unlock_mm(fshared);
 
        return ret;
 
@@ -1671,8 +1668,7 @@ pi_faulted:
                goto retry_unlocked;
        }
 
-       if (fshared)
-               up_read(fshared);
+       futex_unlock_mm(fshared);
 
        ret = get_user(uval, uaddr);
        if (!ret && (uval != -EFAULT))
@@ -1729,8 +1725,8 @@ static int futex_fd(u32 __user *uaddr, int signal)
 
        if (printk_timed_ratelimit(&printk_interval, 60 * 60 * 1000)) {
                printk(KERN_WARNING "Process `%s' used FUTEX_FD, which "
-                       "will be removed from the kernel in June 2007\n",
-                       current->comm);
+                      "will be removed from the kernel in June 2007\n",
+                      current->comm);
        }
 
        ret = -EINVAL;
@@ -1908,10 +1904,8 @@ retry:
                 * Wake robust non-PI futexes here. The wakeup of
                 * PI futexes happens in exit_pi_state():
                 */
-               if (!pi) {
-                       if (uval & FUTEX_WAITERS)
+               if (!pi && (uval & FUTEX_WAITERS))
                                futex_wake(uaddr, &curr->mm->mmap_sem, 1);
-               }
        }
        return 0;
 }
index bd9e272d55e9f007984b06e0999f6a37bb7208e1..32b161972fad2cda220f3f4698e9fb565017b6a1 100644 (file)
@@ -172,7 +172,17 @@ void note_interrupt(unsigned int irq, struct irq_desc *desc,
                    irqreturn_t action_ret)
 {
        if (unlikely(action_ret != IRQ_HANDLED)) {
-               desc->irqs_unhandled++;
+               /*
+                * If we are seeing only the odd spurious IRQ caused by
+                * bus asynchronicity then don't eventually trigger an error,
+                * otherwise the couter becomes a doomsday timer for otherwise
+                * working systems
+                */
+               if (jiffies - desc->last_unhandled > HZ/10)
+                       desc->irqs_unhandled = 1;
+               else
+                       desc->irqs_unhandled++;
+               desc->last_unhandled = jiffies;
                if (unlikely(action_ret != IRQ_NONE))
                        report_bad_irq(irq, desc, action_ret);
        }
index fed54418626c10727662a79d0e505ee302e0bcbf..0d662475dd9f59cb8393f23e9d5c9521de1cef9e 100644 (file)
@@ -317,13 +317,12 @@ int sprint_symbol(char *buffer, unsigned long address)
        name = kallsyms_lookup(address, &size, &offset, &modname, namebuf);
        if (!name)
                return sprintf(buffer, "0x%lx", address);
-       else {
-               if (modname)
-                       return sprintf(buffer, "%s+%#lx/%#lx [%s]", name, offset,
+
+       if (modname)
+               return sprintf(buffer, "%s+%#lx/%#lx [%s]", name, offset,
                                size, modname);
-               else
-                       return sprintf(buffer, "%s+%#lx/%#lx", name, offset, size);
-       }
+       else
+               return sprintf(buffer, "%s+%#lx/%#lx", name, offset, size);
 }
 
 /* Look up a kernel symbol and print it to the kernel messages. */
index cee419143fd47bb410b0cf80e7762a0f02ffbfce..bc41ad0f24f881845d96d77a00a3d3535968566b 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/slab.h>
 #include <linux/err.h>
 #include <linux/kfifo.h>
+#include <linux/log2.h>
 
 /**
  * kfifo_init - allocates a new FIFO using a preallocated buffer
@@ -41,7 +42,7 @@ struct kfifo *kfifo_init(unsigned char *buffer, unsigned int size,
        struct kfifo *fifo;
 
        /* size must be a power of 2 */
-       BUG_ON(size & (size - 1));
+       BUG_ON(!is_power_of_2(size));
 
        fifo = kmalloc(sizeof(struct kfifo), gfp_mask);
        if (!fifo)
index bbd51b81a3e86e239584925dfaf637dce187a831..a404f7ee73959a154fddca8b59c5bb79db1773be 100644 (file)
@@ -215,7 +215,7 @@ int kthread_stop(struct task_struct *k)
 EXPORT_SYMBOL(kthread_stop);
 
 
-static __init void kthreadd_setup(void)
+static noinline __init_refok void kthreadd_setup(void)
 {
        struct task_struct *tsk = current;
 
index 015d60cfd90e4f67f07380fac6c05d44aec81580..539fed9ac83ca994a172b10a38e0351f96ba7e8b 100644 (file)
@@ -61,10 +61,8 @@ extern int module_sysfs_initialized;
 /* If this is set, the section belongs in the init part of the module */
 #define INIT_OFFSET_MASK (1UL << (BITS_PER_LONG-1))
 
-/* Protects module list */
-static DEFINE_SPINLOCK(modlist_lock);
-
-/* List of modules, protected by module_mutex AND modlist_lock */
+/* List of modules, protected by module_mutex or preempt_disable
+ * (add/delete uses stop_machine). */
 static DEFINE_MUTEX(module_mutex);
 static LIST_HEAD(modules);
 
@@ -760,14 +758,13 @@ static void print_unload_info(struct seq_file *m, struct module *mod)
 void __symbol_put(const char *symbol)
 {
        struct module *owner;
-       unsigned long flags;
        const unsigned long *crc;
 
-       spin_lock_irqsave(&modlist_lock, flags);
+       preempt_disable();
        if (!__find_symbol(symbol, &owner, &crc, 1))
                BUG();
        module_put(owner);
-       spin_unlock_irqrestore(&modlist_lock, flags);
+       preempt_enable();
 }
 EXPORT_SYMBOL(__symbol_put);
 
@@ -1228,14 +1225,14 @@ static void free_module(struct module *mod)
 void *__symbol_get(const char *symbol)
 {
        struct module *owner;
-       unsigned long value, flags;
+       unsigned long value;
        const unsigned long *crc;
 
-       spin_lock_irqsave(&modlist_lock, flags);
+       preempt_disable();
        value = __find_symbol(symbol, &owner, &crc, 1);
        if (value && !strong_try_module_get(owner))
                value = 0;
-       spin_unlock_irqrestore(&modlist_lock, flags);
+       preempt_enable();
 
        return (void *)value;
 }
@@ -2232,26 +2229,13 @@ unsigned long module_kallsyms_lookup_name(const char *name)
 /* Called by the /proc file system to return a list of modules. */
 static void *m_start(struct seq_file *m, loff_t *pos)
 {
-       struct list_head *i;
-       loff_t n = 0;
-
        mutex_lock(&module_mutex);
-       list_for_each(i, &modules) {
-               if (n++ == *pos)
-                       break;
-       }
-       if (i == &modules)
-               return NULL;
-       return i;
+       return seq_list_start(&modules, *pos);
 }
 
 static void *m_next(struct seq_file *m, void *p, loff_t *pos)
 {
-       struct list_head *i = p;
-       (*pos)++;
-       if (i->next == &modules)
-               return NULL;
-       return i->next;
+       return seq_list_next(p, &modules, pos);
 }
 
 static void m_stop(struct seq_file *m, void *p)
@@ -2321,11 +2305,10 @@ const struct seq_operations modules_op = {
 /* Given an address, look for it in the module exception tables. */
 const struct exception_table_entry *search_module_extables(unsigned long addr)
 {
-       unsigned long flags;
        const struct exception_table_entry *e = NULL;
        struct module *mod;
 
-       spin_lock_irqsave(&modlist_lock, flags);
+       preempt_disable();
        list_for_each_entry(mod, &modules, list) {
                if (mod->num_exentries == 0)
                        continue;
@@ -2336,7 +2319,7 @@ const struct exception_table_entry *search_module_extables(unsigned long addr)
                if (e)
                        break;
        }
-       spin_unlock_irqrestore(&modlist_lock, flags);
+       preempt_enable();
 
        /* Now, if we found one, we are running inside it now, hence
            we cannot unload the module, hence no refcnt needed. */
@@ -2348,25 +2331,24 @@ const struct exception_table_entry *search_module_extables(unsigned long addr)
  */
 int is_module_address(unsigned long addr)
 {
-       unsigned long flags;
        struct module *mod;
 
-       spin_lock_irqsave(&modlist_lock, flags);
+       preempt_disable();
 
        list_for_each_entry(mod, &modules, list) {
                if (within(addr, mod->module_core, mod->core_size)) {
-                       spin_unlock_irqrestore(&modlist_lock, flags);
+                       preempt_enable();
                        return 1;
                }
        }
 
-       spin_unlock_irqrestore(&modlist_lock, flags);
+       preempt_enable();
 
        return 0;
 }
 
 
-/* Is this a valid kernel address?  We don't grab the lock: we are oopsing. */
+/* Is this a valid kernel address? */
 struct module *__module_text_address(unsigned long addr)
 {
        struct module *mod;
@@ -2381,11 +2363,10 @@ struct module *__module_text_address(unsigned long addr)
 struct module *module_text_address(unsigned long addr)
 {
        struct module *mod;
-       unsigned long flags;
 
-       spin_lock_irqsave(&modlist_lock, flags);
+       preempt_disable();
        mod = __module_text_address(addr);
-       spin_unlock_irqrestore(&modlist_lock, flags);
+       preempt_enable();
 
        return mod;
 }
index 9e83b589f75471e69b782bcca0e8f8e1caaedad5..10f0bbba382bed8c37d498cd55cf5871eb9b8bd4 100644 (file)
@@ -21,6 +21,8 @@
 #include <linux/utsname.h>
 #include <linux/pid_namespace.h>
 
+static struct kmem_cache *nsproxy_cachep;
+
 struct nsproxy init_nsproxy = INIT_NSPROXY(init_nsproxy);
 
 static inline void get_nsproxy(struct nsproxy *ns)
@@ -43,9 +45,11 @@ static inline struct nsproxy *clone_nsproxy(struct nsproxy *orig)
 {
        struct nsproxy *ns;
 
-       ns = kmemdup(orig, sizeof(struct nsproxy), GFP_KERNEL);
-       if (ns)
+       ns = kmem_cache_alloc(nsproxy_cachep, GFP_KERNEL);
+       if (ns) {
+               memcpy(ns, orig, sizeof(struct nsproxy));
                atomic_set(&ns->count, 1);
+       }
        return ns;
 }
 
@@ -54,33 +58,51 @@ static inline struct nsproxy *clone_nsproxy(struct nsproxy *orig)
  * Return the newly created nsproxy.  Do not attach this to the task,
  * leave it to the caller to do proper locking and attach it to task.
  */
-static struct nsproxy *create_new_namespaces(int flags, struct task_struct *tsk,
-                       struct fs_struct *new_fs)
+static struct nsproxy *create_new_namespaces(unsigned long flags,
+                       struct task_struct *tsk, struct fs_struct *new_fs)
 {
        struct nsproxy *new_nsp;
+       int err;
 
        new_nsp = clone_nsproxy(tsk->nsproxy);
        if (!new_nsp)
                return ERR_PTR(-ENOMEM);
 
        new_nsp->mnt_ns = copy_mnt_ns(flags, tsk->nsproxy->mnt_ns, new_fs);
-       if (IS_ERR(new_nsp->mnt_ns))
+       if (IS_ERR(new_nsp->mnt_ns)) {
+               err = PTR_ERR(new_nsp->mnt_ns);
                goto out_ns;
+       }
 
        new_nsp->uts_ns = copy_utsname(flags, tsk->nsproxy->uts_ns);
-       if (IS_ERR(new_nsp->uts_ns))
+       if (IS_ERR(new_nsp->uts_ns)) {
+               err = PTR_ERR(new_nsp->uts_ns);
                goto out_uts;
+       }
 
        new_nsp->ipc_ns = copy_ipcs(flags, tsk->nsproxy->ipc_ns);
-       if (IS_ERR(new_nsp->ipc_ns))
+       if (IS_ERR(new_nsp->ipc_ns)) {
+               err = PTR_ERR(new_nsp->ipc_ns);
                goto out_ipc;
+       }
 
        new_nsp->pid_ns = copy_pid_ns(flags, tsk->nsproxy->pid_ns);
-       if (IS_ERR(new_nsp->pid_ns))
+       if (IS_ERR(new_nsp->pid_ns)) {
+               err = PTR_ERR(new_nsp->pid_ns);
                goto out_pid;
+       }
+
+       new_nsp->user_ns = copy_user_ns(flags, tsk->nsproxy->user_ns);
+       if (IS_ERR(new_nsp->user_ns)) {
+               err = PTR_ERR(new_nsp->user_ns);
+               goto out_user;
+       }
 
        return new_nsp;
 
+out_user:
+       if (new_nsp->pid_ns)
+               put_pid_ns(new_nsp->pid_ns);
 out_pid:
        if (new_nsp->ipc_ns)
                put_ipc_ns(new_nsp->ipc_ns);
@@ -91,15 +113,15 @@ out_uts:
        if (new_nsp->mnt_ns)
                put_mnt_ns(new_nsp->mnt_ns);
 out_ns:
-       kfree(new_nsp);
-       return ERR_PTR(-ENOMEM);
+       kmem_cache_free(nsproxy_cachep, new_nsp);
+       return ERR_PTR(err);
 }
 
 /*
  * called from clone.  This now handles copy for nsproxy and all
  * namespaces therein.
  */
-int copy_namespaces(int flags, struct task_struct *tsk)
+int copy_namespaces(unsigned long flags, struct task_struct *tsk)
 {
        struct nsproxy *old_ns = tsk->nsproxy;
        struct nsproxy *new_ns;
@@ -110,7 +132,7 @@ int copy_namespaces(int flags, struct task_struct *tsk)
 
        get_nsproxy(old_ns);
 
-       if (!(flags & (CLONE_NEWNS | CLONE_NEWUTS | CLONE_NEWIPC)))
+       if (!(flags & (CLONE_NEWNS | CLONE_NEWUTS | CLONE_NEWIPC | CLONE_NEWUSER)))
                return 0;
 
        if (!capable(CAP_SYS_ADMIN)) {
@@ -140,7 +162,9 @@ void free_nsproxy(struct nsproxy *ns)
                put_ipc_ns(ns->ipc_ns);
        if (ns->pid_ns)
                put_pid_ns(ns->pid_ns);
-       kfree(ns);
+       if (ns->user_ns)
+               put_user_ns(ns->user_ns);
+       kmem_cache_free(nsproxy_cachep, ns);
 }
 
 /*
@@ -152,19 +176,10 @@ int unshare_nsproxy_namespaces(unsigned long unshare_flags,
 {
        int err = 0;
 
-       if (!(unshare_flags & (CLONE_NEWNS | CLONE_NEWUTS | CLONE_NEWIPC)))
+       if (!(unshare_flags & (CLONE_NEWNS | CLONE_NEWUTS | CLONE_NEWIPC |
+                              CLONE_NEWUSER)))
                return 0;
 
-#ifndef CONFIG_IPC_NS
-       if (unshare_flags & CLONE_NEWIPC)
-               return -EINVAL;
-#endif
-
-#ifndef CONFIG_UTS_NS
-       if (unshare_flags & CLONE_NEWUTS)
-               return -EINVAL;
-#endif
-
        if (!capable(CAP_SYS_ADMIN))
                return -EPERM;
 
@@ -174,3 +189,12 @@ int unshare_nsproxy_namespaces(unsigned long unshare_flags,
                err = PTR_ERR(*new_nsp);
        return err;
 }
+
+static int __init nsproxy_cache_init(void)
+{
+       nsproxy_cachep = kmem_cache_create("nsproxy", sizeof(struct nsproxy),
+                                          0, SLAB_PANIC, NULL, NULL);
+       return 0;
+}
+
+module_init(nsproxy_cache_init);
index eb66bd2953ab95f614781b12da75b4613ec0f757..c6e3f9ffff87e62afa5aa93233833b8642144dd9 100644 (file)
@@ -365,7 +365,7 @@ struct pid *find_ge_pid(int nr)
 }
 EXPORT_SYMBOL_GPL(find_get_pid);
 
-struct pid_namespace *copy_pid_ns(int flags, struct pid_namespace *old_ns)
+struct pid_namespace *copy_pid_ns(unsigned long flags, struct pid_namespace *old_ns)
 {
        BUG_ON(!old_ns);
        get_pid_ns(old_ns);
index 0bbdeac2810cb53c4960cb303f4b396d29cbb341..051d27e36a6c997e95215b90bfd3f50bfa7c9c08 100644 (file)
@@ -449,13 +449,16 @@ static int printk_time = 1;
 #else
 static int printk_time = 0;
 #endif
-module_param(printk_time, int, S_IRUGO | S_IWUSR);
+module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR);
 
 static int __init printk_time_setup(char *str)
 {
        if (*str)
                return 0;
        printk_time = 1;
+       printk(KERN_NOTICE "The 'time' option is deprecated and "
+               "is scheduled for removal in early 2008\n");
+       printk(KERN_NOTICE "Use 'printk.time=<value>' instead\n");
        return 1;
 }
 
@@ -483,6 +486,9 @@ static int have_callable_console(void)
  * @fmt: format string
  *
  * This is printk().  It can be called from any context.  We want it to work.
+ * Be aware of the fact that if oops_in_progress is not set, we might try to
+ * wake klogd up which could deadlock on runqueue lock if printk() is called
+ * from scheduler code.
  *
  * We try to grab the console_sem.  If we succeed, it's easy - we log the output and
  * call the console drivers.  If we fail to get the semaphore we place the output
@@ -654,7 +660,7 @@ static void call_console_drivers(unsigned long start, unsigned long end)
  */
 static int __init console_setup(char *str)
 {
-       char name[sizeof(console_cmdline[0].name)];
+       char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for index */
        char *s, *options;
        int idx;
 
@@ -662,27 +668,27 @@ static int __init console_setup(char *str)
         * Decode str into name, index, options.
         */
        if (str[0] >= '0' && str[0] <= '9') {
-               strcpy(name, "ttyS");
-               strncpy(name + 4, str, sizeof(name) - 5);
+               strcpy(buf, "ttyS");
+               strncpy(buf + 4, str, sizeof(buf) - 5);
        } else {
-               strncpy(name, str, sizeof(name) - 1);
+               strncpy(buf, str, sizeof(buf) - 1);
        }
-       name[sizeof(name) - 1] = 0;
+       buf[sizeof(buf) - 1] = 0;
        if ((options = strchr(str, ',')) != NULL)
                *(options++) = 0;
 #ifdef __sparc__
        if (!strcmp(str, "ttya"))
-               strcpy(name, "ttyS0");
+               strcpy(buf, "ttyS0");
        if (!strcmp(str, "ttyb"))
-               strcpy(name, "ttyS1");
+               strcpy(buf, "ttyS1");
 #endif
-       for (s = name; *s; s++)
+       for (s = buf; *s; s++)
                if ((*s >= '0' && *s <= '9') || *s == ',')
                        break;
        idx = simple_strtoul(s, NULL, 10);
        *s = 0;
 
-       add_preferred_console(name, idx, options);
+       add_preferred_console(buf, idx, options);
        return 1;
 }
 __setup("console=", console_setup);
@@ -709,7 +715,7 @@ int __init add_preferred_console(char *name, int idx, char *options)
         *      See if this tty is not yet registered, and
         *      if we have a slot free.
         */
-       for(i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
+       for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
                if (strcmp(console_cmdline[i].name, name) == 0 &&
                          console_cmdline[i].index == idx) {
                                selected_console = i;
@@ -726,6 +732,25 @@ int __init add_preferred_console(char *name, int idx, char *options)
        return 0;
 }
 
+int __init update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options)
+{
+       struct console_cmdline *c;
+       int i;
+
+       for (i = 0; i < MAX_CMDLINECONSOLES && console_cmdline[i].name[0]; i++)
+               if (strcmp(console_cmdline[i].name, name) == 0 &&
+                         console_cmdline[i].index == idx) {
+                               c = &console_cmdline[i];
+                               memcpy(c->name, name_new, sizeof(c->name));
+                               c->name[sizeof(c->name) - 1] = 0;
+                               c->options = options;
+                               c->index = idx_new;
+                               return i;
+               }
+       /* not found */
+       return -1;
+}
+
 #ifndef CONFIG_DISABLE_CONSOLE_SUSPEND
 /**
  * suspend_console - suspend the console subsystem
@@ -942,6 +967,9 @@ void register_console(struct console *console)
        if (preferred_console < 0 || bootconsole || !console_drivers)
                preferred_console = selected_console;
 
+       if (console->early_setup)
+               console->early_setup();
+
        /*
         *      See if we want to use this console driver. If we
         *      didn't select a console we take the first one
@@ -985,12 +1013,15 @@ void register_console(struct console *console)
        if (!(console->flags & CON_ENABLED))
                return;
 
-       if (bootconsole) {
+       if (bootconsole && (console->flags & CON_CONSDEV)) {
                printk(KERN_INFO "console handover: boot [%s%d] -> real [%s%d]\n",
                       bootconsole->name, bootconsole->index,
                       console->name, console->index);
                unregister_console(bootconsole);
                console->flags &= ~CON_PRINTBUFFER;
+       } else {
+               printk(KERN_INFO "console [%s%d] enabled\n",
+                      console->name, console->index);
        }
 
        /*
index ad7949a589dd580900f4349f01888cf006d9328c..b1d11f1c7cf743a6d76f48fd1678d29314eb7b96 100644 (file)
@@ -161,6 +161,7 @@ int ptrace_may_attach(struct task_struct *task)
 int ptrace_attach(struct task_struct *task)
 {
        int retval;
+       unsigned long flags;
 
        audit_ptrace(task);
 
@@ -181,9 +182,7 @@ repeat:
         * cpu's that may have task_lock).
         */
        task_lock(task);
-       local_irq_disable();
-       if (!write_trylock(&tasklist_lock)) {
-               local_irq_enable();
+       if (!write_trylock_irqsave(&tasklist_lock, flags)) {
                task_unlock(task);
                do {
                        cpu_relax();
@@ -211,7 +210,7 @@ repeat:
        force_sig_specific(SIGSTOP, task);
 
 bad:
-       write_unlock_irq(&tasklist_lock);
+       write_unlock_irqrestore(&tasklist_lock, flags);
        task_unlock(task);
 out:
        return retval;
index da8d6bf46457226644d279069d8b56811a66e95b..5aedbee014dfca7f2ebdce84e62d1c1bac87fab2 100644 (file)
 
 #include "rtmutex_common.h"
 
-#ifdef CONFIG_DEBUG_RT_MUTEXES
-# include "rtmutex-debug.h"
-#else
-# include "rtmutex.h"
-#endif
-
 # define TRACE_WARN_ON(x)                      WARN_ON(x)
 # define TRACE_BUG_ON(x)                       BUG_ON(x)
 
index 17d28ce20300dec918be53d4aa136dabb590fc47..8cd9bd2cdb34243a89c45102708abdcc2c7cbdbd 100644 (file)
 
 #include "rtmutex_common.h"
 
-#ifdef CONFIG_DEBUG_RT_MUTEXES
-# include "rtmutex-debug.h"
-#else
-# include "rtmutex.h"
-#endif
-
 /*
  * lock->owner state tracking:
  *
index 9c75856e791ee91a0e34dbdc0079a8297c9574ff..2d3b83593ca3232a0414fc8f808e8435376a9d4c 100644 (file)
@@ -103,7 +103,7 @@ static inline struct task_struct *rt_mutex_owner(struct rt_mutex *lock)
 
 static inline struct task_struct *rt_mutex_real_owner(struct rt_mutex *lock)
 {
-       return (struct task_struct *)
+       return (struct task_struct *)
                ((unsigned long)lock->owner & ~RT_MUTEX_HAS_WAITERS);
 }
 
@@ -120,4 +120,11 @@ extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock,
                                       struct task_struct *proxy_owner);
 extern void rt_mutex_proxy_unlock(struct rt_mutex *lock,
                                  struct task_struct *proxy_owner);
+
+#ifdef CONFIG_DEBUG_RT_MUTEXES
+# include "rtmutex-debug.h"
+#else
+# include "rtmutex.h"
+#endif
+
 #endif
index c3391b6020e8550bba296280861b64fd32e28e4e..ad64fcb731f231d22e539d0e1b094cdd59c7d759 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/sched.h>
 
 /* #define SECCOMP_DEBUG 1 */
+#define NR_SECCOMP_MODES 1
 
 /*
  * Secure computing mode 1 allows only read/write/exit/sigreturn.
@@ -54,3 +55,31 @@ void __secure_computing(int this_syscall)
 #endif
        do_exit(SIGKILL);
 }
+
+long prctl_get_seccomp(void)
+{
+       return current->seccomp.mode;
+}
+
+long prctl_set_seccomp(unsigned long seccomp_mode)
+{
+       long ret;
+
+       /* can set it only once to be even more secure */
+       ret = -EPERM;
+       if (unlikely(current->seccomp.mode))
+               goto out;
+
+       ret = -EINVAL;
+       if (seccomp_mode && seccomp_mode <= NR_SECCOMP_MODES) {
+               current->seccomp.mode = seccomp_mode;
+               set_thread_flag(TIF_SECCOMP);
+#ifdef TIF_NOTSC
+               disable_TSC();
+#endif
+               ret = 0;
+       }
+
+ out:
+       return ret;
+}
index f9405609774eadc4115006e8f80f418413d84217..39d122753bac93eb7cfa62d0f2e2e451a4908dd5 100644 (file)
@@ -718,6 +718,37 @@ out_set:
 #define LEGACY_QUEUE(sigptr, sig) \
        (((sig) < SIGRTMIN) && sigismember(&(sigptr)->signal, (sig)))
 
+int print_fatal_signals;
+
+static void print_fatal_signal(struct pt_regs *regs, int signr)
+{
+       printk("%s/%d: potentially unexpected fatal signal %d.\n",
+               current->comm, current->pid, signr);
+
+#ifdef __i386__
+       printk("code at %08lx: ", regs->eip);
+       {
+               int i;
+               for (i = 0; i < 16; i++) {
+                       unsigned char insn;
+
+                       __get_user(insn, (unsigned char *)(regs->eip + i));
+                       printk("%02x ", insn);
+               }
+       }
+#endif
+       printk("\n");
+       show_regs(regs);
+}
+
+static int __init setup_print_fatal_signals(char *str)
+{
+       get_option (&str, &print_fatal_signals);
+
+       return 1;
+}
+
+__setup("print-fatal-signals=", setup_print_fatal_signals);
 
 static int
 specific_send_sig_info(int sig, struct siginfo *info, struct task_struct *t)
@@ -1855,6 +1886,8 @@ relock:
                 * Anything else is fatal, maybe with a core dump.
                 */
                current->flags |= PF_SIGNALED;
+               if ((signr != SIGKILL) && print_fatal_signals)
+                       print_fatal_signal(regs, signr);
                if (sig_kernel_coredump(signr)) {
                        /*
                         * If it was able to dump core, this kills all
index 73217a9e2875b27909cb4c9db09a6ec2d4284a7c..8de267790166fe1c062dabaae066c578829e6dba 100644 (file)
@@ -614,12 +614,16 @@ static int __cpuinit cpu_callback(struct notifier_block *nfb,
                kthread_bind(per_cpu(ksoftirqd, hotcpu),
                             any_online_cpu(cpu_online_map));
        case CPU_DEAD:
-       case CPU_DEAD_FROZEN:
+       case CPU_DEAD_FROZEN: {
+               struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
+
                p = per_cpu(ksoftirqd, hotcpu);
                per_cpu(ksoftirqd, hotcpu) = NULL;
+               sched_setscheduler(p, SCHED_FIFO, &param);
                kthread_stop(p);
                takeover_tasklets(hotcpu);
                break;
+       }
 #endif /* CONFIG_HOTPLUG_CPU */
        }
        return NOTIFY_OK;
index fcee2a8e6da37a79a02a09a4dfaca30887098292..319821ef78afc9e0a7488cbf9b2ea1c5853b65c1 100644 (file)
@@ -93,10 +93,6 @@ static void stopmachine_set_state(enum stopmachine_state state)
 static int stop_machine(void)
 {
        int i, ret = 0;
-       struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
-
-       /* One high-prio thread per cpu.  We'll do this one. */
-       sched_setscheduler(current, SCHED_FIFO, &param);
 
        atomic_set(&stopmachine_thread_ack, 0);
        stopmachine_num_threads = 0;
@@ -189,6 +185,10 @@ struct task_struct *__stop_machine_run(int (*fn)(void *), void *data,
 
        p = kthread_create(do_stop, &smdata, "kstopmachine");
        if (!IS_ERR(p)) {
+               struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
+
+               /* One high-prio thread per cpu.  We'll do this one. */
+               sched_setscheduler(p, SCHED_FIFO, &param);
                kthread_bind(p, cpu);
                wake_up_process(p);
                wait_for_completion(&smdata.done);
index 872271ccc3843989ad493ae4dc219b38bf30b15e..4d141ae3e8029d13deaaee39d3245e5c42766157 100644 (file)
 #include <linux/cn_proc.h>
 #include <linux/getcpu.h>
 #include <linux/task_io_accounting_ops.h>
+#include <linux/seccomp.h>
 
 #include <linux/compat.h>
 #include <linux/syscalls.h>
 #include <linux/kprobes.h>
+#include <linux/user_namespace.h>
 
 #include <asm/uaccess.h>
 #include <asm/io.h>
@@ -1078,13 +1080,13 @@ static int set_user(uid_t new_ruid, int dumpclear)
 {
        struct user_struct *new_user;
 
-       new_user = alloc_uid(new_ruid);
+       new_user = alloc_uid(current->nsproxy->user_ns, new_ruid);
        if (!new_user)
                return -EAGAIN;
 
        if (atomic_read(&new_user->processes) >=
                                current->signal->rlim[RLIMIT_NPROC].rlim_cur &&
-                       new_user != &root_user) {
+                       new_user != current->nsproxy->user_ns->root_user) {
                free_uid(new_user);
                return -EAGAIN;
        }
@@ -2241,6 +2243,13 @@ asmlinkage long sys_prctl(int option, unsigned long arg2, unsigned long arg3,
                        error = SET_ENDIAN(current, arg2);
                        break;
 
+               case PR_GET_SECCOMP:
+                       error = prctl_get_seccomp();
+                       break;
+               case PR_SET_SECCOMP:
+                       error = prctl_set_seccomp(arg2);
+                       break;
+
                default:
                        error = -EINVAL;
                        break;
index 7e11e2c98bf9f5902799216342924f2c715cde13..b0ec498a18d9d86eca840aced3f1580744ef8b71 100644 (file)
@@ -14,6 +14,7 @@ asmlinkage long sys_ni_syscall(void)
 
 cond_syscall(sys_nfsservctl);
 cond_syscall(sys_quotactl);
+cond_syscall(sys32_quotactl);
 cond_syscall(sys_acct);
 cond_syscall(sys_lookup_dcookie);
 cond_syscall(sys_swapon);
index d93e13d93f24c0c25d0bfc9cfe4944cd239fc10f..7dca326648d564f8974de1724505b0612557695c 100644 (file)
@@ -61,6 +61,7 @@ extern int proc_nr_files(ctl_table *table, int write, struct file *filp,
 
 /* External variables not in a header file. */
 extern int C_A_D;
+extern int print_fatal_signals;
 extern int sysctl_overcommit_memory;
 extern int sysctl_overcommit_ratio;
 extern int sysctl_panic_on_oom;
@@ -202,7 +203,10 @@ static ctl_table root_table[] = {
                .mode           = 0555,
                .child          = dev_table,
        },
-
+/*
+ * NOTE: do not add new entries to this table unless you have read
+ * Documentation/sysctl/ctl_unnumbered.txt
+ */
        { .ctl_name = 0 }
 };
 
@@ -340,6 +344,14 @@ static ctl_table kern_table[] = {
                .proc_handler   = &proc_dointvec,
        },
 #endif
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "print-fatal-signals",
+               .data           = &print_fatal_signals,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+       },
 #ifdef __sparc__
        {
                .ctl_name       = KERN_SPARC_REBOOT,
@@ -958,6 +970,17 @@ static ctl_table vm_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_doulongvec_minmax,
        },
+#ifdef CONFIG_NUMA
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "numa_zonelist_order",
+               .data           = &numa_zonelist_order,
+               .maxlen         = NUMA_ZONELIST_ORDER_LEN,
+               .mode           = 0644,
+               .proc_handler   = &numa_zonelist_order_handler,
+               .strategy       = &sysctl_string,
+       },
+#endif
 #endif
 #if defined(CONFIG_X86_32) || \
    (defined(CONFIG_SUPERH) && defined(CONFIG_VSYSCALL))
@@ -972,6 +995,14 @@ static ctl_table vm_table[] = {
                .extra1         = &zero,
        },
 #endif
+/*
+ * NOTE: do not add new entries to this table unless you have read
+ * Documentation/sysctl/ctl_unnumbered.txt
+ */
+/*
+ * NOTE: do not add new entries to this table unless you have read
+ * Documentation/sysctl/ctl_unnumbered.txt
+ */
        { .ctl_name = 0 }
 };
 
@@ -1112,6 +1143,14 @@ static ctl_table fs_table[] = {
                .child          = binfmt_misc_table,
        },
 #endif
+/*
+ * NOTE: do not add new entries to this table unless you have read
+ * Documentation/sysctl/ctl_unnumbered.txt
+ */
+/*
+ * NOTE: do not add new entries to this table unless you have read
+ * Documentation/sysctl/ctl_unnumbered.txt
+ */
        { .ctl_name = 0 }
 };
 
index 906cae771585f8fe0241375066393a25b7a40cea..059431ed67db4bd10b90bf126b32ff59fd4057f9 100644 (file)
@@ -196,6 +196,8 @@ static int fill_pid(pid_t pid, struct task_struct *tsk,
 
        /* fill in basic acct fields */
        stats->version = TASKSTATS_VERSION;
+       stats->nvcsw = tsk->nvcsw;
+       stats->nivcsw = tsk->nivcsw;
        bacct_add_tsk(stats, tsk);
 
        /* fill in extended acct fields */
@@ -242,6 +244,8 @@ static int fill_tgid(pid_t tgid, struct task_struct *first,
                 */
                delayacct_add_tsk(stats, tsk);
 
+               stats->nvcsw += tsk->nvcsw;
+               stats->nivcsw += tsk->nivcsw;
        } while_each_thread(first, tsk);
 
        unlock_task_sighand(first, &flags);
index f04791f694081d16dab799ae16f5b3f405683e4d..ffe19149d77006cb6c22db392b0a828962c655d3 100644 (file)
@@ -57,14 +57,17 @@ EXPORT_SYMBOL(sys_tz);
  */
 asmlinkage long sys_time(time_t __user * tloc)
 {
-       time_t i;
-       struct timeval tv;
+       /*
+        * We read xtime.tv_sec atomically - it's updated
+        * atomically by update_wall_time(), so no need to
+        * even read-lock the xtime seqlock:
+        */
+       time_t i = xtime.tv_sec;
 
-       do_gettimeofday(&tv);
-       i = tv.tv_sec;
+       smp_rmb(); /* sys_time() results are coherent */
 
        if (tloc) {
-               if (put_user(i,tloc))
+               if (put_user(i, tloc))
                        i = -EFAULT;
        }
        return i;
@@ -373,12 +376,25 @@ void do_gettimeofday (struct timeval *tv)
 
        tv->tv_sec = sec;
        tv->tv_usec = usec;
-}
 
+       /*
+        * Make sure xtime.tv_sec [returned by sys_time()] always
+        * follows the gettimeofday() result precisely. This
+        * condition is extremely unlikely, it can hit at most
+        * once per second:
+        */
+       if (unlikely(xtime.tv_sec != tv->tv_sec)) {
+               unsigned long flags;
+
+               write_seqlock_irqsave(&xtime_lock, flags);
+               update_wall_time();
+               write_sequnlock_irqrestore(&xtime_lock, flags);
+       }
+}
 EXPORT_SYMBOL(do_gettimeofday);
 
+#else  /* CONFIG_TIME_INTERPOLATION */
 
-#else
 #ifndef CONFIG_GENERIC_TIME
 /*
  * Simulate gettimeofday using do_gettimeofday which only allows a timeval
@@ -394,7 +410,7 @@ void getnstimeofday(struct timespec *tv)
 }
 EXPORT_SYMBOL_GPL(getnstimeofday);
 #endif
-#endif
+#endif /* CONFIG_TIME_INTERPOLATION */
 
 /* Converts Gregorian date to seconds since 1970-01-01 00:00:00.
  * Assumes input in normal date format, i.e. 1980-12-31 23:59:59
index 76212b2a99def6776596665a0b3326ef44ee0a00..2ad1c37b8dfece3954796d0a6e84d92a1d5c9716 100644 (file)
@@ -204,47 +204,6 @@ void clockevents_exchange_device(struct clock_event_device *old,
        local_irq_restore(flags);
 }
 
-/**
- * clockevents_request_device
- */
-struct clock_event_device *clockevents_request_device(unsigned int features,
-                                                     cpumask_t cpumask)
-{
-       struct clock_event_device *cur, *dev = NULL;
-       struct list_head *tmp;
-
-       spin_lock(&clockevents_lock);
-
-       list_for_each(tmp, &clockevent_devices) {
-               cur = list_entry(tmp, struct clock_event_device, list);
-
-               if ((cur->features & features) == features &&
-                   cpus_equal(cpumask, cur->cpumask)) {
-                       if (!dev || dev->rating < cur->rating)
-                               dev = cur;
-               }
-       }
-
-       clockevents_exchange_device(NULL, dev);
-
-       spin_unlock(&clockevents_lock);
-
-       return dev;
-}
-
-/**
- * clockevents_release_device
- */
-void clockevents_release_device(struct clock_event_device *dev)
-{
-       spin_lock(&clockevents_lock);
-
-       clockevents_exchange_device(dev, NULL);
-       clockevents_notify_released();
-
-       spin_unlock(&clockevents_lock);
-}
-
 /**
  * clockevents_notify - notification about relevant events
  */
index cf53bb5814cb88b087fd1dcbfc064223b537d46a..438c6b723ee202bd3a22607f2ebf7d4b031d1f6b 100644 (file)
@@ -13,7 +13,7 @@
 #include <linux/timex.h>
 #include <linux/jiffies.h>
 #include <linux/hrtimer.h>
-
+#include <linux/capability.h>
 #include <asm/div64.h>
 #include <asm/timex.h>
 
index 3d1042f82a687d77b3a5496862e40ef0742bf1de..728cedfd3cbd9b3a141821a0d4bb3b7d8c775ade 100644 (file)
@@ -36,9 +36,17 @@ EXPORT_SYMBOL(xtime_lock);
  * at zero at system boot time, so wall_to_monotonic will be negative,
  * however, we will ALWAYS keep the tv_nsec part positive so we can use
  * the usual normalization.
+ *
+ * wall_to_monotonic is moved after resume from suspend for the monotonic
+ * time not to jump. We need to add total_sleep_time to wall_to_monotonic
+ * to get the real boot based time offset.
+ *
+ * - wall_to_monotonic is no longer the boot time, getboottime must be
+ * used instead.
  */
 struct timespec xtime __attribute__ ((aligned (16)));
 struct timespec wall_to_monotonic __attribute__ ((aligned (16)));
+static unsigned long total_sleep_time;         /* seconds */
 
 EXPORT_SYMBOL(xtime);
 
@@ -251,6 +259,7 @@ void __init timekeeping_init(void)
        xtime.tv_nsec = 0;
        set_normalized_timespec(&wall_to_monotonic,
                -xtime.tv_sec, -xtime.tv_nsec);
+       total_sleep_time = 0;
 
        write_sequnlock_irqrestore(&xtime_lock, flags);
 }
@@ -282,6 +291,7 @@ static int timekeeping_resume(struct sys_device *dev)
 
                xtime.tv_sec += sleep_length;
                wall_to_monotonic.tv_sec -= sleep_length;
+               total_sleep_time += sleep_length;
        }
        /* re-base the last cycle value */
        clock->cycle_last = clocksource_read(clock);
@@ -476,3 +486,30 @@ void update_wall_time(void)
        change_clocksource();
        update_vsyscall(&xtime, clock);
 }
+
+/**
+ * getboottime - Return the real time of system boot.
+ * @ts:                pointer to the timespec to be set
+ *
+ * Returns the time of day in a timespec.
+ *
+ * This is based on the wall_to_monotonic offset and the total suspend
+ * time. Calls to settimeofday will affect the value returned (which
+ * basically means that however wrong your real time clock is at boot time,
+ * you get the right time here).
+ */
+void getboottime(struct timespec *ts)
+{
+       set_normalized_timespec(ts,
+               - (wall_to_monotonic.tv_sec + total_sleep_time),
+               - wall_to_monotonic.tv_nsec);
+}
+
+/**
+ * monotonic_to_bootbased - Convert the monotonic time to boot based.
+ * @ts:                pointer to the timespec to be converted
+ */
+void monotonic_to_bootbased(struct timespec *ts)
+{
+       ts->tv_sec += total_sleep_time;
+}
index 321693724ad743a74d81c2b3add00f3d4ee21237..9b8a826236ddc4e4c3642f959d5186b52fa51269 100644 (file)
@@ -68,6 +68,7 @@ struct entry {
         * Number of timeout events:
         */
        unsigned long           count;
+       unsigned int            timer_flag;
 
        /*
         * We save the command-line string to preserve
@@ -231,7 +232,8 @@ static struct entry *tstat_lookup(struct entry *entry, char *comm)
  * incremented. Otherwise the timer is registered in a free slot.
  */
 void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
-                             void *timerf, char * comm)
+                             void *timerf, char *comm,
+                             unsigned int timer_flag)
 {
        /*
         * It doesnt matter which lock we take:
@@ -249,6 +251,7 @@ void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
        input.start_func = startf;
        input.expire_func = timerf;
        input.pid = pid;
+       input.timer_flag = timer_flag;
 
        spin_lock_irqsave(lock, flags);
        if (!active)
@@ -295,7 +298,7 @@ static int tstats_show(struct seq_file *m, void *v)
        period = ktime_to_timespec(time);
        ms = period.tv_nsec / 1000000;
 
-       seq_puts(m, "Timer Stats Version: v0.1\n");
+       seq_puts(m, "Timer Stats Version: v0.2\n");
        seq_printf(m, "Sample period: %ld.%03ld s\n", period.tv_sec, ms);
        if (atomic_read(&overflow_count))
                seq_printf(m, "Overflow: %d entries\n",
@@ -303,8 +306,13 @@ static int tstats_show(struct seq_file *m, void *v)
 
        for (i = 0; i < nr_entries; i++) {
                entry = entries + i;
-               seq_printf(m, "%4lu, %5d %-16s ",
+               if (entry->timer_flag & TIMER_STATS_FLAG_DEFERRABLE) {
+                       seq_printf(m, "%4luD, %5d %-16s ",
                                entry->count, entry->pid, entry->comm);
+               } else {
+                       seq_printf(m, " %4lu, %5d %-16s ",
+                               entry->count, entry->pid, entry->comm);
+               }
 
                print_name_offset(m, (unsigned long)entry->start_func);
                seq_puts(m, " (");
index 1a69705c2fb95536dc67c82479fcff315c0e0e1e..1258371e0d2be3323ed7cb661c16a93355d30a2f 100644 (file)
@@ -305,6 +305,20 @@ void __timer_stats_timer_set_start_info(struct timer_list *timer, void *addr)
        memcpy(timer->start_comm, current->comm, TASK_COMM_LEN);
        timer->start_pid = current->pid;
 }
+
+static void timer_stats_account_timer(struct timer_list *timer)
+{
+       unsigned int flag = 0;
+
+       if (unlikely(tbase_get_deferrable(timer->base)))
+               flag |= TIMER_STATS_FLAG_DEFERRABLE;
+
+       timer_stats_update_stats(timer, timer->start_pid, timer->start_site,
+                                timer->function, timer->start_comm, flag);
+}
+
+#else
+static void timer_stats_account_timer(struct timer_list *timer) {}
 #endif
 
 /**
@@ -1114,6 +1128,7 @@ int do_sysinfo(struct sysinfo *info)
                getnstimeofday(&tp);
                tp.tv_sec += wall_to_monotonic.tv_sec;
                tp.tv_nsec += wall_to_monotonic.tv_nsec;
+               monotonic_to_bootbased(&tp);
                if (tp.tv_nsec - NSEC_PER_SEC >= 0) {
                        tp.tv_nsec = tp.tv_nsec - NSEC_PER_SEC;
                        tp.tv_sec++;
index 4869563080e9e080954d26f34b70bbffc13de18b..98b82507797a9f26fd0a2d4ee3d9d22d92928c08 100644 (file)
 #include <linux/bitops.h>
 #include <linux/key.h>
 #include <linux/interrupt.h>
+#include <linux/module.h>
+#include <linux/user_namespace.h>
 
 /*
  * UID task count cache, to get fast user lookup in "alloc_uid"
  * when changing user ID's (ie setuid() and friends).
  */
 
-#define UIDHASH_BITS (CONFIG_BASE_SMALL ? 3 : 8)
-#define UIDHASH_SZ             (1 << UIDHASH_BITS)
 #define UIDHASH_MASK           (UIDHASH_SZ - 1)
 #define __uidhashfn(uid)       (((uid >> UIDHASH_BITS) + uid) & UIDHASH_MASK)
-#define uidhashentry(uid)      (uidhash_table + __uidhashfn((uid)))
+#define uidhashentry(ns, uid)  ((ns)->uidhash_table + __uidhashfn((uid)))
 
 static struct kmem_cache *uid_cachep;
-static struct list_head uidhash_table[UIDHASH_SZ];
 
 /*
  * The uidhash_lock is mostly taken from process context, but it is
@@ -94,9 +93,10 @@ struct user_struct *find_user(uid_t uid)
 {
        struct user_struct *ret;
        unsigned long flags;
+       struct user_namespace *ns = current->nsproxy->user_ns;
 
        spin_lock_irqsave(&uidhash_lock, flags);
-       ret = uid_hash_find(uid, uidhashentry(uid));
+       ret = uid_hash_find(uid, uidhashentry(ns, uid));
        spin_unlock_irqrestore(&uidhash_lock, flags);
        return ret;
 }
@@ -120,9 +120,9 @@ void free_uid(struct user_struct *up)
        }
 }
 
-struct user_struct * alloc_uid(uid_t uid)
+struct user_struct * alloc_uid(struct user_namespace *ns, uid_t uid)
 {
-       struct list_head *hashent = uidhashentry(uid);
+       struct list_head *hashent = uidhashentry(ns, uid);
        struct user_struct *up;
 
        spin_lock_irq(&uidhash_lock);
@@ -211,11 +211,11 @@ static int __init uid_cache_init(void)
                        0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);
 
        for(n = 0; n < UIDHASH_SZ; ++n)
-               INIT_LIST_HEAD(uidhash_table + n);
+               INIT_LIST_HEAD(init_user_ns.uidhash_table + n);
 
        /* Insert the root user immediately (init already runs as root) */
        spin_lock_irq(&uidhash_lock);
-       uid_hash_insert(&root_user, uidhashentry(0));
+       uid_hash_insert(&root_user, uidhashentry(&init_user_ns, 0));
        spin_unlock_irq(&uidhash_lock);
 
        return 0;
diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c
new file mode 100644 (file)
index 0000000..d055d98
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ *  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 of the
+ *  License.
+ */
+
+#include <linux/module.h>
+#include <linux/version.h>
+#include <linux/nsproxy.h>
+#include <linux/user_namespace.h>
+
+struct user_namespace init_user_ns = {
+       .kref = {
+               .refcount       = ATOMIC_INIT(2),
+       },
+       .root_user = &root_user,
+};
+
+EXPORT_SYMBOL_GPL(init_user_ns);
+
+#ifdef CONFIG_USER_NS
+
+/*
+ * Clone a new ns copying an original user ns, setting refcount to 1
+ * @old_ns: namespace to clone
+ * Return NULL on error (failure to kmalloc), new ns otherwise
+ */
+static struct user_namespace *clone_user_ns(struct user_namespace *old_ns)
+{
+       struct user_namespace *ns;
+       struct user_struct *new_user;
+       int n;
+
+       ns = kmalloc(sizeof(struct user_namespace), GFP_KERNEL);
+       if (!ns)
+               return ERR_PTR(-ENOMEM);
+
+       kref_init(&ns->kref);
+
+       for (n = 0; n < UIDHASH_SZ; ++n)
+               INIT_LIST_HEAD(ns->uidhash_table + n);
+
+       /* Insert new root user.  */
+       ns->root_user = alloc_uid(ns, 0);
+       if (!ns->root_user) {
+               kfree(ns);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       /* Reset current->user with a new one */
+       new_user = alloc_uid(ns, current->uid);
+       if (!new_user) {
+               free_uid(ns->root_user);
+               kfree(ns);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       switch_uid(new_user);
+       return ns;
+}
+
+struct user_namespace * copy_user_ns(int flags, struct user_namespace *old_ns)
+{
+       struct user_namespace *new_ns;
+
+       BUG_ON(!old_ns);
+       get_user_ns(old_ns);
+
+       if (!(flags & CLONE_NEWUSER))
+               return old_ns;
+
+       new_ns = clone_user_ns(old_ns);
+
+       put_user_ns(old_ns);
+       return new_ns;
+}
+
+void free_user_ns(struct kref *kref)
+{
+       struct user_namespace *ns;
+
+       ns = container_of(kref, struct user_namespace, kref);
+       kfree(ns);
+}
+
+#endif /* CONFIG_USER_NS */
index 160c8c5136bd6a6607ccfae5cfc2e285fe5791c6..9d8180a0f0d815dbe051dbb6a710385d22f0b342 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/uts.h>
 #include <linux/utsname.h>
 #include <linux/version.h>
+#include <linux/err.h>
 
 /*
  * Clone a new ns copying an original utsname, setting refcount to 1
@@ -24,10 +25,11 @@ static struct uts_namespace *clone_uts_ns(struct uts_namespace *old_ns)
        struct uts_namespace *ns;
 
        ns = kmalloc(sizeof(struct uts_namespace), GFP_KERNEL);
-       if (ns) {
-               memcpy(&ns->name, &old_ns->name, sizeof(ns->name));
-               kref_init(&ns->kref);
-       }
+       if (!ns)
+               return ERR_PTR(-ENOMEM);
+
+       memcpy(&ns->name, &old_ns->name, sizeof(ns->name));
+       kref_init(&ns->kref);
        return ns;
 }
 
@@ -37,7 +39,7 @@ static struct uts_namespace *clone_uts_ns(struct uts_namespace *old_ns)
  * utsname of this process won't be seen by parent, and vice
  * versa.
  */
-struct uts_namespace *copy_utsname(int flags, struct uts_namespace *old_ns)
+struct uts_namespace *copy_utsname(unsigned long flags, struct uts_namespace *old_ns)
 {
        struct uts_namespace *new_ns;
 
index f22b9dbd2a9c734163d65f60b1ef67c1b5259858..c76c06466bfd07fe11fab8a592075ac0a38b807b 100644 (file)
 static void *get_uts(ctl_table *table, int write)
 {
        char *which = table->data;
-#ifdef CONFIG_UTS_NS
-       struct uts_namespace *uts_ns = current->nsproxy->uts_ns;
-       which = (which - (char *)&init_uts_ns) + (char *)uts_ns;
-#endif
+
        if (!write)
                down_read(&uts_sem);
        else
index 3bebf73be976592cab56a218e93b7449a5de7df4..d7d3fa3072e5941c7fc5d5757963b011823b93d5 100644 (file)
@@ -382,16 +382,16 @@ void fastcall flush_workqueue(struct workqueue_struct *wq)
 EXPORT_SYMBOL_GPL(flush_workqueue);
 
 /*
- * Upon a successful return, the caller "owns" WORK_STRUCT_PENDING bit,
+ * Upon a successful return (>= 0), the caller "owns" WORK_STRUCT_PENDING bit,
  * so this work can't be re-armed in any way.
  */
 static int try_to_grab_pending(struct work_struct *work)
 {
        struct cpu_workqueue_struct *cwq;
-       int ret = 0;
+       int ret = -1;
 
        if (!test_and_set_bit(WORK_STRUCT_PENDING, work_data_bits(work)))
-               return 1;
+               return 0;
 
        /*
         * The queueing is in progress, or it is already queued. Try to
@@ -457,10 +457,28 @@ static void wait_on_work(struct work_struct *work)
                wait_on_cpu_work(per_cpu_ptr(wq->cpu_wq, cpu), work);
 }
 
+static int __cancel_work_timer(struct work_struct *work,
+                               struct timer_list* timer)
+{
+       int ret;
+
+       do {
+               ret = (timer && likely(del_timer(timer)));
+               if (!ret)
+                       ret = try_to_grab_pending(work);
+               wait_on_work(work);
+       } while (unlikely(ret < 0));
+
+       work_clear_pending(work);
+       return ret;
+}
+
 /**
  * cancel_work_sync - block until a work_struct's callback has terminated
  * @work: the work which is to be flushed
  *
+ * Returns true if @work was pending.
+ *
  * cancel_work_sync() will cancel the work if it is queued. If the work's
  * callback appears to be running, cancel_work_sync() will block until it
  * has completed.
@@ -476,31 +494,26 @@ static void wait_on_work(struct work_struct *work)
  * The caller must ensure that workqueue_struct on which this work was last
  * queued can't be destroyed before this function returns.
  */
-void cancel_work_sync(struct work_struct *work)
+int cancel_work_sync(struct work_struct *work)
 {
-       while (!try_to_grab_pending(work))
-               cpu_relax();
-       wait_on_work(work);
-       work_clear_pending(work);
+       return __cancel_work_timer(work, NULL);
 }
 EXPORT_SYMBOL_GPL(cancel_work_sync);
 
 /**
- * cancel_rearming_delayed_work - reliably kill off a delayed work.
+ * cancel_delayed_work_sync - reliably kill off a delayed work.
  * @dwork: the delayed work struct
  *
+ * Returns true if @dwork was pending.
+ *
  * It is possible to use this function if @dwork rearms itself via queue_work()
  * or queue_delayed_work(). See also the comment for cancel_work_sync().
  */
-void cancel_rearming_delayed_work(struct delayed_work *dwork)
+int cancel_delayed_work_sync(struct delayed_work *dwork)
 {
-       while (!del_timer(&dwork->timer) &&
-              !try_to_grab_pending(&dwork->work))
-               cpu_relax();
-       wait_on_work(&dwork->work);
-       work_clear_pending(&dwork->work);
+       return __cancel_work_timer(&dwork->work, &dwork->timer);
 }
-EXPORT_SYMBOL(cancel_rearming_delayed_work);
+EXPORT_SYMBOL(cancel_delayed_work_sync);
 
 static struct workqueue_struct *keventd_wq __read_mostly;
 
index fab32a2863710a328b5f41dc7498515fb7d55b5e..640844024ffd1cabbbd60f0ac637b35af8a6b412 100644 (file)
@@ -152,6 +152,19 @@ config DEBUG_SLAB_LEAK
        bool "Memory leak debugging"
        depends on DEBUG_SLAB
 
+config SLUB_DEBUG_ON
+       bool "SLUB debugging on by default"
+       depends on SLUB && SLUB_DEBUG
+       default n
+       help
+         Boot with debugging on by default. SLUB boots by default with
+         the runtime debug capabilities switched off. Enabling this is
+         equivalent to specifying the "slub_debug" parameter on boot.
+         There is no support for more fine grained debug control like
+         possible with slub_debug=xxx. SLUB debugging may be switched
+         off in a kernel built with CONFIG_SLUB_DEBUG_ON by specifying
+         "slub_debug=-".
+
 config DEBUG_PREEMPT
        bool "Debug preemptible kernel"
        depends on DEBUG_KERNEL && PREEMPT && TRACE_IRQFLAGS_SUPPORT
index d1b366bdf86ed6a0cc8809d562f90b1309103227..d7a93ff7f5a0c9ca4318b375ae817436e48f9591 100644 (file)
@@ -13,7 +13,7 @@ lib-$(CONFIG_SMP) += cpumask.o
 lib-y  += kobject.o kref.o kobject_uevent.o klist.o
 
 obj-y += div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \
-        bust_spinlocks.o hexdump.o
+        bust_spinlocks.o hexdump.o check_signature.o
 
 ifeq ($(CONFIG_DEBUG_KOBJECT),y)
 CFLAGS_kobject.o += -DDEBUG
index 014b582c5c4b6a058058778d6100012a92501459..530f38f55787ec8703375c7706ae49fc7f529f7b 100644 (file)
--- a/lib/bug.c
+++ b/lib/bug.c
@@ -38,6 +38,7 @@
 #include <linux/list.h>
 #include <linux/module.h>
 #include <linux/bug.h>
+#include <linux/sched.h>
 
 extern const struct bug_entry __start___bug_table[], __stop___bug_table[];
 
@@ -112,7 +113,7 @@ const struct bug_entry *find_bug(unsigned long bugaddr)
        return module_find_bug(bugaddr);
 }
 
-enum bug_trap_type report_bug(unsigned long bugaddr)
+enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs)
 {
        const struct bug_entry *bug;
        const char *file;
@@ -147,7 +148,7 @@ enum bug_trap_type report_bug(unsigned long bugaddr)
                               "[verbose debug info unavailable]\n",
                               (void *)bugaddr);
 
-               dump_stack();
+               show_regs(regs);
                return BUG_TRAP_TYPE_WARN;
        }
 
diff --git a/lib/check_signature.c b/lib/check_signature.c
new file mode 100644 (file)
index 0000000..fd6af19
--- /dev/null
@@ -0,0 +1,26 @@
+#include <linux/io.h>
+#include <linux/module.h>
+
+/**
+ *     check_signature         -       find BIOS signatures
+ *     @io_addr: mmio address to check
+ *     @signature:  signature block
+ *     @length: length of signature
+ *
+ *     Perform a signature comparison with the mmio address io_addr. This
+ *     address should have been obtained by ioremap.
+ *     Returns 1 on a match.
+ */
+
+int check_signature(const volatile void __iomem *io_addr,
+                       const unsigned char *signature, int length)
+{
+       while (length--) {
+               if (readb(io_addr) != *signature)
+                       return 0;
+               io_addr++;
+               signature++;
+       }
+       return 1;
+}
+EXPORT_SYMBOL(check_signature);
index b98f01a2eb946b221f5d7d7d193422f95e607a3a..5ca67b3cfd35ba3243badf0fc50371c299c961fd 100644 (file)
--- a/lib/idr.c
+++ b/lib/idr.c
@@ -390,6 +390,53 @@ void idr_remove(struct idr *idp, int id)
 }
 EXPORT_SYMBOL(idr_remove);
 
+/**
+ * idr_remove_all - remove all ids from the given idr tree
+ * @idp: idr handle
+ *
+ * idr_destroy() only frees up unused, cached idp_layers, but this
+ * function will remove all id mappings and leave all idp_layers
+ * unused.
+ *
+ * A typical clean-up sequence for objects stored in an idr tree, will
+ * use idr_for_each() to free all objects, if necessay, then
+ * idr_remove_all() to remove all ids, and idr_destroy() to free
+ * up the cached idr_layers.
+ */
+void idr_remove_all(struct idr *idp)
+{
+       int n, id, max, error = 0;
+       struct idr_layer *p;
+       struct idr_layer *pa[MAX_LEVEL];
+       struct idr_layer **paa = &pa[0];
+
+       n = idp->layers * IDR_BITS;
+       p = idp->top;
+       max = 1 << n;
+
+       id = 0;
+       while (id < max && !error) {
+               while (n > IDR_BITS && p) {
+                       n -= IDR_BITS;
+                       *paa++ = p;
+                       p = p->ary[(id >> n) & IDR_MASK];
+               }
+
+               id += 1 << n;
+               while (n < fls(id)) {
+                       if (p) {
+                               memset(p, 0, sizeof *p);
+                               free_layer(idp, p);
+                       }
+                       n += IDR_BITS;
+                       p = *--paa;
+               }
+       }
+       idp->top = NULL;
+       idp->layers = 0;
+}
+EXPORT_SYMBOL(idr_remove_all);
+
 /**
  * idr_destroy - release all cached layers within an idr tree
  * idp: idr handle
@@ -436,6 +483,61 @@ void *idr_find(struct idr *idp, int id)
 }
 EXPORT_SYMBOL(idr_find);
 
+/**
+ * idr_for_each - iterate through all stored pointers
+ * @idp: idr handle
+ * @fn: function to be called for each pointer
+ * @data: data passed back to callback function
+ *
+ * Iterate over the pointers registered with the given idr.  The
+ * callback function will be called for each pointer currently
+ * registered, passing the id, the pointer and the data pointer passed
+ * to this function.  It is not safe to modify the idr tree while in
+ * the callback, so functions such as idr_get_new and idr_remove are
+ * not allowed.
+ *
+ * We check the return of @fn each time. If it returns anything other
+ * than 0, we break out and return that value.
+ *
+ * The caller must serialize idr_for_each() vs idr_get_new() and idr_remove().
+ */
+int idr_for_each(struct idr *idp,
+                int (*fn)(int id, void *p, void *data), void *data)
+{
+       int n, id, max, error = 0;
+       struct idr_layer *p;
+       struct idr_layer *pa[MAX_LEVEL];
+       struct idr_layer **paa = &pa[0];
+
+       n = idp->layers * IDR_BITS;
+       p = idp->top;
+       max = 1 << n;
+
+       id = 0;
+       while (id < max) {
+               while (n > 0 && p) {
+                       n -= IDR_BITS;
+                       *paa++ = p;
+                       p = p->ary[(id >> n) & IDR_MASK];
+               }
+
+               if (p) {
+                       error = fn(id, (void *)p, data);
+                       if (error)
+                               break;
+               }
+
+               id += 1 << n;
+               while (n < fls(id)) {
+                       n += IDR_BITS;
+                       p = *--paa;
+               }
+       }
+
+       return error;
+}
+EXPORT_SYMBOL(idr_for_each);
+
 /**
  * idr_replace - replace pointer for given id
  * @idp: idr handle
index 850449080e1cfb7f619eca4ae5d5ed6aca01a1d0..cf22c617baa44db8708f9908efc64b9f767e0c92 100644 (file)
@@ -3,8 +3,17 @@
  */
 
 #include <linux/percpu_counter.h>
+#include <linux/notifier.h>
+#include <linux/mutex.h>
+#include <linux/init.h>
+#include <linux/cpu.h>
 #include <linux/module.h>
 
+#ifdef CONFIG_HOTPLUG_CPU
+static LIST_HEAD(percpu_counters);
+static DEFINE_MUTEX(percpu_counters_lock);
+#endif
+
 void percpu_counter_mod(struct percpu_counter *fbc, s32 amount)
 {
        long count;
@@ -36,7 +45,7 @@ s64 percpu_counter_sum(struct percpu_counter *fbc)
 
        spin_lock(&fbc->lock);
        ret = fbc->count;
-       for_each_possible_cpu(cpu) {
+       for_each_online_cpu(cpu) {
                s32 *pcount = per_cpu_ptr(fbc->counters, cpu);
                ret += *pcount;
        }
@@ -44,3 +53,60 @@ s64 percpu_counter_sum(struct percpu_counter *fbc)
        return ret < 0 ? 0 : ret;
 }
 EXPORT_SYMBOL(percpu_counter_sum);
+
+void percpu_counter_init(struct percpu_counter *fbc, s64 amount)
+{
+       spin_lock_init(&fbc->lock);
+       fbc->count = amount;
+       fbc->counters = alloc_percpu(s32);
+#ifdef CONFIG_HOTPLUG_CPU
+       mutex_lock(&percpu_counters_lock);
+       list_add(&fbc->list, &percpu_counters);
+       mutex_unlock(&percpu_counters_lock);
+#endif
+}
+EXPORT_SYMBOL(percpu_counter_init);
+
+void percpu_counter_destroy(struct percpu_counter *fbc)
+{
+       free_percpu(fbc->counters);
+#ifdef CONFIG_HOTPLUG_CPU
+       mutex_lock(&percpu_counters_lock);
+       list_del(&fbc->list);
+       mutex_unlock(&percpu_counters_lock);
+#endif
+}
+EXPORT_SYMBOL(percpu_counter_destroy);
+
+#ifdef CONFIG_HOTPLUG_CPU
+static int __cpuinit percpu_counter_hotcpu_callback(struct notifier_block *nb,
+                                       unsigned long action, void *hcpu)
+{
+       unsigned int cpu;
+       struct percpu_counter *fbc;
+
+       if (action != CPU_DEAD)
+               return NOTIFY_OK;
+
+       cpu = (unsigned long)hcpu;
+       mutex_lock(&percpu_counters_lock);
+       list_for_each_entry(fbc, &percpu_counters, list) {
+               s32 *pcount;
+
+               spin_lock(&fbc->lock);
+               pcount = per_cpu_ptr(fbc->counters, cpu);
+               fbc->count += *pcount;
+               *pcount = 0;
+               spin_unlock(&fbc->lock);
+       }
+       mutex_unlock(&percpu_counters_lock);
+       return NOTIFY_OK;
+}
+
+static int __init percpu_counter_startup(void)
+{
+       hotcpu_notifier(percpu_counter_hotcpu_callback, 0);
+       return 0;
+}
+module_init(percpu_counter_startup);
+#endif
index 0172902412613025213c07e7758af9492e2bd761..6b6734df6d2df692b7d3d180220f9eb663fc3142 100644 (file)
@@ -135,6 +135,103 @@ static int skip_atoi(const char **s)
        return i;
 }
 
+/* Decimal conversion is by far the most typical, and is used
+ * for /proc and /sys data. This directly impacts e.g. top performance
+ * with many processes running. We optimize it for speed
+ * using code from
+ * http://www.cs.uiowa.edu/~jones/bcd/decimal.html
+ * (with permission from the author, Douglas W. Jones). */
+
+/* Formats correctly any integer in [0,99999].
+ * Outputs from one to five digits depending on input.
+ * On i386 gcc 4.1.2 -O2: ~250 bytes of code. */
+static char* put_dec_trunc(char *buf, unsigned q)
+{
+       unsigned d3, d2, d1, d0;
+       d1 = (q>>4) & 0xf;
+       d2 = (q>>8) & 0xf;
+       d3 = (q>>12);
+
+       d0 = 6*(d3 + d2 + d1) + (q & 0xf);
+       q = (d0 * 0xcd) >> 11;
+       d0 = d0 - 10*q;
+       *buf++ = d0 + '0'; /* least significant digit */
+       d1 = q + 9*d3 + 5*d2 + d1;
+       if (d1 != 0) {
+               q = (d1 * 0xcd) >> 11;
+               d1 = d1 - 10*q;
+               *buf++ = d1 + '0'; /* next digit */
+
+               d2 = q + 2*d2;
+               if ((d2 != 0) || (d3 != 0)) {
+                       q = (d2 * 0xd) >> 7;
+                       d2 = d2 - 10*q;
+                       *buf++ = d2 + '0'; /* next digit */
+
+                       d3 = q + 4*d3;
+                       if (d3 != 0) {
+                               q = (d3 * 0xcd) >> 11;
+                               d3 = d3 - 10*q;
+                               *buf++ = d3 + '0';  /* next digit */
+                               if (q != 0)
+                                       *buf++ = q + '0';  /* most sign. digit */
+                       }
+               }
+       }
+       return buf;
+}
+/* Same with if's removed. Always emits five digits */
+static char* put_dec_full(char *buf, unsigned q)
+{
+       /* BTW, if q is in [0,9999], 8-bit ints will be enough, */
+       /* but anyway, gcc produces better code with full-sized ints */
+       unsigned d3, d2, d1, d0;
+       d1 = (q>>4) & 0xf;
+       d2 = (q>>8) & 0xf;
+       d3 = (q>>12);
+
+       /* Possible ways to approx. divide by 10 */
+       /* gcc -O2 replaces multiply with shifts and adds */
+       // (x * 0xcd) >> 11: 11001101 - shorter code than * 0x67 (on i386)
+       // (x * 0x67) >> 10:  1100111
+       // (x * 0x34) >> 9:    110100 - same
+       // (x * 0x1a) >> 8:     11010 - same
+       // (x * 0x0d) >> 7:      1101 - same, shortest code (on i386)
+
+       d0 = 6*(d3 + d2 + d1) + (q & 0xf);
+       q = (d0 * 0xcd) >> 11;
+       d0 = d0 - 10*q;
+       *buf++ = d0 + '0';
+       d1 = q + 9*d3 + 5*d2 + d1;
+               q = (d1 * 0xcd) >> 11;
+               d1 = d1 - 10*q;
+               *buf++ = d1 + '0';
+
+               d2 = q + 2*d2;
+                       q = (d2 * 0xd) >> 7;
+                       d2 = d2 - 10*q;
+                       *buf++ = d2 + '0';
+
+                       d3 = q + 4*d3;
+                               q = (d3 * 0xcd) >> 11; /* - shorter code */
+                               /* q = (d3 * 0x67) >> 10; - would also work */
+                               d3 = d3 - 10*q;
+                               *buf++ = d3 + '0';
+                                       *buf++ = q + '0';
+       return buf;
+}
+/* No inlining helps gcc to use registers better */
+static noinline char* put_dec(char *buf, unsigned long long num)
+{
+       while (1) {
+               unsigned rem;
+               if (num < 100000)
+                       return put_dec_trunc(buf, num);
+               rem = do_div(num, 100000);
+               buf = put_dec_full(buf, rem);
+       }
+}
+
 #define ZEROPAD        1               /* pad with zero */
 #define SIGN   2               /* unsigned/signed long */
 #define PLUS   4               /* show plus */
@@ -143,12 +240,14 @@ static int skip_atoi(const char **s)
 #define SPECIAL        32              /* 0x */
 #define LARGE  64              /* use 'ABCDEF' instead of 'abcdef' */
 
-static char * number(char * buf, char * end, unsigned long long num, int base, int size, int precision, int type)
+static char *number(char *buf, char *end, unsigned long long num, int base, int size, int precision, int type)
 {
-       char c,sign,tmp[66];
+       char sign,tmp[66];
        const char *digits;
-       static const char small_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
-       static const char large_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+       /* we are called with base 8, 10 or 16, only, thus don't need "g..."  */
+       static const char small_digits[] = "0123456789abcdefx"; /* "ghijklmnopqrstuvwxyz"; */
+       static const char large_digits[] = "0123456789ABCDEFX"; /* "GHIJKLMNOPQRSTUVWXYZ"; */
+       int need_pfx = ((type & SPECIAL) && base != 10);
        int i;
 
        digits = (type & LARGE) ? large_digits : small_digits;
@@ -156,7 +255,6 @@ static char * number(char * buf, char * end, unsigned long long num, int base, i
                type &= ~ZEROPAD;
        if (base < 2 || base > 36)
                return NULL;
-       c = (type & ZEROPAD) ? '0' : ' ';
        sign = 0;
        if (type & SIGN) {
                if ((signed long long) num < 0) {
@@ -171,64 +269,85 @@ static char * number(char * buf, char * end, unsigned long long num, int base, i
                        size--;
                }
        }
-       if (type & SPECIAL) {
+       if (need_pfx) {
+               size--;
                if (base == 16)
-                       size -= 2;
-               else if (base == 8)
                        size--;
        }
+
+       /* generate full string in tmp[], in reverse order */
        i = 0;
        if (num == 0)
-               tmp[i++]='0';
-       else while (num != 0)
+               tmp[i++] = '0';
+       /* Generic code, for any base:
+       else do {
                tmp[i++] = digits[do_div(num,base)];
+       } while (num != 0);
+       */
+       else if (base != 10) { /* 8 or 16 */
+               int mask = base - 1;
+               int shift = 3;
+               if (base == 16) shift = 4;
+               do {
+                       tmp[i++] = digits[((unsigned char)num) & mask];
+                       num >>= shift;
+               } while (num);
+       } else { /* base 10 */
+               i = put_dec(tmp, num) - tmp;
+       }
+
+       /* printing 100 using %2d gives "100", not "00" */
        if (i > precision)
                precision = i;
+       /* leading space padding */
        size -= precision;
-       if (!(type&(ZEROPAD+LEFT))) {
-               while(size-->0) {
+       if (!(type & (ZEROPAD+LEFT))) {
+               while(--size >= 0) {
                        if (buf < end)
                                *buf = ' ';
                        ++buf;
                }
        }
+       /* sign */
        if (sign) {
                if (buf < end)
                        *buf = sign;
                ++buf;
        }
-       if (type & SPECIAL) {
-               if (base==8) {
-                       if (buf < end)
-                               *buf = '0';
-                       ++buf;
-               } else if (base==16) {
-                       if (buf < end)
-                               *buf = '0';
-                       ++buf;
+       /* "0x" / "0" prefix */
+       if (need_pfx) {
+               if (buf < end)
+                       *buf = '0';
+               ++buf;
+               if (base == 16) {
                        if (buf < end)
-                               *buf = digits[33];
+                               *buf = digits[16]; /* for arbitrary base: digits[33]; */
                        ++buf;
                }
        }
+       /* zero or space padding */
        if (!(type & LEFT)) {
-               while (size-- > 0) {
+               char c = (type & ZEROPAD) ? '0' : ' ';
+               while (--size >= 0) {
                        if (buf < end)
                                *buf = c;
                        ++buf;
                }
        }
-       while (i < precision--) {
+       /* hmm even more zero padding? */
+       while (i <= --precision) {
                if (buf < end)
                        *buf = '0';
                ++buf;
        }
-       while (i-- > 0) {
+       /* actual digits of result */
+       while (--i >= 0) {
                if (buf < end)
                        *buf = tmp[i];
                ++buf;
        }
-       while (size-- > 0) {
+       /* trailing space padding */
+       while (--size >= 0) {
                if (buf < end)
                        *buf = ' ';
                ++buf;
@@ -276,7 +395,7 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
           used for unknown buffer sizes. */
        if (unlikely((int) size < 0)) {
                /* There can be only one.. */
-               static int warn = 1;
+               static char warn = 1;
                WARN_ON(warn);
                warn = 0;
                return 0;
index 8ac412b45f1882cee49d35ec6ad8ef58ce04a402..086af703da43345ecf47d6168ca7b84f5616d050 100644 (file)
@@ -117,7 +117,7 @@ config MEMORY_HOTPLUG
        bool "Allow for memory hot-add"
        depends on SPARSEMEM || X86_64_ACPI_NUMA
        depends on HOTPLUG && !SOFTWARE_SUSPEND && ARCH_ENABLE_MEMORY_HOTPLUG
-       depends on (IA64 || X86 || PPC64)
+       depends on (IA64 || X86 || PPC64 || SUPERH)
 
 comment "Memory hotplug is currently incompatible with Software Suspend"
        depends on SPARSEMEM && HOTPLUG && SOFTWARE_SUSPEND
@@ -168,3 +168,7 @@ config NR_QUICK
        depends on QUICKLIST
        default "2" if (SUPERH && !SUPERH64)
        default "1"
+
+config VIRT_TO_BUS
+       def_bool y
+       depends on !ARCH_NO_VIRT_TO_BUS
index e5de3781d3feed5b6f156b064b4af8bb79871fed..f50a2811f9dc86b876d24e75333558583c075f1d 100644 (file)
@@ -55,22 +55,6 @@ long congestion_wait(int rw, long timeout)
 }
 EXPORT_SYMBOL(congestion_wait);
 
-long congestion_wait_interruptible(int rw, long timeout)
-{
-       long ret;
-       DEFINE_WAIT(wait);
-       wait_queue_head_t *wqh = &congestion_wqh[rw];
-
-       prepare_to_wait(wqh, &wait, TASK_INTERRUPTIBLE);
-       if (signal_pending(current))
-               ret = -ERESTARTSYS;
-       else
-               ret = io_schedule_timeout(timeout);
-       finish_wait(wqh, &wait);
-       return ret;
-}
-EXPORT_SYMBOL(congestion_wait_interruptible);
-
 /**
  * congestion_end - wake up sleepers on a congested backing_dev_info
  * @rw: READ or WRITE
index c6ebd9f912abbfb7298c99fcd7432a3636857fb1..100b99c2d504d9d0057267623ba90f359465c597 100644 (file)
@@ -120,6 +120,7 @@ void __remove_from_page_cache(struct page *page)
        page->mapping = NULL;
        mapping->nrpages--;
        __dec_zone_page_state(page, NR_FILE_PAGES);
+       BUG_ON(page_mapped(page));
 }
 
 void remove_from_page_cache(struct page *page)
@@ -1218,6 +1219,8 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov,
                                retval = retval ?: desc.error;
                                break;
                        }
+                       if (desc.count > 0)
+                               break;
                }
        }
 out:
@@ -1964,7 +1967,6 @@ inline int generic_write_checks(struct file *file, loff_t *pos, size_t *count, i
        if (unlikely(*pos + *count > MAX_NON_LFS &&
                                !(file->f_flags & O_LARGEFILE))) {
                if (*pos >= MAX_NON_LFS) {
-                       send_sig(SIGXFSZ, current, 0);
                        return -EFBIG;
                }
                if (*count > MAX_NON_LFS - (unsigned long)*pos) {
@@ -1982,7 +1984,6 @@ inline int generic_write_checks(struct file *file, loff_t *pos, size_t *count, i
        if (likely(!isblk)) {
                if (unlikely(*pos >= inode->i_sb->s_maxbytes)) {
                        if (*count || *pos > inode->i_sb->s_maxbytes) {
-                               send_sig(SIGXFSZ, current, 0);
                                return -EFBIG;
                        }
                        /* zero-length writes at ->s_maxbytes are OK */
index a45d1f0691cecb63e088d02fb3ff287f025e4d78..acc0fb3cf067125ce77b9821617c7ee39893c01e 100644 (file)
@@ -66,7 +66,7 @@ static void enqueue_huge_page(struct page *page)
 static struct page *dequeue_huge_page(struct vm_area_struct *vma,
                                unsigned long address)
 {
-       int nid = numa_node_id();
+       int nid;
        struct page *page = NULL;
        struct zonelist *zonelist = huge_zonelist(vma, address);
        struct zone **z;
@@ -101,13 +101,20 @@ static void free_huge_page(struct page *page)
 
 static int alloc_fresh_huge_page(void)
 {
-       static int nid = 0;
+       static int prev_nid;
        struct page *page;
-       page = alloc_pages_node(nid, GFP_HIGHUSER|__GFP_COMP|__GFP_NOWARN,
-                                       HUGETLB_PAGE_ORDER);
-       nid = next_node(nid, node_online_map);
+       static DEFINE_SPINLOCK(nid_lock);
+       int nid;
+
+       spin_lock(&nid_lock);
+       nid = next_node(prev_nid, node_online_map);
        if (nid == MAX_NUMNODES)
                nid = first_node(node_online_map);
+       prev_nid = nid;
+       spin_unlock(&nid_lock);
+
+       page = alloc_pages_node(nid, GFP_HIGHUSER|__GFP_COMP|__GFP_NOWARN,
+                                       HUGETLB_PAGE_ORDER);
        if (page) {
                set_compound_page_dtor(page, free_huge_page);
                spin_lock(&hugetlb_lock);
index 60542d006ec16b0f0b48404493ff7f96c579862c..93ee375b38e7edc7b414b7a2b6891411a45d0b0c 100644 (file)
@@ -287,9 +287,11 @@ asmlinkage long sys_madvise(unsigned long start, size_t len_in, int behavior)
        struct vm_area_struct * vma, *prev;
        int unmapped_error = 0;
        int error = -EINVAL;
+       int write;
        size_t len;
 
-       if (madvise_need_mmap_write(behavior))
+       write = madvise_need_mmap_write(behavior);
+       if (write)
                down_write(&current->mm->mmap_sem);
        else
                down_read(&current->mm->mmap_sem);
@@ -354,7 +356,7 @@ asmlinkage long sys_madvise(unsigned long start, size_t len_in, int behavior)
                        vma = find_vma(current->mm, start);
        }
 out:
-       if (madvise_need_mmap_write(behavior))
+       if (write)
                up_write(&current->mm->mmap_sem);
        else
                up_read(&current->mm->mmap_sem);
index f64cbf9baa3633fc1755f675ec2b46c920c4ecef..b3d73bb1f6803037384db42a44965b4c60f79c8a 100644 (file)
@@ -78,11 +78,9 @@ unsigned long num_physpages;
  * and ZONE_HIGHMEM.
  */
 void * high_memory;
-unsigned long vmalloc_earlyreserve;
 
 EXPORT_SYMBOL(num_physpages);
 EXPORT_SYMBOL(high_memory);
-EXPORT_SYMBOL(vmalloc_earlyreserve);
 
 int randomize_va_space __read_mostly = 1;
 
@@ -1055,6 +1053,14 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
                do {
                        struct page *page;
 
+                       /*
+                        * If tsk is ooming, cut off its access to large memory
+                        * allocations. It has a pending SIGKILL, but it can't
+                        * be processed until returning to user space.
+                        */
+                       if (unlikely(test_tsk_thread_flag(tsk, TIF_MEMDIE)))
+                               return -ENOMEM;
+
                        if (write)
                                foll_flags |= FOLL_WRITE;
 
@@ -2673,7 +2679,7 @@ int make_pages_present(unsigned long addr, unsigned long end)
        write = (vma->vm_flags & VM_WRITE) != 0;
        BUG_ON(addr >= end);
        BUG_ON(end > vma->vm_end);
-       len = (end+PAGE_SIZE-1)/PAGE_SIZE-addr/PAGE_SIZE;
+       len = DIV_ROUND_UP(end, PAGE_SIZE) - addr/PAGE_SIZE;
        ret = get_user_pages(current, current->mm, addr,
                        len, write, 0, NULL, NULL);
        if (ret < 0)
index d76e8eb342d0df2e0468f014076a720866ae2277..188f8d9c4aedf4eddb6137c44d55f336936129e4 100644 (file)
 static struct kmem_cache *policy_cache;
 static struct kmem_cache *sn_cache;
 
-#define PDprintk(fmt...)
-
 /* Highest zone. An specific allocation for a zone below that is not
    policied. */
 enum zone_type policy_zone = 0;
@@ -175,7 +173,9 @@ static struct mempolicy *mpol_new(int mode, nodemask_t *nodes)
 {
        struct mempolicy *policy;
 
-       PDprintk("setting mode %d nodes[0] %lx\n", mode, nodes_addr(*nodes)[0]);
+       pr_debug("setting mode %d nodes[0] %lx\n",
+                mode, nodes ? nodes_addr(*nodes)[0] : -1);
+
        if (mode == MPOL_DEFAULT)
                return NULL;
        policy = kmem_cache_alloc(policy_cache, GFP_KERNEL);
@@ -379,7 +379,7 @@ static int policy_vma(struct vm_area_struct *vma, struct mempolicy *new)
        int err = 0;
        struct mempolicy *old = vma->vm_policy;
 
-       PDprintk("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n",
+       pr_debug("vma %lx-%lx/%lx vm_ops %p vm_file %p set_policy %p\n",
                 vma->vm_start, vma->vm_end, vma->vm_pgoff,
                 vma->vm_ops, vma->vm_file,
                 vma->vm_ops ? vma->vm_ops->set_policy : NULL);
@@ -776,8 +776,8 @@ long do_mbind(unsigned long start, unsigned long len,
        if (!new)
                flags |= MPOL_MF_DISCONTIG_OK;
 
-       PDprintk("mbind %lx-%lx mode:%ld nodes:%lx\n",start,start+len,
-                       mode,nodes_addr(nodes)[0]);
+       pr_debug("mbind %lx-%lx mode:%ld nodes:%lx\n",start,start+len,
+                mode, nmask ? nodes_addr(*nmask)[0] : -1);
 
        down_write(&mm->mmap_sem);
        vma = check_range(mm, start, end, nmask,
@@ -1434,7 +1434,7 @@ static void sp_insert(struct shared_policy *sp, struct sp_node *new)
        }
        rb_link_node(&new->nd, parent, p);
        rb_insert_color(&new->nd, &sp->root);
-       PDprintk("inserting %lx-%lx: %d\n", new->start, new->end,
+       pr_debug("inserting %lx-%lx: %d\n", new->start, new->end,
                 new->policy ? new->policy->policy : 0);
 }
 
@@ -1459,7 +1459,7 @@ mpol_shared_policy_lookup(struct shared_policy *sp, unsigned long idx)
 
 static void sp_delete(struct shared_policy *sp, struct sp_node *n)
 {
-       PDprintk("deleting %lx-l%x\n", n->start, n->end);
+       pr_debug("deleting %lx-l%lx\n", n->start, n->end);
        rb_erase(&n->nd, &sp->root);
        mpol_free(n->policy);
        kmem_cache_free(sn_cache, n);
@@ -1558,10 +1558,10 @@ int mpol_set_shared_policy(struct shared_policy *info,
        struct sp_node *new = NULL;
        unsigned long sz = vma_pages(vma);
 
-       PDprintk("set_shared_policy %lx sz %lu %d %lx\n",
+       pr_debug("set_shared_policy %lx sz %lu %d %lx\n",
                 vma->vm_pgoff,
                 sz, npol? npol->policy : -1,
-               npol ? nodes_addr(npol->v.nodes)[0] : -1);
+                npol ? nodes_addr(npol->v.nodes)[0] : -1);
 
        if (npol) {
                new = sp_alloc(vma->vm_pgoff, vma->vm_pgoff + sz, npol);
@@ -1597,6 +1597,10 @@ void mpol_free_shared_policy(struct shared_policy *p)
 /* assumes fs == KERNEL_DS */
 void __init numa_policy_init(void)
 {
+       nodemask_t interleave_nodes;
+       unsigned long largest = 0;
+       int nid, prefer = 0;
+
        policy_cache = kmem_cache_create("numa_policy",
                                         sizeof(struct mempolicy),
                                         0, SLAB_PANIC, NULL, NULL);
@@ -1605,10 +1609,31 @@ void __init numa_policy_init(void)
                                     sizeof(struct sp_node),
                                     0, SLAB_PANIC, NULL, NULL);
 
-       /* Set interleaving policy for system init. This way not all
-          the data structures allocated at system boot end up in node zero. */
+       /*
+        * Set interleaving policy for system init. Interleaving is only
+        * enabled across suitably sized nodes (default is >= 16MB), or
+        * fall back to the largest node if they're all smaller.
+        */
+       nodes_clear(interleave_nodes);
+       for_each_online_node(nid) {
+               unsigned long total_pages = node_present_pages(nid);
+
+               /* Preserve the largest node */
+               if (largest < total_pages) {
+                       largest = total_pages;
+                       prefer = nid;
+               }
+
+               /* Interleave this node? */
+               if ((total_pages << PAGE_SHIFT) >= (16 << 20))
+                       node_set(nid, interleave_nodes);
+       }
+
+       /* All too small, use the largest */
+       if (unlikely(nodes_empty(interleave_nodes)))
+               node_set(prefer, interleave_nodes);
 
-       if (do_set_mempolicy(MPOL_INTERLEAVE, &node_online_map))
+       if (do_set_mempolicy(MPOL_INTERLEAVE, &interleave_nodes))
                printk("numa_policy_init: interleaving failed\n");
 }
 
index cc1ca86dfc2496b6e0cae7703d4a6dc4f4f97150..3e8f1fed0e1f8accce8d9b931e59ba432ab92d53 100644 (file)
@@ -263,6 +263,9 @@ void mempool_free(void *element, mempool_t *pool)
 {
        unsigned long flags;
 
+       if (unlikely(element == NULL))
+               return;
+
        smp_mb();
        if (pool->curr_nr < pool->min_nr) {
                spin_lock_irqsave(&pool->lock, flags);
index 4d3fea267e0dabde457091a2618a0efe8dba864d..7b2656055d6a96a6b940574e4d23f0a4fc7dd6bc 100644 (file)
@@ -244,9 +244,12 @@ int user_shm_lock(size_t size, struct user_struct *user)
 
        locked = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
        lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur;
+       if (lock_limit == RLIM_INFINITY)
+               allowed = 1;
        lock_limit >>= PAGE_SHIFT;
        spin_lock(&shmlock_user_lock);
-       if (locked + user->locked_shm > lock_limit && !capable(CAP_IPC_LOCK))
+       if (!allowed &&
+           locked + user->locked_shm > lock_limit && !capable(CAP_IPC_LOCK))
                goto out;
        get_uid(user);
        user->locked_shm += locked;
index 9f70c8e8c871c272047fdc4c969f285299b58926..144b4a290f2c4fab1cb7cfae3bf442a496aa81ba 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -894,14 +894,11 @@ unsigned long do_mmap_pgoff(struct file * file, unsigned long addr,
                        unsigned long flags, unsigned long pgoff)
 {
        struct mm_struct * mm = current->mm;
-       struct vm_area_struct * vma, * prev;
        struct inode *inode;
        unsigned int vm_flags;
-       int correct_wcount = 0;
        int error;
-       struct rb_node ** rb_link, * rb_parent;
        int accountable = 1;
-       unsigned long charged = 0, reqprot = prot;
+       unsigned long reqprot = prot;
 
        /*
         * Does the application expect PROT_READ to imply PROT_EXEC?
@@ -1027,6 +1024,24 @@ unsigned long do_mmap_pgoff(struct file * file, unsigned long addr,
        if (error)
                return error;
 
+       return mmap_region(file, addr, len, flags, vm_flags, pgoff,
+                          accountable);
+}
+EXPORT_SYMBOL(do_mmap_pgoff);
+
+unsigned long mmap_region(struct file *file, unsigned long addr,
+                         unsigned long len, unsigned long flags,
+                         unsigned int vm_flags, unsigned long pgoff,
+                         int accountable)
+{
+       struct mm_struct *mm = current->mm;
+       struct vm_area_struct *vma, *prev;
+       int correct_wcount = 0;
+       int error;
+       struct rb_node **rb_link, *rb_parent;
+       unsigned long charged = 0;
+       struct inode *inode =  file ? file->f_path.dentry->d_inode : NULL;
+
        /* Clear old maps */
        error = -ENOMEM;
 munmap_back:
@@ -1175,8 +1190,6 @@ unacct_error:
        return error;
 }
 
-EXPORT_SYMBOL(do_mmap_pgoff);
-
 /* Get an address range which is currently unmapped.
  * For shmat() with addr=0.
  *
index 989e2e9af5c3adc42cb250409a4b7249288e0df7..8bbbf147a79421fd59d5c616266a74b5142232e6 100644 (file)
@@ -367,6 +367,11 @@ struct vm_area_struct *find_extend_vma(struct mm_struct *mm, unsigned long addr)
        return find_vma(mm, addr);
 }
 
+int expand_stack(struct vm_area_struct *vma, unsigned long address)
+{
+       return -ENOMEM;
+}
+
 /*
  * look up the first VMA exactly that exactly matches addr
  * - should be called with mm->mmap_sem at least held readlocked
index eec1481ba44f2ab1ec8b3d31b62ba244557b221f..ea9da3bed3e908db7ff42dfd5460250d70b2edbf 100644 (file)
@@ -476,15 +476,13 @@ static void wb_kupdate(unsigned long arg)
  * sysctl handler for /proc/sys/vm/dirty_writeback_centisecs
  */
 int dirty_writeback_centisecs_handler(ctl_table *table, int write,
-               struct file *file, void __user *buffer, size_t *length, loff_t *ppos)
+       struct file *file, void __user *buffer, size_t *length, loff_t *ppos)
 {
        proc_dointvec_userhz_jiffies(table, write, file, buffer, length, ppos);
-       if (dirty_writeback_interval) {
-               mod_timer(&wb_timer,
-                       jiffies + dirty_writeback_interval);
-               } else {
+       if (dirty_writeback_interval)
+               mod_timer(&wb_timer, jiffies + dirty_writeback_interval);
+       else
                del_timer(&wb_timer);
-       }
        return 0;
 }
 
index 05ace44852eb88c9f2c6fa50b98d3ecd569d202c..f9e4e647d7e8de6cb136a99232495d5fec2fcf98 100644 (file)
@@ -126,13 +126,13 @@ static unsigned long __meminitdata dma_reserve;
     #endif
   #endif
 
-  struct node_active_region __meminitdata early_node_map[MAX_ACTIVE_REGIONS];
-  int __meminitdata nr_nodemap_entries;
-  unsigned long __meminitdata arch_zone_lowest_possible_pfn[MAX_NR_ZONES];
-  unsigned long __meminitdata arch_zone_highest_possible_pfn[MAX_NR_ZONES];
+  static struct node_active_region __meminitdata early_node_map[MAX_ACTIVE_REGIONS];
+  static int __meminitdata nr_nodemap_entries;
+  static unsigned long __meminitdata arch_zone_lowest_possible_pfn[MAX_NR_ZONES];
+  static unsigned long __meminitdata arch_zone_highest_possible_pfn[MAX_NR_ZONES];
 #ifdef CONFIG_MEMORY_HOTPLUG_RESERVE
-  unsigned long __initdata node_boundary_start_pfn[MAX_NUMNODES];
-  unsigned long __initdata node_boundary_end_pfn[MAX_NUMNODES];
+  static unsigned long __meminitdata node_boundary_start_pfn[MAX_NUMNODES];
+  static unsigned long __meminitdata node_boundary_end_pfn[MAX_NUMNODES];
 #endif /* CONFIG_MEMORY_HOTPLUG_RESERVE */
 #endif /* CONFIG_ARCH_POPULATES_NODE_MAP */
 
@@ -900,11 +900,13 @@ static struct fail_page_alloc_attr {
 
        u32 ignore_gfp_highmem;
        u32 ignore_gfp_wait;
+       u32 min_order;
 
 #ifdef CONFIG_FAULT_INJECTION_DEBUG_FS
 
        struct dentry *ignore_gfp_highmem_file;
        struct dentry *ignore_gfp_wait_file;
+       struct dentry *min_order_file;
 
 #endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */
 
@@ -912,6 +914,7 @@ static struct fail_page_alloc_attr {
        .attr = FAULT_ATTR_INITIALIZER,
        .ignore_gfp_wait = 1,
        .ignore_gfp_highmem = 1,
+       .min_order = 1,
 };
 
 static int __init setup_fail_page_alloc(char *str)
@@ -922,6 +925,8 @@ __setup("fail_page_alloc=", setup_fail_page_alloc);
 
 static int should_fail_alloc_page(gfp_t gfp_mask, unsigned int order)
 {
+       if (order < fail_page_alloc.min_order)
+               return 0;
        if (gfp_mask & __GFP_NOFAIL)
                return 0;
        if (fail_page_alloc.ignore_gfp_highmem && (gfp_mask & __GFP_HIGHMEM))
@@ -953,12 +958,17 @@ static int __init fail_page_alloc_debugfs(void)
        fail_page_alloc.ignore_gfp_highmem_file =
                debugfs_create_bool("ignore-gfp-highmem", mode, dir,
                                      &fail_page_alloc.ignore_gfp_highmem);
+       fail_page_alloc.min_order_file =
+               debugfs_create_u32("min-order", mode, dir,
+                                  &fail_page_alloc.min_order);
 
        if (!fail_page_alloc.ignore_gfp_wait_file ||
-                       !fail_page_alloc.ignore_gfp_highmem_file) {
+            !fail_page_alloc.ignore_gfp_highmem_file ||
+            !fail_page_alloc.min_order_file) {
                err = -ENOMEM;
                debugfs_remove(fail_page_alloc.ignore_gfp_wait_file);
                debugfs_remove(fail_page_alloc.ignore_gfp_highmem_file);
+               debugfs_remove(fail_page_alloc.min_order_file);
                cleanup_fault_attr_dentries(&fail_page_alloc.attr);
        }
 
@@ -1621,8 +1631,8 @@ void show_free_areas(void)
  *
  * Add all populated zones of a node to the zonelist.
  */
-static int __meminit build_zonelists_node(pg_data_t *pgdat,
-                       struct zonelist *zonelist, int nr_zones, enum zone_type zone_type)
+static int build_zonelists_node(pg_data_t *pgdat, struct zonelist *zonelist,
+                               int nr_zones, enum zone_type zone_type)
 {
        struct zone *zone;
 
@@ -1641,9 +1651,102 @@ static int __meminit build_zonelists_node(pg_data_t *pgdat,
        return nr_zones;
 }
 
+
+/*
+ *  zonelist_order:
+ *  0 = automatic detection of better ordering.
+ *  1 = order by ([node] distance, -zonetype)
+ *  2 = order by (-zonetype, [node] distance)
+ *
+ *  If not NUMA, ZONELIST_ORDER_ZONE and ZONELIST_ORDER_NODE will create
+ *  the same zonelist. So only NUMA can configure this param.
+ */
+#define ZONELIST_ORDER_DEFAULT  0
+#define ZONELIST_ORDER_NODE     1
+#define ZONELIST_ORDER_ZONE     2
+
+/* zonelist order in the kernel.
+ * set_zonelist_order() will set this to NODE or ZONE.
+ */
+static int current_zonelist_order = ZONELIST_ORDER_DEFAULT;
+static char zonelist_order_name[3][8] = {"Default", "Node", "Zone"};
+
+
 #ifdef CONFIG_NUMA
+/* The value user specified ....changed by config */
+static int user_zonelist_order = ZONELIST_ORDER_DEFAULT;
+/* string for sysctl */
+#define NUMA_ZONELIST_ORDER_LEN        16
+char numa_zonelist_order[16] = "default";
+
+/*
+ * interface for configure zonelist ordering.
+ * command line option "numa_zonelist_order"
+ *     = "[dD]efault   - default, automatic configuration.
+ *     = "[nN]ode      - order by node locality, then by zone within node
+ *     = "[zZ]one      - order by zone, then by locality within zone
+ */
+
+static int __parse_numa_zonelist_order(char *s)
+{
+       if (*s == 'd' || *s == 'D') {
+               user_zonelist_order = ZONELIST_ORDER_DEFAULT;
+       } else if (*s == 'n' || *s == 'N') {
+               user_zonelist_order = ZONELIST_ORDER_NODE;
+       } else if (*s == 'z' || *s == 'Z') {
+               user_zonelist_order = ZONELIST_ORDER_ZONE;
+       } else {
+               printk(KERN_WARNING
+                       "Ignoring invalid numa_zonelist_order value:  "
+                       "%s\n", s);
+               return -EINVAL;
+       }
+       return 0;
+}
+
+static __init int setup_numa_zonelist_order(char *s)
+{
+       if (s)
+               return __parse_numa_zonelist_order(s);
+       return 0;
+}
+early_param("numa_zonelist_order", setup_numa_zonelist_order);
+
+/*
+ * sysctl handler for numa_zonelist_order
+ */
+int numa_zonelist_order_handler(ctl_table *table, int write,
+               struct file *file, void __user *buffer, size_t *length,
+               loff_t *ppos)
+{
+       char saved_string[NUMA_ZONELIST_ORDER_LEN];
+       int ret;
+
+       if (write)
+               strncpy(saved_string, (char*)table->data,
+                       NUMA_ZONELIST_ORDER_LEN);
+       ret = proc_dostring(table, write, file, buffer, length, ppos);
+       if (ret)
+               return ret;
+       if (write) {
+               int oldval = user_zonelist_order;
+               if (__parse_numa_zonelist_order((char*)table->data)) {
+                       /*
+                        * bogus value.  restore saved string
+                        */
+                       strncpy((char*)table->data, saved_string,
+                               NUMA_ZONELIST_ORDER_LEN);
+                       user_zonelist_order = oldval;
+               } else if (oldval != user_zonelist_order)
+                       build_all_zonelists();
+       }
+       return 0;
+}
+
+
 #define MAX_NODE_LOAD (num_online_nodes())
-static int __meminitdata node_load[MAX_NUMNODES];
+static int node_load[MAX_NUMNODES];
+
 /**
  * find_next_best_node - find the next node that should appear in a given node's fallback list
  * @node: node whose fallback list we're appending
@@ -1658,7 +1761,7 @@ static int __meminitdata node_load[MAX_NUMNODES];
  * on them otherwise.
  * It returns -1 if no node is found.
  */
-static int __meminit find_next_best_node(int node, nodemask_t *used_node_mask)
+static int find_next_best_node(int node, nodemask_t *used_node_mask)
 {
        int n, val;
        int min_val = INT_MAX;
@@ -1704,13 +1807,129 @@ static int __meminit find_next_best_node(int node, nodemask_t *used_node_mask)
        return best_node;
 }
 
-static void __meminit build_zonelists(pg_data_t *pgdat)
+
+/*
+ * Build zonelists ordered by node and zones within node.
+ * This results in maximum locality--normal zone overflows into local
+ * DMA zone, if any--but risks exhausting DMA zone.
+ */
+static void build_zonelists_in_node_order(pg_data_t *pgdat, int node)
 {
-       int j, node, local_node;
        enum zone_type i;
-       int prev_node, load;
+       int j;
        struct zonelist *zonelist;
+
+       for (i = 0; i < MAX_NR_ZONES; i++) {
+               zonelist = pgdat->node_zonelists + i;
+               for (j = 0; zonelist->zones[j] != NULL; j++)
+                       ;
+               j = build_zonelists_node(NODE_DATA(node), zonelist, j, i);
+               zonelist->zones[j] = NULL;
+       }
+}
+
+/*
+ * Build zonelists ordered by zone and nodes within zones.
+ * This results in conserving DMA zone[s] until all Normal memory is
+ * exhausted, but results in overflowing to remote node while memory
+ * may still exist in local DMA zone.
+ */
+static int node_order[MAX_NUMNODES];
+
+static void build_zonelists_in_zone_order(pg_data_t *pgdat, int nr_nodes)
+{
+       enum zone_type i;
+       int pos, j, node;
+       int zone_type;          /* needs to be signed */
+       struct zone *z;
+       struct zonelist *zonelist;
+
+       for (i = 0; i < MAX_NR_ZONES; i++) {
+               zonelist = pgdat->node_zonelists + i;
+               pos = 0;
+               for (zone_type = i; zone_type >= 0; zone_type--) {
+                       for (j = 0; j < nr_nodes; j++) {
+                               node = node_order[j];
+                               z = &NODE_DATA(node)->node_zones[zone_type];
+                               if (populated_zone(z)) {
+                                       zonelist->zones[pos++] = z;
+                                       check_highest_zone(zone_type);
+                               }
+                       }
+               }
+               zonelist->zones[pos] = NULL;
+       }
+}
+
+static int default_zonelist_order(void)
+{
+       int nid, zone_type;
+       unsigned long low_kmem_size,total_size;
+       struct zone *z;
+       int average_size;
+       /*
+         * ZONE_DMA and ZONE_DMA32 can be very small area in the sytem.
+        * If they are really small and used heavily, the system can fall
+        * into OOM very easily.
+        * This function detect ZONE_DMA/DMA32 size and confgigures zone order.
+        */
+       /* Is there ZONE_NORMAL ? (ex. ppc has only DMA zone..) */
+       low_kmem_size = 0;
+       total_size = 0;
+       for_each_online_node(nid) {
+               for (zone_type = 0; zone_type < MAX_NR_ZONES; zone_type++) {
+                       z = &NODE_DATA(nid)->node_zones[zone_type];
+                       if (populated_zone(z)) {
+                               if (zone_type < ZONE_NORMAL)
+                                       low_kmem_size += z->present_pages;
+                               total_size += z->present_pages;
+                       }
+               }
+       }
+       if (!low_kmem_size ||  /* there are no DMA area. */
+           low_kmem_size > total_size/2) /* DMA/DMA32 is big. */
+               return ZONELIST_ORDER_NODE;
+       /*
+        * look into each node's config.
+        * If there is a node whose DMA/DMA32 memory is very big area on
+        * local memory, NODE_ORDER may be suitable.
+         */
+       average_size = total_size / (num_online_nodes() + 1);
+       for_each_online_node(nid) {
+               low_kmem_size = 0;
+               total_size = 0;
+               for (zone_type = 0; zone_type < MAX_NR_ZONES; zone_type++) {
+                       z = &NODE_DATA(nid)->node_zones[zone_type];
+                       if (populated_zone(z)) {
+                               if (zone_type < ZONE_NORMAL)
+                                       low_kmem_size += z->present_pages;
+                               total_size += z->present_pages;
+                       }
+               }
+               if (low_kmem_size &&
+                   total_size > average_size && /* ignore small node */
+                   low_kmem_size > total_size * 70/100)
+                       return ZONELIST_ORDER_NODE;
+       }
+       return ZONELIST_ORDER_ZONE;
+}
+
+static void set_zonelist_order(void)
+{
+       if (user_zonelist_order == ZONELIST_ORDER_DEFAULT)
+               current_zonelist_order = default_zonelist_order();
+       else
+               current_zonelist_order = user_zonelist_order;
+}
+
+static void build_zonelists(pg_data_t *pgdat)
+{
+       int j, node, load;
+       enum zone_type i;
        nodemask_t used_mask;
+       int local_node, prev_node;
+       struct zonelist *zonelist;
+       int order = current_zonelist_order;
 
        /* initialize zonelists */
        for (i = 0; i < MAX_NR_ZONES; i++) {
@@ -1723,6 +1942,11 @@ static void __meminit build_zonelists(pg_data_t *pgdat)
        load = num_online_nodes();
        prev_node = local_node;
        nodes_clear(used_mask);
+
+       memset(node_load, 0, sizeof(node_load));
+       memset(node_order, 0, sizeof(node_order));
+       j = 0;
+
        while ((node = find_next_best_node(local_node, &used_mask)) >= 0) {
                int distance = node_distance(local_node, node);
 
@@ -1738,23 +1962,25 @@ static void __meminit build_zonelists(pg_data_t *pgdat)
                 * So adding penalty to the first node in same
                 * distance group to make it round-robin.
                 */
-
                if (distance != node_distance(local_node, prev_node))
-                       node_load[node] += load;
+                       node_load[node] = load;
+
                prev_node = node;
                load--;
-               for (i = 0; i < MAX_NR_ZONES; i++) {
-                       zonelist = pgdat->node_zonelists + i;
-                       for (j = 0; zonelist->zones[j] != NULL; j++);
+               if (order == ZONELIST_ORDER_NODE)
+                       build_zonelists_in_node_order(pgdat, node);
+               else
+                       node_order[j++] = node; /* remember order */
+       }
 
-                       j = build_zonelists_node(NODE_DATA(node), zonelist, j, i);
-                       zonelist->zones[j] = NULL;
-               }
+       if (order == ZONELIST_ORDER_ZONE) {
+               /* calculate node order -- i.e., DMA last! */
+               build_zonelists_in_zone_order(pgdat, j);
        }
 }
 
 /* Construct the zonelist performance cache - see further mmzone.h */
-static void __meminit build_zonelist_cache(pg_data_t *pgdat)
+static void build_zonelist_cache(pg_data_t *pgdat)
 {
        int i;
 
@@ -1771,9 +1997,15 @@ static void __meminit build_zonelist_cache(pg_data_t *pgdat)
        }
 }
 
+
 #else  /* CONFIG_NUMA */
 
-static void __meminit build_zonelists(pg_data_t *pgdat)
+static void set_zonelist_order(void)
+{
+       current_zonelist_order = ZONELIST_ORDER_ZONE;
+}
+
+static void build_zonelists(pg_data_t *pgdat)
 {
        int node, local_node;
        enum zone_type i,j;
@@ -1809,7 +2041,7 @@ static void __meminit build_zonelists(pg_data_t *pgdat)
 }
 
 /* non-NUMA variant of zonelist performance cache - just NULL zlcache_ptr */
-static void __meminit build_zonelist_cache(pg_data_t *pgdat)
+static void build_zonelist_cache(pg_data_t *pgdat)
 {
        int i;
 
@@ -1820,7 +2052,7 @@ static void __meminit build_zonelist_cache(pg_data_t *pgdat)
 #endif /* CONFIG_NUMA */
 
 /* return values int ....just for stop_machine_run() */
-static int __meminit __build_all_zonelists(void *dummy)
+static int __build_all_zonelists(void *dummy)
 {
        int nid;
 
@@ -1831,8 +2063,10 @@ static int __meminit __build_all_zonelists(void *dummy)
        return 0;
 }
 
-void __meminit build_all_zonelists(void)
+void build_all_zonelists(void)
 {
+       set_zonelist_order();
+
        if (system_state == SYSTEM_BOOTING) {
                __build_all_zonelists(NULL);
                cpuset_init_current_mems_allowed();
@@ -1843,8 +2077,13 @@ void __meminit build_all_zonelists(void)
                /* cpuset refresh routine should be here */
        }
        vm_total_pages = nr_free_pagecache_pages();
-       printk("Built %i zonelists.  Total pages: %ld\n",
-                       num_online_nodes(), vm_total_pages);
+       printk("Built %i zonelists in %s order.  Total pages: %ld\n",
+                       num_online_nodes(),
+                       zonelist_order_name[current_zonelist_order],
+                       vm_total_pages);
+#ifdef CONFIG_NUMA
+       printk("Policy zone: %s\n", zone_names[policy_zone]);
+#endif
 }
 
 /*
@@ -1953,8 +2192,8 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone,
        }
 }
 
-void zone_init_free_lists(struct pglist_data *pgdat, struct zone *zone,
-                               unsigned long size)
+static void __meminit zone_init_free_lists(struct pglist_data *pgdat,
+                               struct zone *zone, unsigned long size)
 {
        int order;
        for (order = 0; order < MAX_ORDER ; order++) {
@@ -2370,7 +2609,7 @@ void __init push_node_boundaries(unsigned int nid,
 }
 
 /* If necessary, push the node boundary out for reserve hotadd */
-static void __init account_node_boundary(unsigned int nid,
+static void __meminit account_node_boundary(unsigned int nid,
                unsigned long *start_pfn, unsigned long *end_pfn)
 {
        printk(KERN_DEBUG "Entering account_node_boundary(%u, %lu, %lu)\n",
@@ -2390,7 +2629,7 @@ static void __init account_node_boundary(unsigned int nid,
 void __init push_node_boundaries(unsigned int nid,
                unsigned long start_pfn, unsigned long end_pfn) {}
 
-static void __init account_node_boundary(unsigned int nid,
+static void __meminit account_node_boundary(unsigned int nid,
                unsigned long *start_pfn, unsigned long *end_pfn) {}
 #endif
 
@@ -2431,7 +2670,7 @@ void __meminit get_pfn_range_for_nid(unsigned int nid,
  * Return the number of pages a zone spans in a node, including holes
  * present_pages = zone_spanned_pages_in_node() - zone_absent_pages_in_node()
  */
-unsigned long __meminit zone_spanned_pages_in_node(int nid,
+static unsigned long __meminit zone_spanned_pages_in_node(int nid,
                                        unsigned long zone_type,
                                        unsigned long *ignored)
 {
@@ -2519,7 +2758,7 @@ unsigned long __init absent_pages_in_range(unsigned long start_pfn,
 }
 
 /* Return the number of page frames in holes in a zone on a node */
-unsigned long __meminit zone_absent_pages_in_node(int nid,
+static unsigned long __meminit zone_absent_pages_in_node(int nid,
                                        unsigned long zone_type,
                                        unsigned long *ignored)
 {
@@ -2536,14 +2775,14 @@ unsigned long __meminit zone_absent_pages_in_node(int nid,
 }
 
 #else
-static inline unsigned long zone_spanned_pages_in_node(int nid,
+static inline unsigned long __meminit zone_spanned_pages_in_node(int nid,
                                        unsigned long zone_type,
                                        unsigned long *zones_size)
 {
        return zones_size[zone_type];
 }
 
-static inline unsigned long zone_absent_pages_in_node(int nid,
+static inline unsigned long __meminit zone_absent_pages_in_node(int nid,
                                                unsigned long zone_type,
                                                unsigned long *zholes_size)
 {
@@ -3355,13 +3594,28 @@ void *__init alloc_large_system_hash(const char *tablename,
                        for (order = 0; ((1UL << order) << PAGE_SHIFT) < size; order++)
                                ;
                        table = (void*) __get_free_pages(GFP_ATOMIC, order);
+                       /*
+                        * If bucketsize is not a power-of-two, we may free
+                        * some pages at the end of hash table.
+                        */
+                       if (table) {
+                               unsigned long alloc_end = (unsigned long)table +
+                                               (PAGE_SIZE << order);
+                               unsigned long used = (unsigned long)table +
+                                               PAGE_ALIGN(size);
+                               split_page(virt_to_page(table), order);
+                               while (used < alloc_end) {
+                                       free_page(used);
+                                       used += PAGE_SIZE;
+                               }
+                       }
                }
        } while (!table && size > PAGE_SIZE && --log2qty);
 
        if (!table)
                panic("Failed to allocate %s hash table\n", tablename);
 
-       printk("%s hash table entries: %d (order: %d, %lu bytes)\n",
+       printk(KERN_INFO "%s hash table entries: %d (order: %d, %lu bytes)\n",
               tablename,
               (1U << log2qty),
               ilog2(size) - PAGE_SHIFT,
index b344e67071280c9df522ef77f56ffa62ed1b4d63..a453383333fc02f4c9bfc342bedb88eeb454f685 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -929,7 +929,7 @@ static void next_reap_node(void)
  * the CPUs getting into lockstep and contending for the global cache chain
  * lock.
  */
-static void __devinit start_cpu_timer(int cpu)
+static void __cpuinit start_cpu_timer(int cpu)
 {
        struct delayed_work *reap_work = &per_cpu(reap_work, cpu);
 
@@ -4157,26 +4157,17 @@ static void print_slabinfo_header(struct seq_file *m)
 static void *s_start(struct seq_file *m, loff_t *pos)
 {
        loff_t n = *pos;
-       struct list_head *p;
 
        mutex_lock(&cache_chain_mutex);
        if (!n)
                print_slabinfo_header(m);
-       p = cache_chain.next;
-       while (n--) {
-               p = p->next;
-               if (p == &cache_chain)
-                       return NULL;
-       }
-       return list_entry(p, struct kmem_cache, next);
+
+       return seq_list_start(&cache_chain, *pos);
 }
 
 static void *s_next(struct seq_file *m, void *p, loff_t *pos)
 {
-       struct kmem_cache *cachep = p;
-       ++*pos;
-       return cachep->next.next == &cache_chain ?
-               NULL : list_entry(cachep->next.next, struct kmem_cache, next);
+       return seq_list_next(p, &cache_chain, pos);
 }
 
 static void s_stop(struct seq_file *m, void *p)
@@ -4186,7 +4177,7 @@ static void s_stop(struct seq_file *m, void *p)
 
 static int s_show(struct seq_file *m, void *p)
 {
-       struct kmem_cache *cachep = p;
+       struct kmem_cache *cachep = list_entry(p, struct kmem_cache, next);
        struct slab *slabp;
        unsigned long active_objs;
        unsigned long num_objs;
@@ -4355,17 +4346,8 @@ ssize_t slabinfo_write(struct file *file, const char __user * buffer,
 
 static void *leaks_start(struct seq_file *m, loff_t *pos)
 {
-       loff_t n = *pos;
-       struct list_head *p;
-
        mutex_lock(&cache_chain_mutex);
-       p = cache_chain.next;
-       while (n--) {
-               p = p->next;
-               if (p == &cache_chain)
-                       return NULL;
-       }
-       return list_entry(p, struct kmem_cache, next);
+       return seq_list_start(&cache_chain, *pos);
 }
 
 static inline int add_caller(unsigned long *n, unsigned long v)
@@ -4430,7 +4412,7 @@ static void show_symbol(struct seq_file *m, unsigned long address)
 
 static int leaks_show(struct seq_file *m, void *p)
 {
-       struct kmem_cache *cachep = p;
+       struct kmem_cache *cachep = list_entry(p, struct kmem_cache, next);
        struct slab *slabp;
        struct kmem_list3 *l3;
        const char *name;
index 71976c5d40d301373ea9bc3f807553dde819c195..b4899079d8b00e32660f8c36437c3b558bef4823 100644 (file)
--- a/mm/slob.c
+++ b/mm/slob.c
  *
  * Matt Mackall <mpm@selenic.com> 12/30/03
  *
+ * NUMA support by Paul Mundt, 2007.
+ *
  * How SLOB works:
  *
  * The core of SLOB is a traditional K&R style heap allocator, with
  * support for returning aligned objects. The granularity of this
- * allocator is 8 bytes on x86, though it's perhaps possible to reduce
- * this to 4 if it's deemed worth the effort. The slob heap is a
- * singly-linked list of pages from __get_free_page, grown on demand
- * and allocation from the heap is currently first-fit.
+ * allocator is as little as 2 bytes, however typically most architectures
+ * will require 4 bytes on 32-bit and 8 bytes on 64-bit.
+ *
+ * The slob heap is a linked list of pages from alloc_pages(), and
+ * within each page, there is a singly-linked list of free blocks (slob_t).
+ * The heap is grown on demand and allocation from the heap is currently
+ * first-fit.
  *
  * Above this is an implementation of kmalloc/kfree. Blocks returned
- * from kmalloc are 8-byte aligned and prepended with a 8-byte header.
+ * from kmalloc are prepended with a 4-byte header with the kmalloc size.
  * If kmalloc is asked for objects of PAGE_SIZE or larger, it calls
- * __get_free_pages directly so that it can return page-aligned blocks
- * and keeps a linked list of such pages and their orders. These
- * objects are detected in kfree() by their page alignment.
+ * alloc_pages() directly, allocating compound pages so the page order
+ * does not have to be separately tracked, and also stores the exact
+ * allocation size in page->private so that it can be used to accurately
+ * provide ksize(). These objects are detected in kfree() because slob_page()
+ * is false for them.
  *
  * SLAB is emulated on top of SLOB by simply calling constructors and
- * destructors for every SLAB allocation. Objects are returned with
- * the 8-byte alignment unless the SLAB_HWCACHE_ALIGN flag is
- * set, in which case the low-level allocator will fragment blocks to
- * create the proper alignment. Again, objects of page-size or greater
- * are allocated by calling __get_free_pages. As SLAB objects know
- * their size, no separate size bookkeeping is necessary and there is
- * essentially no allocation space overhead.
+ * destructors for every SLAB allocation. Objects are returned with the
+ * 4-byte alignment unless the SLAB_HWCACHE_ALIGN flag is set, in which
+ * case the low-level allocator will fragment blocks to create the proper
+ * alignment. Again, objects of page-size or greater are allocated by
+ * calling alloc_pages(). As SLAB objects know their size, no separate
+ * size bookkeeping is necessary and there is essentially no allocation
+ * space overhead, and compound pages aren't needed for multi-page
+ * allocations.
+ *
+ * NUMA support in SLOB is fairly simplistic, pushing most of the real
+ * logic down to the page allocator, and simply doing the node accounting
+ * on the upper levels. In the event that a node id is explicitly
+ * provided, alloc_pages_node() with the specified node id is used
+ * instead. The common case (or when the node id isn't explicitly provided)
+ * will default to the current node, as per numa_node_id().
+ *
+ * Node aware pages are still inserted in to the global freelist, and
+ * these are scanned for by matching against the node id encoded in the
+ * page flags. As a result, block allocations that can be satisfied from
+ * the freelist will only be done so on pages residing on the same node,
+ * in order to prevent random node placement.
  */
 
+#include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/mm.h>
 #include <linux/cache.h>
 #include <linux/init.h>
 #include <linux/module.h>
-#include <linux/timer.h>
 #include <linux/rcupdate.h>
+#include <linux/list.h>
+#include <asm/atomic.h>
+
+/*
+ * slob_block has a field 'units', which indicates size of block if +ve,
+ * or offset of next block if -ve (in SLOB_UNITs).
+ *
+ * Free blocks of size 1 unit simply contain the offset of the next block.
+ * Those with larger size contain their size in the first SLOB_UNIT of
+ * memory, and the offset of the next free block in the second SLOB_UNIT.
+ */
+#if PAGE_SIZE <= (32767 * 2)
+typedef s16 slobidx_t;
+#else
+typedef s32 slobidx_t;
+#endif
 
 struct slob_block {
-       int units;
-       struct slob_block *next;
+       slobidx_t units;
 };
 typedef struct slob_block slob_t;
 
+/*
+ * We use struct page fields to manage some slob allocation aspects,
+ * however to avoid the horrible mess in include/linux/mm_types.h, we'll
+ * just define our own struct page type variant here.
+ */
+struct slob_page {
+       union {
+               struct {
+                       unsigned long flags;    /* mandatory */
+                       atomic_t _count;        /* mandatory */
+                       slobidx_t units;        /* free units left in page */
+                       unsigned long pad[2];
+                       slob_t *free;           /* first free slob_t in page */
+                       struct list_head list;  /* linked list of free pages */
+               };
+               struct page page;
+       };
+};
+static inline void struct_slob_page_wrong_size(void)
+{ BUILD_BUG_ON(sizeof(struct slob_page) != sizeof(struct page)); }
+
+/*
+ * free_slob_page: call before a slob_page is returned to the page allocator.
+ */
+static inline void free_slob_page(struct slob_page *sp)
+{
+       reset_page_mapcount(&sp->page);
+       sp->page.mapping = NULL;
+}
+
+/*
+ * All (partially) free slob pages go on this list.
+ */
+static LIST_HEAD(free_slob_pages);
+
+/*
+ * slob_page: True for all slob pages (false for bigblock pages)
+ */
+static inline int slob_page(struct slob_page *sp)
+{
+       return test_bit(PG_active, &sp->flags);
+}
+
+static inline void set_slob_page(struct slob_page *sp)
+{
+       __set_bit(PG_active, &sp->flags);
+}
+
+static inline void clear_slob_page(struct slob_page *sp)
+{
+       __clear_bit(PG_active, &sp->flags);
+}
+
+/*
+ * slob_page_free: true for pages on free_slob_pages list.
+ */
+static inline int slob_page_free(struct slob_page *sp)
+{
+       return test_bit(PG_private, &sp->flags);
+}
+
+static inline void set_slob_page_free(struct slob_page *sp)
+{
+       list_add(&sp->list, &free_slob_pages);
+       __set_bit(PG_private, &sp->flags);
+}
+
+static inline void clear_slob_page_free(struct slob_page *sp)
+{
+       list_del(&sp->list);
+       __clear_bit(PG_private, &sp->flags);
+}
+
 #define SLOB_UNIT sizeof(slob_t)
 #define SLOB_UNITS(size) (((size) + SLOB_UNIT - 1)/SLOB_UNIT)
 #define SLOB_ALIGN L1_CACHE_BYTES
 
-struct bigblock {
-       int order;
-       void *pages;
-       struct bigblock *next;
-};
-typedef struct bigblock bigblock_t;
-
 /*
  * struct slob_rcu is inserted at the tail of allocated slob blocks, which
  * were created with a SLAB_DESTROY_BY_RCU slab. slob_rcu is used to free
@@ -64,133 +166,285 @@ struct slob_rcu {
        int size;
 };
 
-static slob_t arena = { .next = &arena, .units = 1 };
-static slob_t *slobfree = &arena;
-static bigblock_t *bigblocks;
+/*
+ * slob_lock protects all slob allocator structures.
+ */
 static DEFINE_SPINLOCK(slob_lock);
-static DEFINE_SPINLOCK(block_lock);
 
-static void slob_free(void *b, int size);
-static void slob_timer_cbk(void);
+/*
+ * Encode the given size and next info into a free slob block s.
+ */
+static void set_slob(slob_t *s, slobidx_t size, slob_t *next)
+{
+       slob_t *base = (slob_t *)((unsigned long)s & PAGE_MASK);
+       slobidx_t offset = next - base;
 
+       if (size > 1) {
+               s[0].units = size;
+               s[1].units = offset;
+       } else
+               s[0].units = -offset;
+}
 
-static void *slob_alloc(size_t size, gfp_t gfp, int align)
+/*
+ * Return the size of a slob block.
+ */
+static slobidx_t slob_units(slob_t *s)
+{
+       if (s->units > 0)
+               return s->units;
+       return 1;
+}
+
+/*
+ * Return the next free slob block pointer after this one.
+ */
+static slob_t *slob_next(slob_t *s)
+{
+       slob_t *base = (slob_t *)((unsigned long)s & PAGE_MASK);
+       slobidx_t next;
+
+       if (s[0].units < 0)
+               next = -s[0].units;
+       else
+               next = s[1].units;
+       return base+next;
+}
+
+/*
+ * Returns true if s is the last free block in its page.
+ */
+static int slob_last(slob_t *s)
+{
+       return !((unsigned long)slob_next(s) & ~PAGE_MASK);
+}
+
+static void *slob_new_page(gfp_t gfp, int order, int node)
+{
+       void *page;
+
+#ifdef CONFIG_NUMA
+       if (node != -1)
+               page = alloc_pages_node(node, gfp, order);
+       else
+#endif
+               page = alloc_pages(gfp, order);
+
+       if (!page)
+               return NULL;
+
+       return page_address(page);
+}
+
+/*
+ * Allocate a slob block within a given slob_page sp.
+ */
+static void *slob_page_alloc(struct slob_page *sp, size_t size, int align)
 {
        slob_t *prev, *cur, *aligned = 0;
        int delta = 0, units = SLOB_UNITS(size);
-       unsigned long flags;
 
-       spin_lock_irqsave(&slob_lock, flags);
-       prev = slobfree;
-       for (cur = prev->next; ; prev = cur, cur = cur->next) {
+       for (prev = NULL, cur = sp->free; ; prev = cur, cur = slob_next(cur)) {
+               slobidx_t avail = slob_units(cur);
+
                if (align) {
                        aligned = (slob_t *)ALIGN((unsigned long)cur, align);
                        delta = aligned - cur;
                }
-               if (cur->units >= units + delta) { /* room enough? */
+               if (avail >= units + delta) { /* room enough? */
+                       slob_t *next;
+
                        if (delta) { /* need to fragment head to align? */
-                               aligned->units = cur->units - delta;
-                               aligned->next = cur->next;
-                               cur->next = aligned;
-                               cur->units = delta;
+                               next = slob_next(cur);
+                               set_slob(aligned, avail - delta, next);
+                               set_slob(cur, delta, aligned);
                                prev = cur;
                                cur = aligned;
+                               avail = slob_units(cur);
                        }
 
-                       if (cur->units == units) /* exact fit? */
-                               prev->next = cur->next; /* unlink */
-                       else { /* fragment */
-                               prev->next = cur + units;
-                               prev->next->units = cur->units - units;
-                               prev->next->next = cur->next;
-                               cur->units = units;
+                       next = slob_next(cur);
+                       if (avail == units) { /* exact fit? unlink. */
+                               if (prev)
+                                       set_slob(prev, slob_units(prev), next);
+                               else
+                                       sp->free = next;
+                       } else { /* fragment */
+                               if (prev)
+                                       set_slob(prev, slob_units(prev), cur + units);
+                               else
+                                       sp->free = cur + units;
+                               set_slob(cur + units, avail - units, next);
                        }
 
-                       slobfree = prev;
-                       spin_unlock_irqrestore(&slob_lock, flags);
+                       sp->units -= units;
+                       if (!sp->units)
+                               clear_slob_page_free(sp);
                        return cur;
                }
-               if (cur == slobfree) {
-                       spin_unlock_irqrestore(&slob_lock, flags);
-
-                       if (size == PAGE_SIZE) /* trying to shrink arena? */
-                               return 0;
+               if (slob_last(cur))
+                       return NULL;
+       }
+}
 
-                       cur = (slob_t *)__get_free_page(gfp);
-                       if (!cur)
-                               return 0;
+/*
+ * slob_alloc: entry point into the slob allocator.
+ */
+static void *slob_alloc(size_t size, gfp_t gfp, int align, int node)
+{
+       struct slob_page *sp;
+       slob_t *b = NULL;
+       unsigned long flags;
 
-                       slob_free(cur, PAGE_SIZE);
-                       spin_lock_irqsave(&slob_lock, flags);
-                       cur = slobfree;
+       spin_lock_irqsave(&slob_lock, flags);
+       /* Iterate through each partially free page, try to find room */
+       list_for_each_entry(sp, &free_slob_pages, list) {
+#ifdef CONFIG_NUMA
+               /*
+                * If there's a node specification, search for a partial
+                * page with a matching node id in the freelist.
+                */
+               if (node != -1 && page_to_nid(&sp->page) != node)
+                       continue;
+#endif
+
+               if (sp->units >= SLOB_UNITS(size)) {
+                       b = slob_page_alloc(sp, size, align);
+                       if (b)
+                               break;
                }
        }
+       spin_unlock_irqrestore(&slob_lock, flags);
+
+       /* Not enough space: must allocate a new page */
+       if (!b) {
+               b = slob_new_page(gfp, 0, node);
+               if (!b)
+                       return 0;
+               sp = (struct slob_page *)virt_to_page(b);
+               set_slob_page(sp);
+
+               spin_lock_irqsave(&slob_lock, flags);
+               sp->units = SLOB_UNITS(PAGE_SIZE);
+               sp->free = b;
+               INIT_LIST_HEAD(&sp->list);
+               set_slob(b, SLOB_UNITS(PAGE_SIZE), b + SLOB_UNITS(PAGE_SIZE));
+               set_slob_page_free(sp);
+               b = slob_page_alloc(sp, size, align);
+               BUG_ON(!b);
+               spin_unlock_irqrestore(&slob_lock, flags);
+       }
+       return b;
 }
 
+/*
+ * slob_free: entry point into the slob allocator.
+ */
 static void slob_free(void *block, int size)
 {
-       slob_t *cur, *b = (slob_t *)block;
+       struct slob_page *sp;
+       slob_t *prev, *next, *b = (slob_t *)block;
+       slobidx_t units;
        unsigned long flags;
 
        if (!block)
                return;
+       BUG_ON(!size);
 
-       if (size)
-               b->units = SLOB_UNITS(size);
+       sp = (struct slob_page *)virt_to_page(block);
+       units = SLOB_UNITS(size);
 
-       /* Find reinsertion point */
        spin_lock_irqsave(&slob_lock, flags);
-       for (cur = slobfree; !(b > cur && b < cur->next); cur = cur->next)
-               if (cur >= cur->next && (b > cur || b < cur->next))
-                       break;
 
-       if (b + b->units == cur->next) {
-               b->units += cur->next->units;
-               b->next = cur->next->next;
-       } else
-               b->next = cur->next;
+       if (sp->units + units == SLOB_UNITS(PAGE_SIZE)) {
+               /* Go directly to page allocator. Do not pass slob allocator */
+               if (slob_page_free(sp))
+                       clear_slob_page_free(sp);
+               clear_slob_page(sp);
+               free_slob_page(sp);
+               free_page((unsigned long)b);
+               goto out;
+       }
 
-       if (cur + cur->units == b) {
-               cur->units += b->units;
-               cur->next = b->next;
-       } else
-               cur->next = b;
+       if (!slob_page_free(sp)) {
+               /* This slob page is about to become partially free. Easy! */
+               sp->units = units;
+               sp->free = b;
+               set_slob(b, units,
+                       (void *)((unsigned long)(b +
+                                       SLOB_UNITS(PAGE_SIZE)) & PAGE_MASK));
+               set_slob_page_free(sp);
+               goto out;
+       }
 
-       slobfree = cur;
+       /*
+        * Otherwise the page is already partially free, so find reinsertion
+        * point.
+        */
+       sp->units += units;
 
+       if (b < sp->free) {
+               set_slob(b, units, sp->free);
+               sp->free = b;
+       } else {
+               prev = sp->free;
+               next = slob_next(prev);
+               while (b > next) {
+                       prev = next;
+                       next = slob_next(prev);
+               }
+
+               if (!slob_last(prev) && b + units == next) {
+                       units += slob_units(next);
+                       set_slob(b, units, slob_next(next));
+               } else
+                       set_slob(b, units, next);
+
+               if (prev + slob_units(prev) == b) {
+                       units = slob_units(b) + slob_units(prev);
+                       set_slob(prev, units, slob_next(b));
+               } else
+                       set_slob(prev, slob_units(prev), b);
+       }
+out:
        spin_unlock_irqrestore(&slob_lock, flags);
 }
 
-void *__kmalloc(size_t size, gfp_t gfp)
-{
-       slob_t *m;
-       bigblock_t *bb;
-       unsigned long flags;
+/*
+ * End of slob allocator proper. Begin kmem_cache_alloc and kmalloc frontend.
+ */
 
-       if (size < PAGE_SIZE - SLOB_UNIT) {
-               m = slob_alloc(size + SLOB_UNIT, gfp, 0);
-               return m ? (void *)(m + 1) : 0;
-       }
+#ifndef ARCH_KMALLOC_MINALIGN
+#define ARCH_KMALLOC_MINALIGN __alignof__(unsigned long)
+#endif
 
-       bb = slob_alloc(sizeof(bigblock_t), gfp, 0);
-       if (!bb)
-               return 0;
+#ifndef ARCH_SLAB_MINALIGN
+#define ARCH_SLAB_MINALIGN __alignof__(unsigned long)
+#endif
 
-       bb->order = get_order(size);
-       bb->pages = (void *)__get_free_pages(gfp, bb->order);
+void *__kmalloc_node(size_t size, gfp_t gfp, int node)
+{
+       int align = max(ARCH_KMALLOC_MINALIGN, ARCH_SLAB_MINALIGN);
+
+       if (size < PAGE_SIZE - align) {
+               unsigned int *m;
+               m = slob_alloc(size + align, gfp, align, node);
+               if (m)
+                       *m = size;
+               return (void *)m + align;
+       } else {
+               void *ret;
 
-       if (bb->pages) {
-               spin_lock_irqsave(&block_lock, flags);
-               bb->next = bigblocks;
-               bigblocks = bb;
-               spin_unlock_irqrestore(&block_lock, flags);
-               return bb->pages;
+               ret = slob_new_page(gfp | __GFP_COMP, get_order(size), node);
+               if (ret) {
+                       struct page *page;
+                       page = virt_to_page(ret);
+                       page->private = size;
+               }
+               return ret;
        }
-
-       slob_free(bb, sizeof(bigblock_t));
-       return 0;
 }
-EXPORT_SYMBOL(__kmalloc);
+EXPORT_SYMBOL(__kmalloc_node);
 
 /**
  * krealloc - reallocate memory. The contents will remain unchanged.
@@ -227,52 +481,34 @@ EXPORT_SYMBOL(krealloc);
 
 void kfree(const void *block)
 {
-       bigblock_t *bb, **last = &bigblocks;
-       unsigned long flags;
+       struct slob_page *sp;
 
        if (!block)
                return;
 
-       if (!((unsigned long)block & (PAGE_SIZE-1))) {
-               /* might be on the big block list */
-               spin_lock_irqsave(&block_lock, flags);
-               for (bb = bigblocks; bb; last = &bb->next, bb = bb->next) {
-                       if (bb->pages == block) {
-                               *last = bb->next;
-                               spin_unlock_irqrestore(&block_lock, flags);
-                               free_pages((unsigned long)block, bb->order);
-                               slob_free(bb, sizeof(bigblock_t));
-                               return;
-                       }
-               }
-               spin_unlock_irqrestore(&block_lock, flags);
-       }
-
-       slob_free((slob_t *)block - 1, 0);
-       return;
+       sp = (struct slob_page *)virt_to_page(block);
+       if (slob_page(sp)) {
+               int align = max(ARCH_KMALLOC_MINALIGN, ARCH_SLAB_MINALIGN);
+               unsigned int *m = (unsigned int *)(block - align);
+               slob_free(m, *m + align);
+       } else
+               put_page(&sp->page);
 }
-
 EXPORT_SYMBOL(kfree);
 
+/* can't use ksize for kmem_cache_alloc memory, only kmalloc */
 size_t ksize(const void *block)
 {
-       bigblock_t *bb;
-       unsigned long flags;
+       struct slob_page *sp;
 
        if (!block)
                return 0;
 
-       if (!((unsigned long)block & (PAGE_SIZE-1))) {
-               spin_lock_irqsave(&block_lock, flags);
-               for (bb = bigblocks; bb; bb = bb->next)
-                       if (bb->pages == block) {
-                               spin_unlock_irqrestore(&slob_lock, flags);
-                               return PAGE_SIZE << bb->order;
-                       }
-               spin_unlock_irqrestore(&block_lock, flags);
-       }
-
-       return ((slob_t *)block - 1)->units * SLOB_UNIT;
+       sp = (struct slob_page *)virt_to_page(block);
+       if (slob_page(sp))
+               return ((slob_t *)block - 1)->units + SLOB_UNIT;
+       else
+               return sp->page.private;
 }
 
 struct kmem_cache {
@@ -289,7 +525,7 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size,
 {
        struct kmem_cache *c;
 
-       c = slob_alloc(sizeof(struct kmem_cache), flags, 0);
+       c = slob_alloc(sizeof(struct kmem_cache), flags, 0, -1);
 
        if (c) {
                c->name = name;
@@ -302,6 +538,8 @@ struct kmem_cache *kmem_cache_create(const char *name, size_t size,
                c->ctor = ctor;
                /* ignore alignment unless it's forced */
                c->align = (flags & SLAB_HWCACHE_ALIGN) ? SLOB_ALIGN : 0;
+               if (c->align < ARCH_SLAB_MINALIGN)
+                       c->align = ARCH_SLAB_MINALIGN;
                if (c->align < align)
                        c->align = align;
        } else if (flags & SLAB_PANIC)
@@ -317,21 +555,21 @@ void kmem_cache_destroy(struct kmem_cache *c)
 }
 EXPORT_SYMBOL(kmem_cache_destroy);
 
-void *kmem_cache_alloc(struct kmem_cache *c, gfp_t flags)
+void *kmem_cache_alloc_node(struct kmem_cache *c, gfp_t flags, int node)
 {
        void *b;
 
        if (c->size < PAGE_SIZE)
-               b = slob_alloc(c->size, flags, c->align);
+               b = slob_alloc(c->size, flags, c->align, node);
        else
-               b = (void *)__get_free_pages(flags, get_order(c->size));
+               b = slob_new_page(flags, get_order(c->size), node);
 
        if (c->ctor)
                c->ctor(b, c, 0);
 
        return b;
 }
-EXPORT_SYMBOL(kmem_cache_alloc);
+EXPORT_SYMBOL(kmem_cache_alloc_node);
 
 void *kmem_cache_zalloc(struct kmem_cache *c, gfp_t flags)
 {
@@ -385,9 +623,6 @@ const char *kmem_cache_name(struct kmem_cache *c)
 }
 EXPORT_SYMBOL(kmem_cache_name);
 
-static struct timer_list slob_timer = TIMER_INITIALIZER(
-       (void (*)(unsigned long))slob_timer_cbk, 0, 0);
-
 int kmem_cache_shrink(struct kmem_cache *d)
 {
        return 0;
@@ -399,17 +634,14 @@ int kmem_ptr_validate(struct kmem_cache *a, const void *b)
        return 0;
 }
 
-void __init kmem_cache_init(void)
+static unsigned int slob_ready __read_mostly;
+
+int slab_is_available(void)
 {
-       slob_timer_cbk();
+       return slob_ready;
 }
 
-static void slob_timer_cbk(void)
+void __init kmem_cache_init(void)
 {
-       void *p = slob_alloc(PAGE_SIZE, 0, PAGE_SIZE-1);
-
-       if (p)
-               free_page((unsigned long)p);
-
-       mod_timer(&slob_timer, jiffies + HZ);
+       slob_ready = 1;
 }
index e0cf6213abc0fcfcd403c5d9ad0da079ad2214f9..6aea48942c29b3e2ada3a551d5382cc88e474539 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -323,7 +323,11 @@ static inline int slab_index(void *p, struct kmem_cache *s, void *addr)
 /*
  * Debug settings:
  */
+#ifdef CONFIG_SLUB_DEBUG_ON
+static int slub_debug = DEBUG_DEFAULT_FLAGS;
+#else
 static int slub_debug;
+#endif
 
 static char *slub_debug_slabs;
 
@@ -888,38 +892,57 @@ fail:
 
 static int __init setup_slub_debug(char *str)
 {
-       if (!str || *str != '=')
-               slub_debug = DEBUG_DEFAULT_FLAGS;
-       else {
-               str++;
-               if (*str == 0 || *str == ',')
-                       slub_debug = DEBUG_DEFAULT_FLAGS;
-               else
-               for( ;*str && *str != ','; str++)
-                       switch (*str) {
-                       case 'f' : case 'F' :
-                               slub_debug |= SLAB_DEBUG_FREE;
-                               break;
-                       case 'z' : case 'Z' :
-                               slub_debug |= SLAB_RED_ZONE;
-                               break;
-                       case 'p' : case 'P' :
-                               slub_debug |= SLAB_POISON;
-                               break;
-                       case 'u' : case 'U' :
-                               slub_debug |= SLAB_STORE_USER;
-                               break;
-                       case 't' : case 'T' :
-                               slub_debug |= SLAB_TRACE;
-                               break;
-                       default:
-                               printk(KERN_ERR "slub_debug option '%c' "
-                                       "unknown. skipped\n",*str);
-                       }
+       slub_debug = DEBUG_DEFAULT_FLAGS;
+       if (*str++ != '=' || !*str)
+               /*
+                * No options specified. Switch on full debugging.
+                */
+               goto out;
+
+       if (*str == ',')
+               /*
+                * No options but restriction on slabs. This means full
+                * debugging for slabs matching a pattern.
+                */
+               goto check_slabs;
+
+       slub_debug = 0;
+       if (*str == '-')
+               /*
+                * Switch off all debugging measures.
+                */
+               goto out;
+
+       /*
+        * Determine which debug features should be switched on
+        */
+       for ( ;*str && *str != ','; str++) {
+               switch (tolower(*str)) {
+               case 'f':
+                       slub_debug |= SLAB_DEBUG_FREE;
+                       break;
+               case 'z':
+                       slub_debug |= SLAB_RED_ZONE;
+                       break;
+               case 'p':
+                       slub_debug |= SLAB_POISON;
+                       break;
+               case 'u':
+                       slub_debug |= SLAB_STORE_USER;
+                       break;
+               case 't':
+                       slub_debug |= SLAB_TRACE;
+                       break;
+               default:
+                       printk(KERN_ERR "slub_debug option '%c' "
+                               "unknown. skipped\n",*str);
+               }
        }
 
+check_slabs:
        if (*str == ',')
                slub_debug_slabs = str + 1;
+out:
        return 1;
 }
 
index 5f7cf2a4cb55f8e9a106776b8d45ec5433c6991e..925d5c50f18d0fd401037c339ff0d72660b79eac 100644 (file)
@@ -21,7 +21,7 @@
 
 /*
  * swapper_space is a fiction, retained to simplify the path through
- * vmscan's shrink_list, to make sync_page look nicer, and to allow
+ * vmscan's shrink_page_list, to make sync_page look nicer, and to allow
  * future use of radix_tree tags in the swap cache.
  */
 static const struct address_space_operations swap_aops = {
index acc172cbe3aa12781cd1d66c4dfde5cf7d929eec..7ff0a81c7b016fc6957288c342eebdd697d020dc 100644 (file)
@@ -885,7 +885,7 @@ static int try_to_unuse(unsigned int type)
                /*
                 * So we could skip searching mms once swap count went
                 * to 1, we did not mark any present ptes as dirty: must
-                * mark page dirty so shrink_list will preserve it.
+                * mark page dirty so shrink_page_list will preserve it.
                 */
                SetPageDirty(page);
                unlock_page(page);
index 4fbe1a2da5fb973acc352b1b17d87ca390aab376..7c994f2d614519df007e16eb93f1a8a393589a2e 100644 (file)
@@ -253,21 +253,8 @@ void truncate_inode_pages(struct address_space *mapping, loff_t lstart)
 }
 EXPORT_SYMBOL(truncate_inode_pages);
 
-/**
- * invalidate_mapping_pages - Invalidate all the unlocked pages of one inode
- * @mapping: the address_space which holds the pages to invalidate
- * @start: the offset 'from' which to invalidate
- * @end: the offset 'to' which to invalidate (inclusive)
- *
- * This function only removes the unlocked pages, if you want to
- * remove all the pages of one inode, you must call truncate_inode_pages.
- *
- * invalidate_mapping_pages() will not block on IO activity. It will not
- * invalidate pages which are dirty, locked, under writeback or mapped into
- * pagetables.
- */
-unsigned long invalidate_mapping_pages(struct address_space *mapping,
-                               pgoff_t start, pgoff_t end)
+unsigned long __invalidate_mapping_pages(struct address_space *mapping,
+                               pgoff_t start, pgoff_t end, bool be_atomic)
 {
        struct pagevec pvec;
        pgoff_t next = start;
@@ -308,17 +295,38 @@ unlock:
                                break;
                }
                pagevec_release(&pvec);
+               if (likely(!be_atomic))
+                       cond_resched();
        }
        return ret;
 }
+
+/**
+ * invalidate_mapping_pages - Invalidate all the unlocked pages of one inode
+ * @mapping: the address_space which holds the pages to invalidate
+ * @start: the offset 'from' which to invalidate
+ * @end: the offset 'to' which to invalidate (inclusive)
+ *
+ * This function only removes the unlocked pages, if you want to
+ * remove all the pages of one inode, you must call truncate_inode_pages.
+ *
+ * invalidate_mapping_pages() will not block on IO activity. It will not
+ * invalidate pages which are dirty, locked, under writeback or mapped into
+ * pagetables.
+ */
+unsigned long invalidate_mapping_pages(struct address_space *mapping,
+                               pgoff_t start, pgoff_t end)
+{
+       return __invalidate_mapping_pages(mapping, start, end, false);
+}
 EXPORT_SYMBOL(invalidate_mapping_pages);
 
 /*
  * This is like invalidate_complete_page(), except it ignores the page's
  * refcount.  We do this because invalidate_inode_pages2() needs stronger
  * invalidation guarantees, and cannot afford to leave pages behind because
- * shrink_list() has a temp ref on them, or because they're transiently sitting
- * in the lru_cache_add() pagevecs.
+ * shrink_page_list() has a temp ref on them, or because they're transiently
+ * sitting in the lru_cache_add() pagevecs.
  */
 static int
 invalidate_complete_page2(struct address_space *mapping, struct page *page)
index 9a0f5f2b90c80653acbe2282d3820e8502307429..d74d82155d78e20cd008a289751bcaca70b27f7a 100644 (file)
@@ -276,7 +276,8 @@ void scm_detach_fds_compat(struct msghdr *kmsg, struct scm_cookie *scm)
                err = security_file_receive(fp[i]);
                if (err)
                        break;
-               err = get_unused_fd();
+               err = get_unused_fd_flags(MSG_CMSG_CLOEXEC & kmsg->msg_flags
+                                         ? O_CLOEXEC : 0);
                if (err < 0)
                        break;
                new_fd = err;
index 292ad8d5ad76262c46fc33248376cd0401658722..44c4ec2c8769b1a922d69a6f0e5882bc6f58f001 100644 (file)
@@ -228,7 +228,8 @@ void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm)
                err = security_file_receive(fp[i]);
                if (err)
                        break;
-               err = get_unused_fd();
+               err = get_unused_fd_flags(MSG_CMSG_CLOEXEC & msg->msg_flags
+                                         ? O_CLOEXEC : 0);
                if (err < 0)
                        break;
                new_fd = err;
index 42f12bd65964e3223aa016bfbd044869a6a07a88..89dcc485653bd6601fb078130396d929c81d9038 100644 (file)
 #include "netlabel_cipso_v4.h"
 #include "netlabel_user.h"
 
-/* do not do any auditing if audit_enabled == 0, see kernel/audit.c for
- * details */
-extern int audit_enabled;
-
 /*
  * NetLabel NETLINK Setup Functions
  */
index f4530196a70a30c10f87450ad47bdfaa9e28f925..b7111425004656a3e35be074a2372af43da29e6c 100644 (file)
@@ -1939,9 +1939,7 @@ asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg,
        total_len = err;
 
        cmsg_ptr = (unsigned long)msg_sys.msg_control;
-       msg_sys.msg_flags = 0;
-       if (MSG_CMSG_COMPAT & flags)
-               msg_sys.msg_flags = MSG_CMSG_COMPAT;
+       msg_sys.msg_flags = flags & (MSG_CMSG_CLOEXEC|MSG_CMSG_COMPAT);
 
        if (sock->file->f_flags & O_NONBLOCK)
                flags |= MSG_DONTWAIT;
index baf4096d52d491733ce22d5c773820410e5c62af..abfda33bac64635a260e79ed2c5c1ce29fd5a53a 100644 (file)
@@ -43,6 +43,7 @@
 #include <linux/types.h>
 #include <linux/slab.h>
 #include <linux/sched.h>
+#include <linux/smp_lock.h>
 #include <linux/pagemap.h>
 #include <linux/sunrpc/clnt.h>
 #include <linux/sunrpc/auth.h>
index 277c32647f36d84dc805efcd33f7ac1449a31ed1..25e20a27fc59b79b4c42d63b284564dd36c1becf 100755 (executable)
@@ -9,7 +9,7 @@ use strict;
 my $P = $0;
 $P =~ s@.*/@@g;
 
-my $V = '0.06';
+my $V = '0.07';
 
 use Getopt::Long qw(:config no_auto_abbrev);
 
@@ -246,6 +246,19 @@ sub cat_vet {
        return $vet;
 }
 
+sub ERROR {
+       print "ERROR: $_[0]\n";
+       our $clean = 0;
+}
+sub WARN {
+       print "WARNING: $_[0]\n";
+       our $clean = 0;
+}
+sub CHK {
+       print "CHECK: $_[0]\n";
+       our $clean = 0;
+}
+
 sub process {
        my $filename = shift;
        my @lines = @_;
@@ -259,7 +272,7 @@ sub process {
        my $previndent=0;
        my $stashindent=0;
 
-       my $clean = 1;
+       our $clean = 1;
        my $signoff = 0;
        my $is_patch = 0;
 
@@ -290,8 +303,11 @@ sub process {
                                        long\s+int|
                                        long\s+long|
                                        long\s+long\s+int|
+                                       u8|u16|u32|u64|
+                                       s8|s16|s32|s64|
                                        struct\s+$Ident|
                                        union\s+$Ident|
+                                       enum\s+$Ident|
                                        ${Ident}_t
                                )
                                (?:\s+$Sparse)*
@@ -304,6 +320,23 @@ sub process {
        my $Declare     = qr{(?:$Storage\s+)?$Type};
        my $Attribute   = qr{__read_mostly|__init|__initdata};
 
+       # Pre-scan the patch looking for any __setup documentation.
+       my @setup_docs = ();
+       my $setup_docs = 0;
+       foreach my $line (@lines) {
+               if ($line=~/^\+\+\+\s+(\S+)/) {
+                       $setup_docs = 0;
+                       if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
+                               $setup_docs = 1;
+                       }
+                       next;
+               }
+
+               if ($setup_docs && $line =~ /^\+/) {
+                       push(@setup_docs, $line);
+               }
+       }
+
        foreach my $line (@lines) {
                $linenr++;
 
@@ -369,30 +402,42 @@ sub process {
                $here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
 
                my $hereline = "$here\n$line\n";
-               my $herecurr = "$here\n$line\n\n";
-               my $hereprev = "$here\n$prevline\n$line\n\n";
+               my $herecurr = "$here\n$line\n";
+               my $hereprev = "$here\n$prevline\n$line\n";
 
 #check the patch for a signoff:
                if ($line =~ /^\s*signed-off-by:/i) {
                        # This is a signoff, if ugly, so do not double report.
                        $signoff++;
                        if (!($line =~ /^\s*Signed-off-by:/)) {
-                               print "Signed-off-by: is the preferred form\n";
-                               print "$herecurr";
-                               $clean = 0;
+                               WARN("Signed-off-by: is the preferred form\n" .
+                                       $herecurr);
                        }
                        if ($line =~ /^\s*signed-off-by:\S/i) {
-                               print "need space after Signed-off-by:\n";
-                               print "$herecurr";
-                               $clean = 0;
+                               WARN("need space after Signed-off-by:\n" .
+                                       $herecurr);
                        }
                }
 
 # Check for wrappage within a valid hunk of the file
                if ($realcnt != 0 && $line !~ m{^(?:\+|-| |$)}) {
-                       print "patch seems to be corrupt (line wrapped?) [$realcnt]\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       ERROR("patch seems to be corrupt (line wrapped?)\n" .
+                               $herecurr);
+               }
+
+# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
+               if (($realfile =~ /^$/ || $line =~ /^\+/) &&
+                    !($line =~ m/^(
+                               [\x09\x0A\x0D\x20-\x7E]              # ASCII
+                               | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
+                               |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
+                               | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
+                               |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
+                               |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
+                               | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
+                               |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
+                               )*$/x )) {
+                       ERROR("Invalid UTF-8\n" . $herecurr);
                }
 
 #ignore lines being removed
@@ -403,16 +448,12 @@ sub process {
 
 #trailing whitespace
                if ($line =~ /^\+.*\S\s+$/ || $line =~ /^\+\s+$/) {
-                       my $herevet = "$here\n" . cat_vet($line) . "\n\n";
-                       print "trailing whitespace\n";
-                       print "$herevet";
-                       $clean = 0;
+                       my $herevet = "$here\n" . cat_vet($line) . "\n";
+                       ERROR("trailing whitespace\n" . $herevet);
                }
 #80 column limit
                if ($line =~ /^\+/ && !($prevline=~/\/\*\*/) && $length > 80) {
-                       print "line over 80 characters\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       WARN("line over 80 characters\n" . $herecurr);
                }
 
 # check we are in a valid source file *.[hc] if not then ignore this hunk
@@ -421,10 +462,8 @@ sub process {
 # at the beginning of a line any tabs must come first and anything
 # more than 8 must use tabs.
                if ($line=~/^\+\s* \t\s*\S/ or $line=~/^\+\s*        \s*/) {
-                       my $herevet = "$here\n" . cat_vet($line) . "\n\n";
-                       print "use tabs not spaces\n";
-                       print "$herevet";
-                       $clean = 0;
+                       my $herevet = "$here\n" . cat_vet($line) . "\n";
+                       ERROR("use tabs not spaces\n" . $herevet);
                }
 
                #
@@ -463,9 +502,27 @@ sub process {
                                }
                        }
                        if ($err ne '') {
-                               print "switch and case should be at the same indent\n";
-                               print "$here\n$line\n$err\n";
-                               $clean = 0;
+                               ERROR("switch and case should be at the same indent\n$hereline\n$err\n");
+                       }
+               }
+
+# if/while/etc brace do not go on next line, unless defining a do while loop,
+# or if that brace on the next line is for something else
+               if ($line =~ /\b(?:(if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.#/) {
+                       my @ctx = ctx_statement($linenr, $realcnt);
+                       my $ctx_ln = $linenr + $#ctx + 1;
+                       my $ctx_cnt = $realcnt - $#ctx - 1;
+                       my $ctx = join("\n", @ctx);
+
+                       while ($ctx_cnt > 0 && $lines[$ctx_ln - 1] =~ /^-/) {
+                               $ctx_ln++;
+                               $ctx_cnt--;
+                       }
+                       ##warn "line<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>";
+
+                       if ($ctx !~ /{\s*/ && $ctx_cnt > 0 && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
+                               ERROR("That { should be on the previous line\n" .
+                                       "$here\n$ctx\n$lines[$ctx_ln - 1]");
                        }
                }
 
@@ -474,9 +531,7 @@ sub process {
 
 # TEST: allow direct testing of the type matcher.
                if ($tst_type && $line =~ /^.$Declare$/) {
-                       print "TEST: is type $Declare\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       ERROR("TEST: is type $Declare\n" . $herecurr);
                        next;
                }
 
@@ -488,9 +543,8 @@ sub process {
                if ($rawline =~ m{^.#\s*include\s+[<"](.*)[">]}) {
                        my $path = $1;
                        if ($path =~ m{//}) {
-                               print "malformed #include filename\n";
-                               print "$herecurr";
-                               $clean = 0;
+                               ERROR("malformed #include filename\n" .
+                                       $herecurr);
                        }
                        # Sanitise this special form of string.
                        $path = 'X' x length($path);
@@ -499,9 +553,7 @@ sub process {
 
 # no C99 // comments
                if ($line =~ m{//}) {
-                       print "do not use C99 // comments\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       ERROR("do not use C99 // comments\n" . $herecurr);
                }
                # Remove C99 comments.
                $line =~ s@//.*@@;
@@ -514,49 +566,40 @@ sub process {
                           ($prevline !~ /^\+}/) &&
                           ($prevline !~ /^ }/) &&
                           ($prevline !~ /\s$name(?:\s+$Attribute)?\s*(?:;|=)/)) {
-                               print "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n";
-                               print "$herecurr";
-                               $clean = 0;
+                               WARN("EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
                        }
                }
 
 # check for static initialisers.
                if ($line=~/\s*static\s.*=\s+(0|NULL);/) {
-                       print "do not initialise statics to 0 or NULL\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       ERROR("do not initialise statics to 0 or NULL\n" .
+                               $herecurr);
                }
 
 # check for new typedefs, only function parameters and sparse annotations
 # make sense.
                if ($line =~ /\btypedef\s/ &&
-                   $line !~ /\btypedef\s+$Type\s+\(\s*$Ident\s*\)\s*\(/ &&
+                   $line !~ /\btypedef\s+$Type\s+\(\s*\*$Ident\s*\)\s*\(/ &&
                    $line !~ /\b__bitwise(?:__|)\b/) {
-                       print "do not add new typedefs\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       WARN("do not add new typedefs\n" . $herecurr);
                }
 
 # * goes on variable not on type
                if ($line =~ m{\($NonptrType(\*+)(?:\s+const)?\)}) {
-                       print "\"(foo$1)\" should be \"(foo $1)\"\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       ERROR("\"(foo$1)\" should be \"(foo $1)\"\n" .
+                               $herecurr);
 
                } elsif ($line =~ m{\($NonptrType\s+(\*+)(?!\s+const)\s+\)}) {
-                       print "\"(foo $1 )\" should be \"(foo $1)\"\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       ERROR("\"(foo $1 )\" should be \"(foo $1)\"\n" .
+                               $herecurr);
 
                } elsif ($line =~ m{$NonptrType(\*+)(?:\s+const)?\s+[A-Za-z\d_]+}) {
-                       print "\"foo$1 bar\" should be \"foo $1bar\"\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       ERROR("\"foo$1 bar\" should be \"foo $1bar\"\n" .
+                               $herecurr);
 
                } elsif ($line =~ m{$NonptrType\s+(\*+)(?!\s+const)\s+[A-Za-z\d_]+}) {
-                       print "\"foo $1 bar\" should be \"foo $1bar\"\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       ERROR("\"foo $1 bar\" should be \"foo $1bar\"\n" .
+                               $herecurr);
                }
 
 # # no BUG() or BUG_ON()
@@ -585,9 +628,7 @@ sub process {
                                }
                        }
                        if ($ok == 0) {
-                               print "printk() should include KERN_ facility level\n";
-                               print "$herecurr";
-                               $clean = 0;
+                               WARN("printk() should include KERN_ facility level\n" . $herecurr);
                        }
                }
 
@@ -595,9 +636,7 @@ sub process {
 # or if closed on same line
                if (($line=~/$Type\s*[A-Za-z\d_]+\(.*\).* {/) and
                    !($line=~/\#define.*do\s{/) and !($line=~/}/)) {
-                       print "braces following function declarations go on the next line\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       ERROR("open brace '{' following function declarations go on the next line\n" . $herecurr);
                }
 
 # Check operator spacing.
@@ -633,27 +672,27 @@ sub process {
                                }
 
                                # Pick up the preceeding and succeeding characters.
-                               my $ca = substr($opline, $off - 1, 1);
+                               my $ca = substr($opline, 0, $off);
                                my $cc = '';
                                if (length($opline) >= ($off + length($elements[$n + 1]))) {
                                        $cc = substr($opline, $off + length($elements[$n + 1]));
                                }
+                               my $cb = "$ca$;$cc";
 
                                my $ctx = "${a}x${c}";
 
                                my $at = "(ctx:$ctx)";
 
                                my $ptr = (" " x $off) . "^";
-                               my $hereptr = "$hereline$ptr\n\n";
+                               my $hereptr = "$hereline$ptr\n";
 
                                ##print "<$s1:$op:$s2> <$elements[$n]:$elements[$n + 1]:$elements[$n + 2]>\n";
 
                                # ; should have either the end of line or a space or \ after it
                                if ($op eq ';') {
-                                       if ($ctx !~ /.x[WE]/ && $cc !~ /^\\/) {
-                                               print "need space after that '$op' $at\n";
-                                               print "$hereptr";
-                                               $clean = 0;
+                                       if ($ctx !~ /.x[WEB]/ && $cc !~ /^\\/ &&
+                                           $cc !~ /^;/) {
+                                               ERROR("need space after that '$op' $at\n" . $hereptr);
                                        }
 
                                # // is a comment
@@ -662,43 +701,31 @@ sub process {
                                # -> should have no spaces
                                } elsif ($op eq '->') {
                                        if ($ctx =~ /Wx.|.xW/) {
-                                               print "no spaces around that '$op' $at\n";
-                                               print "$hereptr";
-                                               $clean = 0;
+                                               ERROR("no spaces around that '$op' $at\n" . $hereptr);
                                        }
 
                                # , must have a space on the right.
                                } elsif ($op eq ',') {
                                        if ($ctx !~ /.xW|.xE/ && $cc !~ /^}/) {
-                                               print "need space after that '$op' $at\n";
-                                               print "$hereptr";
-                                               $clean = 0;
+                                               ERROR("need space after that '$op' $at\n" . $hereptr);
                                        }
 
                                # unary ! and unary ~ are allowed no space on the right
                                } elsif ($op eq '!' or $op eq '~') {
                                        if ($ctx !~ /[WOEB]x./) {
-                                               print "need space before that '$op' $at\n";
-                                               print "$hereptr";
-                                               $clean = 0;
+                                               ERROR("need space before that '$op' $at\n" . $hereptr);
                                        }
                                        if ($ctx =~ /.xW/) {
-                                               print "no space after that '$op' $at\n";
-                                               print "$hereptr";
-                                               $clean = 0;
+                                               ERROR("no space after that '$op' $at\n" . $hereptr);
                                        }
 
                                # unary ++ and unary -- are allowed no space on one side.
                                } elsif ($op eq '++' or $op eq '--') {
                                        if ($ctx !~ /[WOB]x[^W]/ && $ctx !~ /[^W]x[WOBE]/) {
-                                               print "need space one side of that '$op' $at\n";
-                                               print "$hereptr";
-                                               $clean = 0;
+                                               ERROR("need space one side of that '$op' $at\n" . $hereptr);
                                        }
                                        if ($ctx =~ /Wx./ && $cc =~ /^;/) {
-                                               print "no space before that '$op' $at\n";
-                                               print "$hereptr";
-                                               $clean = 0;
+                                               ERROR("no space before that '$op' $at\n" . $hereptr);
                                        }
 
                                # & is both unary and binary
@@ -715,9 +742,7 @@ sub process {
                                #
                                } elsif ($op eq '&' or $op eq '-') {
                                        if ($ctx !~ /VxV|[EW]x[WE]|[EWB]x[VO]/) {
-                                               print "need space before that '$op' $at\n";
-                                               print "$hereptr";
-                                               $clean = 0;
+                                               ERROR("need space before that '$op' $at\n" . $hereptr);
                                        }
 
                                # * is the same as & only adding:
@@ -726,16 +751,9 @@ sub process {
                                #       (foo **)
                                #
                                } elsif ($op eq '*') {
-                                       if ($ca eq '*') {
-                                               if ($cc =~ /^\s(?!\s*const)/) {
-                                                       print "no space after that '$op' $at\n";
-                                                       print "$hereptr";
-                                                       $clean = 0;
-                                               }
-                                       } elsif ($ctx !~ /VxV|[EW]x[WE]|[EWB]x[VO]|OxV|WxB|BxB/) {
-                                               print "need space before that '$op' $at\n";
-                                               print "$hereptr";
-                                               $clean = 0;
+                                       if ($ca !~ /$Type$/ && $cb !~ /(\*$;|$;\*)/ &&
+                                           $ctx !~ /VxV|[EW]x[WE]|[EWB]x[VO]|OxV|WxB|BxB/) {
+                                               ERROR("need space before that '$op' $at\n" . $hereptr);
                                        }
 
                                # << and >> may either have or not have spaces both sides
@@ -743,58 +761,51 @@ sub process {
                                         $op eq '^' or $op eq '|')
                                {
                                        if ($ctx !~ /VxV|WxW|VxE|WxE/) {
-                                               print "need consistent spacing around '$op' $at\n";
-                                               print "$hereptr";
-                                               $clean = 0;
+                                               ERROR("need consistent spacing around '$op' $at\n" .
+                                                       $hereptr);
                                        }
 
                                # All the others need spaces both sides.
                                } elsif ($ctx !~ /[EW]x[WE]/) {
-                                       print "need spaces around that '$op' $at\n";
-                                       print "$hereptr";
-                                       $clean = 0;
+                                       ERROR("need spaces around that '$op' $at\n" . $hereptr);
                                }
                                $off += length($elements[$n + 1]);
                        }
                }
 
 #need space before brace following if, while, etc
-               if ($line=~/\(.*\){/) {
-                       print "need a space before the brace\n";
-                       print "$herecurr";
-                       $clean = 0;
+               if ($line =~ /\(.*\){/ || $line =~ /do{/) {
+                       ERROR("need a space before the open brace '{'\n" . $herecurr);
+               }
+
+# closing brace should have a space following it when it has anything
+# on the line
+               if ($line =~ /}(?!(?:,|;|\)))\S/) {
+                       ERROR("need a space after that close brace '}'\n" . $herecurr);
                }
 
 #goto labels aren't indented, allow a single space however
                if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
                   !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
-                       print "labels should not be indented\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       WARN("labels should not be indented\n" . $herecurr);
                }
 
 # Need a space before open parenthesis after if, while etc
                if ($line=~/\b(if|while|for|switch)\(/) {
-                       print "need a space before the open parenthesis\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       ERROR("need a space before the open parenthesis '('\n" . $herecurr);
                }
 
 # Check for illegal assignment in if conditional.
                if ($line=~/\bif\s*\(.*[^<>!=]=[^=].*\)/) {
                        #next if ($line=~/\".*\Q$op\E.*\"/ or $line=~/\'\Q$op\E\'/);
-                       print "do not use assignment in if condition\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       ERROR("do not use assignment in if condition\n" . $herecurr);
                }
 
                # Check for }<nl>else {, these must be at the same
                # indent level to be relevant to each other.
                if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and
                                                $previndent == $indent) {
-                       print "else should follow close brace\n";
-                       print "$hereprev";
-                       $clean = 0;
+                       ERROR("else should follow close brace '}'\n" . $hereprev);
                }
 
 #studly caps, commented out until figure out how to distinguish between use of existing and adding new
@@ -806,57 +817,22 @@ sub process {
 
 #no spaces allowed after \ in define
                if ($line=~/\#define.*\\\s$/) {
-                       print("Whitepspace after \\ makes next lines useless\n");
-                       print "$herecurr";
-                       $clean = 0;
+                       WARN("Whitepspace after \\ makes next lines useless\n" . $herecurr);
                }
 
 #warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
                if ($tree && $rawline =~ m{^.\#\s*include\s*\<asm\/(.*)\.h\>}) {
                        my $checkfile = "include/linux/$1.h";
                        if (-f $checkfile) {
-                               print "Use #include <linux/$1.h> instead of <asm/$1.h>\n";
-                               print $herecurr;
-                               $clean = 0;
-                       }
-               }
-
-# if/while/etc brace do not go on next line, unless defining a do while loop,
-# or if that brace on the next line is for something else
-               if ($prevline=~/\b(?:(if|while|for|switch)\s*\(|do\b|else\b)/) {
-                       my @opened = $prevline=~/\(/g;
-                       my @closed = $prevline=~/\)/g;
-                       my $nr_line = $linenr;
-                       my $remaining = $realcnt - 1;
-                       my $next_line = $line;
-                       my $extra_lines = 0;
-                       my $display_segment = $prevline;
-
-                       while ($remaining > 0 && scalar @opened > scalar @closed) {
-                               $prevline .= $next_line;
-                               $display_segment .= "\n" . $next_line;
-                               $next_line = $lines[$nr_line];
-                               $nr_line++;
-                               $remaining--;
-
-                               @opened = $prevline=~/\(/g;
-                               @closed = $prevline=~/\)/g;
-                       }
-
-                       if (($prevline=~/\b(?:(if|while|for|switch)\s*\(.*\)|do|else)\s*$/) and ($next_line=~/{/) and
-                          !($next_line=~/\b(?:if|while|for|switch|do|else)\b/) and !($next_line=~/\#define.*do.*while/)) {
-                               print "That { should be on the previous line\n";
-                               print "$here\n$display_segment\n$next_line\n\n";
-                               $clean = 0;
+                               CHK("Use #include <linux/$1.h> instead of <asm/$1.h>\n" .
+                                       $herecurr);
                        }
                }
 
 # if and else should not have general statements after it
                if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/ &&
-                   $1 !~ /^\s*(?:\sif|{|$)/) {
-                       print "trailing statements should be on next line\n";
-                       print "$herecurr";
-                       $clean = 0;
+                   $1 !~ /^\s*(?:\sif|{|\\|$)/) {
+                       ERROR("trailing statements should be on next line\n" . $herecurr);
                }
 
 # multi-statement macros should be enclosed in a do while loop, grab the
@@ -877,49 +853,49 @@ sub process {
                                $ln--;
                                $cnt++;
                        }
-                       my $ctx = join('', ctx_statement($ln, $cnt));
+                       my @ctx = ctx_statement($ln, $cnt);
+                       my $ctx_ln = $ln + $#ctx + 1;
+                       my $ctx = join("\n", @ctx);
+
+                       # Pull in any empty extension lines.
+                       while ($ctx =~ /\\$/ &&
+                              $lines[$ctx_ln - 1] =~ /^.\s*(?:\\)?$/) {
+                               $ctx .= $lines[$ctx_ln - 1];
+                               $ctx_ln++;
+                       }
 
                        if ($ctx =~ /\\$/) {
                                if ($ctx =~ /;/) {
-                                       print "Macros with multiple statements should be enclosed in a do - while loop\n";
+                                       ERROR("Macros with multiple statements should be enclosed in a do - while loop\n" . "$here\n$ctx\n");
                                } else {
-                                       print "Macros with complex values should be enclosed in parenthesis\n";
+                                       ERROR("Macros with complex values should be enclosed in parenthesis\n" . "$here\n$ctx\n");
                                }
-                               print "$hereprev";
-                               $clean = 0;
                        }
                }
 
 # don't include deprecated include files (uses RAW line)
                for my $inc (@dep_includes) {
                        if ($rawline =~ m@\#\s*include\s*\<$inc>@) {
-                               print "Don't use <$inc>: see Documentation/feature-removal-schedule.txt\n";
-                               print "$herecurr";
-                               $clean = 0;
+                               ERROR("Don't use <$inc>: see Documentation/feature-removal-schedule.txt\n" . $herecurr);
                        }
                }
 
 # don't use deprecated functions
                for my $func (@dep_functions) {
                        if ($line =~ /\b$func\b/) {
-                               print "Don't use $func(): see Documentation/feature-removal-schedule.txt\n";
-                               print "$herecurr";
-                               $clean = 0;
+                               ERROR("Don't use $func(): see Documentation/feature-removal-schedule.txt\n" . $herecurr);
                        }
                }
 
 # no volatiles please
                if ($line =~ /\bvolatile\b/ && $line !~ /\basm\s+volatile\b/) {
-                       print "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       WARN("Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr);
                }
 
 # warn about #if 0
                if ($line =~ /^.#\s*if\s+0\b/) {
-                       print "#if 0 -- if this code redundant remove it\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       CHK("if this code is redundant consider removing it\n" .
+                               $herecurr);
                }
 
 # warn about #ifdefs in C files
@@ -933,41 +909,47 @@ sub process {
                if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/) {
                        my $which = $1;
                        if (!ctx_has_comment($first_line, $linenr)) {
-                               print "$1 definition without comment\n";
-                               print "$herecurr";
-                               $clean = 0;
+                               CHK("$1 definition without comment\n" . $herecurr);
                        }
                }
 # check for memory barriers without a comment.
                if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
                        if (!ctx_has_comment($first_line, $linenr)) {
-                               print "memory barrier without comment\n";
-                               print "$herecurr";
-                               $clean = 0;
+                               CHK("memory barrier without comment\n" . $herecurr);
                        }
                }
 # check of hardware specific defines
                if ($line =~ m@^.#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@) {
-                       print "architecture specific defines should be avoided\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       CHK("architecture specific defines should be avoided\n" .  $herecurr);
                }
 
+# check the location of the inline attribute, that it is between
+# storage class and type.
                if ($line =~ /$Type\s+(?:inline|__always_inline)\b/ ||
                    $line =~ /\b(?:inline|always_inline)\s+$Storage/) {
-                       print "inline keyword should sit between storage class and type\n";
-                       print "$herecurr";
-                       $clean = 0;
+                       ERROR("inline keyword should sit between storage class and type\n" . $herecurr);
+               }
+
+# check for new externs in .c files.
+               if ($line =~ /^.\s*extern\s/ && ($realfile =~ /\.c$/)) {
+                       WARN("externs should be avoided in .c files\n" .  $herecurr);
+               }
+
+# checks for new __setup's
+               if ($rawline =~ /\b__setup\("([^"]*)"/) {
+                       my $name = $1;
+
+                       if (!grep(/$name/, @setup_docs)) {
+                               CHK("__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr);
+                       }
                }
        }
 
        if ($chk_patch && !$is_patch) {
-               $clean = 0;
-               print "Does not appear to be a unified-diff format patch\n";
+               ERROR("Does not appear to be a unified-diff format patch\n");
        }
        if ($is_patch && $chk_signoff && $signoff == 0) {
-               $clean = 0;
-               print "Missing Signed-off-by: line(s)\n";
+               ERROR("Missing Signed-off-by: line(s)\n");
        }
 
        if ($clean == 1 && $quiet == 0) {
diff --git a/scripts/decodecode b/scripts/decodecode
new file mode 100644 (file)
index 0000000..1e1a8f6
--- /dev/null
@@ -0,0 +1,51 @@
+#!/bin/sh
+# Disassemble the Code: line in Linux oopses
+# usage: decodecode < oops.file
+#
+# options: set env. variable AFLAGS=options to pass options to "as";
+# e.g., to decode an i386 oops on an x86_64 system, use:
+# AFLAGS=--32 decodecode < 386.oops
+
+T=`mktemp`
+code=
+
+while read i ; do
+
+case "$i" in
+*Code:*)
+       code=$i
+       ;;
+esac
+
+done
+
+if [ -z "$code" ]; then
+       exit
+fi
+
+echo $code
+code=`echo $code | sed -e 's/.*Code: //'`
+
+marker=`expr index "$code" "\<"`
+if [ $marker -eq 0 ]; then
+       marker=`expr index "$code" "\("`
+fi
+
+if [ $marker -ne 0 ]; then
+       beforemark=`echo "$code" | cut -c-$((${marker} - 1))`
+       echo -n "       .byte 0x" > $T.s
+       echo $beforemark | sed -e 's/ /,0x/g' >> $T.s
+       as $AFLAGS -o $T.o $T.s
+       objdump -S $T.o
+       rm $T.o $T.s
+
+# and fix code at-and-after marker
+       code=`echo "$code" | cut -c$((${marker} + 1))-`
+fi
+
+code=`echo $code | sed -e 's/ [<(]/ /;s/[>)] / /;s/ /,0x/g'`
+echo -n "      .byte 0x" > $T.s
+echo $code >> $T.s
+as $AFLAGS -o $T.o $T.s
+objdump -S $T.o
+rm $T.o $T.s
index ccfe8755735e13b864b16f56d8880dc93568efb2..eddc7b420109aac9c129dedfad67f680b6203e99 100644 (file)
@@ -110,6 +110,8 @@ static struct nlmsg_perm nlmsg_audit_perms[] =
        { AUDIT_DEL_RULE,       NETLINK_AUDIT_SOCKET__NLMSG_WRITE    },
        { AUDIT_USER,           NETLINK_AUDIT_SOCKET__NLMSG_RELAY    },
        { AUDIT_SIGNAL_INFO,    NETLINK_AUDIT_SOCKET__NLMSG_READ     },
+       { AUDIT_TTY_GET,        NETLINK_AUDIT_SOCKET__NLMSG_READ     },
+       { AUDIT_TTY_SET,        NETLINK_AUDIT_SOCKET__NLMSG_WRITE    },
 };
 
 
index 4b30ae6d8ba511e4694c03d7322b05ad75a723d2..314477909f82cf85029fc590ee67f1b6696944f0 100644 (file)
@@ -348,7 +348,7 @@ config MSND_FIFOSIZE
 
 config SOUND_VIA82CXXX
        tristate "VIA 82C686 Audio Codec"
-       depends on SOUND_PRIME && PCI && OSS_OBSOLETE
+       depends on SOUND_PRIME && PCI && OSS_OBSOLETE && VIRT_TO_BUS
        help
          Say Y here to include support for the audio codec found on VIA
          82Cxxx-based chips. Typically these are built into a motherboard.
@@ -368,7 +368,7 @@ config MIDI_VIA82CXXX
 
 config SOUND_OSS
        tristate "OSS sound modules"
-       depends on SOUND_PRIME && ISA_DMA_API
+       depends on SOUND_PRIME && ISA_DMA_API && VIRT_TO_BUS
        help
          OSS is the Open Sound System suite of sound card drivers.  They make
          sound programming easier since they provide a common API.  Say Y or
@@ -417,6 +417,7 @@ config SOUND_CS4232
 config SOUND_SSCAPE
        tristate "Ensoniq SoundScape support"
        depends on SOUND_OSS
+       depends on VIRT_TO_BUS
        help
          Answer Y if you have a sound card based on the Ensoniq SoundScape
          chipset. Such cards are being manufactured at least by Ensoniq, Spea
index 2489bd6bb08561ab5e8cc296eca87d20427a354b..7a2f9ae7b7c5818d13331eaadb2db6dd9e35ca89 100644 (file)
@@ -18,20 +18,15 @@ obj-$(CONFIG_SOUND_TRIX)    += trix.o ad1848.o sb_lib.o uart401.o
 obj-$(CONFIG_SOUND_SSCAPE)     += sscape.o ad1848.o mpu401.o
 obj-$(CONFIG_SOUND_CS4232)     += cs4232.o uart401.o
 obj-$(CONFIG_SOUND_MSS)                += ad1848.o
-obj-$(CONFIG_SOUND_OPL3SA2)    += opl3sa2.o ad1848.o mpu401.o
 obj-$(CONFIG_SOUND_PAS)                += pas2.o sb.o sb_lib.o uart401.o
 obj-$(CONFIG_SOUND_SB)         += sb.o sb_lib.o uart401.o
 obj-$(CONFIG_SOUND_KAHLUA)     += kahlua.o
 obj-$(CONFIG_SOUND_MPU401)     += mpu401.o
 obj-$(CONFIG_SOUND_UART6850)   += uart6850.o
-obj-$(CONFIG_SOUND_ADLIB)      += adlib_card.o opl3.o
 obj-$(CONFIG_SOUND_YM3812)     += opl3.o
 obj-$(CONFIG_SOUND_VMIDI)      += v_midi.o
 obj-$(CONFIG_SOUND_VIDC)       += vidc_mod.o
 obj-$(CONFIG_SOUND_WAVEARTIST) += waveartist.o
-obj-$(CONFIG_SOUND_AD1816)     += ad1816.o
-obj-$(CONFIG_SOUND_AD1889)     += ad1889.o ac97_codec.o
-obj-$(CONFIG_SOUND_ACI_MIXER)  += aci.o
 
 obj-$(CONFIG_SOUND_VIA82CXXX)  += via82cxxx_audio.o ac97_codec.o
 ifeq ($(CONFIG_MIDI_VIA82CXXX),y)
@@ -40,24 +35,16 @@ endif
 obj-$(CONFIG_SOUND_MSNDCLAS)   += msnd.o msnd_classic.o
 obj-$(CONFIG_SOUND_MSNDPIN)    += msnd.o msnd_pinnacle.o
 obj-$(CONFIG_SOUND_VWSND)      += vwsnd.o
-obj-$(CONFIG_SOUND_NM256)      += nm256_audio.o ac97.o
 obj-$(CONFIG_SOUND_ICH)                += i810_audio.o ac97_codec.o
 obj-$(CONFIG_SOUND_ES1371)     += es1371.o ac97_codec.o
 obj-$(CONFIG_SOUND_VRC5477)    += nec_vrc5477.o ac97_codec.o
 obj-$(CONFIG_SOUND_AU1550_AC97)        += au1550_ac97.o ac97_codec.o
-obj-$(CONFIG_SOUND_FUSION)     += cs46xx.o ac97_codec.o
 obj-$(CONFIG_SOUND_TRIDENT)    += trident.o ac97_codec.o
-obj-$(CONFIG_SOUND_EMU10K1)    += ac97_codec.o
 obj-$(CONFIG_SOUND_BCM_CS4297A)        += swarm_cs4297a.o
 obj-$(CONFIG_SOUND_BT878)      += btaudio.o
 
 obj-$(CONFIG_SOUND_WM97XX)     += ac97_plugin_wm97xx.o
 
-ifeq ($(CONFIG_MIDI_EMU10K1),y)
-  obj-$(CONFIG_SOUND_EMU10K1)  += sound.o
-endif
-
-obj-$(CONFIG_SOUND_EMU10K1)    += emu10k1/
 obj-$(CONFIG_DMASOUND)         += dmasound/
 
 # Declare multi-part drivers.
diff --git a/sound/oss/ac97.c b/sound/oss/ac97.c
deleted file mode 100644 (file)
index 72cf4ed..0000000
+++ /dev/null
@@ -1,432 +0,0 @@
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include "ac97.h"
-
-/* Flag for mono controls. */
-#define MO 0
-/* And for stereo. */
-#define ST 1
-
-/* Whether or not the bits in the channel are inverted. */
-#define INV 1
-#define NINV 0
-
-static struct ac97_chn_desc {
-    int ac97_regnum;
-    int oss_channel;
-    int maxval;
-    int is_stereo;
-    int oss_mask;
-    int recordNum;
-    u16 regmask;
-    int is_inverted;
-} mixerRegs[] = {
-    { AC97_MASTER_VOL_STEREO, SOUND_MIXER_VOLUME,   0x3f, ST, SOUND_MASK_VOLUME,   5, 0x0000, INV  },
-    { AC97_MASTER_VOL_MONO,   SOUND_MIXER_PHONEOUT, 0x3f, MO, SOUND_MASK_PHONEOUT, 6, 0x0000, INV  },
-    { AC97_MASTER_TONE,       SOUND_MIXER_TREBLE,   0x0f, MO, SOUND_MASK_TREBLE,  -1, 0x00ff, INV  },
-    { AC97_MASTER_TONE,       SOUND_MIXER_BASS,     0x0f, MO, SOUND_MASK_BASS,    -1, 0xff00, INV  },
-    { AC97_PCBEEP_VOL,        SOUND_MIXER_SPEAKER,  0x0f, MO, SOUND_MASK_SPEAKER, -1, 0x001e, INV  },
-    { AC97_PHONE_VOL,         SOUND_MIXER_PHONEIN,  0x1f, MO, SOUND_MASK_PHONEIN,  7, 0x0000, INV  },
-    { AC97_MIC_VOL,           SOUND_MIXER_MIC,      0x1f, MO, SOUND_MASK_MIC,      0, 0x0000, INV  },
-    { AC97_LINEIN_VOL,        SOUND_MIXER_LINE,     0x1f, ST, SOUND_MASK_LINE,     4, 0x0000, INV  },
-    { AC97_CD_VOL,            SOUND_MIXER_CD,       0x1f, ST, SOUND_MASK_CD,       1, 0x0000, INV  },
-    { AC97_VIDEO_VOL,         SOUND_MIXER_VIDEO,    0x1f, ST, SOUND_MASK_VIDEO,    2, 0x0000, INV  },
-    { AC97_AUX_VOL,           SOUND_MIXER_LINE1,    0x1f, ST, SOUND_MASK_LINE1,           3, 0x0000, INV  },
-    { AC97_PCMOUT_VOL,        SOUND_MIXER_PCM,      0x1f, ST, SOUND_MASK_PCM,     -1, 0x0000, INV  },
-    { AC97_RECORD_GAIN,       SOUND_MIXER_IGAIN,    0x0f, ST, SOUND_MASK_IGAIN,   -1, 0x0000, NINV },
-    { -1,                    -1,                   0xff, 0,  0,                  -1, 0x0000, 0    },
-};
-
-static struct ac97_chn_desc *
-ac97_find_chndesc (struct ac97_hwint *dev, int oss_channel)
-{
-    int x;
-
-    for (x = 0; mixerRegs[x].oss_channel != -1; x++) {
-       if (mixerRegs[x].oss_channel == oss_channel)
-           return mixerRegs + x;
-    }
-
-    return NULL;
-}
-
-static inline int
-ac97_is_valid_channel (struct ac97_hwint *dev, struct ac97_chn_desc *chn)
-{
-    return (dev->last_written_mixer_values[chn->ac97_regnum / 2]
-           != AC97_REG_UNSUPPORTED);
-}
-
-int
-ac97_init (struct ac97_hwint *dev)
-{
-    int x;
-    int reg0;
-
-    /* Clear out the arrays of cached values. */
-    for (x = 0; x < AC97_REG_CNT; x++)
-       dev->last_written_mixer_values[x] = AC97_REGVAL_UNKNOWN;
-
-    for (x = 0; x < SOUND_MIXER_NRDEVICES; x++)
-       dev->last_written_OSS_values[x] = AC97_REGVAL_UNKNOWN;
-
-    /* Clear the device masks.  */
-    dev->mixer_devmask = 0;
-    dev->mixer_stereomask = 0;
-    dev->mixer_recmask = 0;
-
-    /* ??? Do a "standard reset" via register 0? */
-
-    /* Hardware-dependent reset.  */
-    if (dev->reset_device (dev))
-       return -1;
-
-    /* Check the mixer device capabilities.  */
-    reg0 = dev->read_reg (dev, AC97_RESET);
-
-    if (reg0 < 0)
-       return -1;
-
-    /* Check for support for treble/bass controls.  */
-    if (! (reg0 & 4)) {
-       dev->last_written_mixer_values[AC97_MASTER_TONE / 2] 
-           = AC97_REG_UNSUPPORTED;
-    }
-
-    /* ??? There may be other tests here? */
-
-    /* Fill in the device masks.  */
-    for (x = 0; mixerRegs[x].ac97_regnum != -1; x++) {
-       if (ac97_is_valid_channel (dev, mixerRegs + x)) {
-           dev->mixer_devmask |= mixerRegs[x].oss_mask;
-
-           if (mixerRegs[x].is_stereo)
-               dev->mixer_stereomask |= mixerRegs[x].oss_mask;
-
-           if (mixerRegs[x].recordNum != -1)
-               dev->mixer_recmask |= mixerRegs[x].oss_mask;
-       }
-    }
-
-    return 0;
-}
-
-/* Return the contents of register REG; use the cache if the value in it
-   is valid.  Returns a negative error code on failure. */
-static int
-ac97_get_register (struct ac97_hwint *dev, u8 reg) 
-{
-    if (reg > 127 || (reg & 1))
-       return -EINVAL;
-
-    /* See if it's in the cache, or if it's just plain invalid.  */
-    switch (dev->last_written_mixer_values[reg / 2]) {
-    case AC97_REG_UNSUPPORTED:
-       return -EINVAL;
-       break;
-    case AC97_REGVAL_UNKNOWN:
-       dev->last_written_mixer_values[reg / 2] = dev->read_reg (dev, reg);
-       break;
-    default:
-       break;
-    }
-    return dev->last_written_mixer_values[reg / 2];
-}
-
-/* Write VALUE to AC97 register REG, and cache its value in the last-written
-   cache.  Returns a negative error code on failure, or 0 on success. */
-int
-ac97_put_register (struct ac97_hwint *dev, u8 reg, u16 value)
-{
-    if (reg > 127 || (reg & 1))
-       return -EINVAL;
-
-    if (dev->last_written_mixer_values[reg / 2] == AC97_REG_UNSUPPORTED)
-       return -EINVAL;
-    else {
-       int res = dev->write_reg (dev, reg, value);
-       if (res >= 0) {
-           dev->last_written_mixer_values[reg / 2] = value;
-           return 0;
-       }
-       else
-           return res;
-    }
-}
-
-/* Scale VALUE (a value fro 0 to MAXVAL) to a value from 0-100.  If
-   IS_STEREO is set, VALUE is a stereo value; the left channel value
-   is in the lower 8 bits, and the right channel value is in the upper
-   8 bits.
-
-   A negative error code is returned on failure, or the unsigned
-   scaled value on success.  */
-
-static int
-ac97_scale_to_oss_val (int value, int maxval, int is_stereo, int inv)
-{
-    /* Muted?  */
-    if (value & AC97_MUTE)
-       return 0;
-
-    if (is_stereo)
-       return (ac97_scale_to_oss_val (value & 255, maxval, 0, inv) << 8)
-       | (ac97_scale_to_oss_val ((value >> 8) & 255, maxval, 0, inv) << 0);
-    else {
-       int i;
-       
-       /* Inverted. */
-       if (inv)
-           value = maxval - value;
-
-       i = (value * 100 + (maxval / 2)) / maxval;
-       if (i > 100)
-            i = 100;
-       if (i < 0)
-           i = 0;
-       return i;
-    }
-}
-
-static int
-ac97_scale_from_oss_val (int value, int maxval, int is_stereo, int inv)
-{
-    if (is_stereo)
-       return (ac97_scale_from_oss_val (value & 255, maxval, 0, inv) << 8)
-       | (ac97_scale_from_oss_val ((value >> 8) & 255, maxval, 0, inv) << 0);
-    else {
-       int i = ((value & 255) * maxval + 50) / 100;
-       if (inv)
-           i = maxval - i;
-       if (i < 0)
-           i = 0;
-       if (i > maxval)
-           i = maxval;
-       return i;
-    }
-}
-
-static int
-ac97_set_mixer (struct ac97_hwint *dev, int oss_channel, u16 oss_value)
-{
-    int scaled_value;
-    struct ac97_chn_desc *channel = ac97_find_chndesc (dev, oss_channel);
-    int result;
-
-    if (channel == NULL)
-       return -ENODEV;
-    if (! ac97_is_valid_channel (dev, channel))
-       return -ENODEV;
-    scaled_value = ac97_scale_from_oss_val (oss_value, channel->maxval,
-                                           channel->is_stereo, 
-                                           channel->is_inverted);
-    if (scaled_value < 0)
-       return scaled_value;
-
-    if (channel->regmask != 0) {
-       int mv;
-
-       int oldval = ac97_get_register (dev, channel->ac97_regnum);
-       if (oldval < 0)
-           return oldval;
-
-       for (mv = channel->regmask; ! (mv & 1); mv >>= 1)
-           scaled_value <<= 1;
-
-       scaled_value &= channel->regmask;
-       scaled_value |= (oldval & ~channel->regmask);
-    }
-    result = ac97_put_register (dev, channel->ac97_regnum, scaled_value);
-    if (result == 0)
-       dev->last_written_OSS_values[oss_channel] = oss_value;
-    return result;
-}
-
-static int
-ac97_get_mixer_scaled (struct ac97_hwint *dev, int oss_channel)
-{
-    struct ac97_chn_desc *channel = ac97_find_chndesc (dev, oss_channel);
-    int regval;
-
-    if (channel == NULL)
-       return -ENODEV;
-
-    if (! ac97_is_valid_channel (dev, channel))
-       return -ENODEV;
-
-    regval = ac97_get_register (dev, channel->ac97_regnum);
-
-    if (regval < 0)
-       return regval;
-
-    if (channel->regmask != 0) {
-       int mv;
-
-       regval &= channel->regmask;
-
-       for (mv = channel->regmask; ! (mv & 1); mv >>= 1)
-           regval >>= 1;
-    }
-    return ac97_scale_to_oss_val (regval, channel->maxval,
-                                 channel->is_stereo, 
-                                 channel->is_inverted);
-}
-
-static int
-ac97_get_recmask (struct ac97_hwint *dev)
-{
-    int recReg = ac97_get_register (dev, AC97_RECORD_SELECT);
-
-    if (recReg < 0)
-       return recReg;
-    else {
-       int x;
-       for (x = 0; mixerRegs[x].ac97_regnum >= 0; x++) {
-           if (mixerRegs[x].recordNum == (recReg & 7))
-               return mixerRegs[x].oss_mask;
-       }
-       return -ENODEV;
-    }
-}
-
-static int
-ac97_set_recmask (struct ac97_hwint *dev, int oss_recmask)
-{
-    int x;
-
-    if (oss_recmask == 0)
-       oss_recmask = SOUND_MIXER_MIC;
-
-    for (x = 0; mixerRegs[x].ac97_regnum >= 0; x++) { 
-       if ((mixerRegs[x].recordNum >= 0)
-            && (oss_recmask & mixerRegs[x].oss_mask))
-           break;
-    }
-    if (mixerRegs[x].ac97_regnum < 0)
-       return -ENODEV;
-    else {
-       int regval = (mixerRegs[x].recordNum << 8) | mixerRegs[x].recordNum;
-       int res = ac97_put_register (dev, AC97_RECORD_SELECT, regval);
-       if (res == 0)
-           return ac97_get_recmask (dev);
-       else
-           return res;
-    }
-}
-
-/* Set the mixer DEV to the list of values in VALUE_LIST.  Return 0 on
-   success, or a negative error code.  */
-int
-ac97_set_values (struct ac97_hwint *dev, 
-                struct ac97_mixer_value_list *value_list)
-{
-    int x;
-
-    for (x = 0; value_list[x].oss_channel != -1; x++) {
-       int chnum = value_list[x].oss_channel;
-       struct ac97_chn_desc *chent = ac97_find_chndesc (dev, chnum);
-       if (chent != NULL) {
-           u16 val;
-           int res;
-
-           if (chent->is_stereo)
-               val = (value_list[x].value.stereo.right << 8) 
-                     | value_list[x].value.stereo.left;
-           else {
-               /* We do this so the returned value looks OK in the
-                  mixer app.  It's not necessary otherwise.  */
-               val = (value_list[x].value.mono << 8) 
-                     | value_list[x].value.mono;
-           }
-           res = ac97_set_mixer (dev, chnum, val);
-           if (res < 0)
-               return res;
-       }
-       else
-           return -ENODEV;
-    }
-    return 0;
-}
-
-int
-ac97_mixer_ioctl (struct ac97_hwint *dev, unsigned int cmd, void __user *arg)
-{
-    int ret;
-
-    switch (cmd) {
-    case SOUND_MIXER_READ_RECSRC:
-       ret = ac97_get_recmask (dev);
-       break;
-
-    case SOUND_MIXER_WRITE_RECSRC:
-       {
-           if (get_user (ret, (int __user *) arg))
-               ret = -EFAULT;
-           else
-               ret = ac97_set_recmask (dev, ret);
-       }
-       break;
-
-    case SOUND_MIXER_READ_CAPS:
-       ret = SOUND_CAP_EXCL_INPUT;
-       break;
-
-    case SOUND_MIXER_READ_DEVMASK:
-       ret = dev->mixer_devmask;
-       break;
-
-    case SOUND_MIXER_READ_RECMASK:
-       ret = dev->mixer_recmask;
-       break;
-
-    case SOUND_MIXER_READ_STEREODEVS:
-       ret = dev->mixer_stereomask;
-       break;
-
-    default:
-       /* Read or write request. */
-       ret = -EINVAL;
-       if (_IOC_TYPE (cmd) == 'M') {
-           int dir = _SIOC_DIR (cmd);
-           int channel = _IOC_NR (cmd);
-
-           if (channel >= 0 && channel < SOUND_MIXER_NRDEVICES) {
-               ret = 0;
-               if (dir & _SIOC_WRITE) {
-                   int val;
-                   if (get_user (val, (int __user *) arg) == 0)
-                       ret = ac97_set_mixer (dev, channel, val);
-                   else
-                       ret = -EFAULT;
-               }
-               if (ret >= 0 && (dir & _SIOC_READ)) {
-                   if (dev->last_written_OSS_values[channel]
-                       == AC97_REGVAL_UNKNOWN)
-                       dev->last_written_OSS_values[channel]
-                           = ac97_get_mixer_scaled (dev, channel);
-                   ret = dev->last_written_OSS_values[channel];
-               }
-           }
-       }
-       break;
-    }
-
-    if (ret < 0)
-       return ret;
-    else
-       return put_user(ret, (int __user *) arg);
-}
-
-EXPORT_SYMBOL(ac97_init);
-EXPORT_SYMBOL(ac97_set_values);
-EXPORT_SYMBOL(ac97_put_register);
-EXPORT_SYMBOL(ac97_mixer_ioctl);
-MODULE_LICENSE("GPL");
-
-\f
-/*
- * Local variables:
- *  c-basic-offset: 4
- * End:
- */
diff --git a/sound/oss/ac97.h b/sound/oss/ac97.h
deleted file mode 100644 (file)
index 01837a9..0000000
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * ac97.h 
- * 
- * definitions for the AC97, Intel's Audio Codec 97 Spec
- * also includes support for a generic AC97 interface
- */
-
-#ifndef _AC97_H_
-#define _AC97_H_
-#include "sound_config.h"
-#include "sound_calls.h"
-
-#define  AC97_RESET              0x0000      //
-#define  AC97_MASTER_VOL_STEREO  0x0002      // Line Out
-#define  AC97_HEADPHONE_VOL      0x0004      // 
-#define  AC97_MASTER_VOL_MONO    0x0006      // TAD Output
-#define  AC97_MASTER_TONE        0x0008      //
-#define  AC97_PCBEEP_VOL         0x000a      // none
-#define  AC97_PHONE_VOL          0x000c      // TAD Input (mono)
-#define  AC97_MIC_VOL            0x000e      // MIC Input (mono)
-#define  AC97_LINEIN_VOL         0x0010      // Line Input (stereo)
-#define  AC97_CD_VOL             0x0012      // CD Input (stereo)
-#define  AC97_VIDEO_VOL          0x0014      // none
-#define  AC97_AUX_VOL            0x0016      // Aux Input (stereo)
-#define  AC97_PCMOUT_VOL         0x0018      // Wave Output (stereo)
-#define  AC97_RECORD_SELECT      0x001a      //
-#define  AC97_RECORD_GAIN        0x001c
-#define  AC97_RECORD_GAIN_MIC    0x001e
-#define  AC97_GENERAL_PURPOSE    0x0020
-#define  AC97_3D_CONTROL         0x0022
-#define  AC97_MODEM_RATE         0x0024
-#define  AC97_POWER_CONTROL      0x0026
-
-/* registers 0x0028 - 0x0058 are reserved */
-
-/* AC'97 2.0 */
-#define AC97_EXTENDED_ID       0x0028  /* Extended Audio ID */
-#define AC97_EXTENDED_STATUS   0x002A  /* Extended Audio Status */
-#define AC97_PCM_FRONT_DAC_RATE 0x002C  /* PCM Front DAC Rate */
-#define AC97_PCM_SURR_DAC_RATE  0x002E  /* PCM Surround DAC Rate */
-#define AC97_PCM_LFE_DAC_RATE   0x0030  /* PCM LFE DAC Rate */
-#define AC97_PCM_LR_ADC_RATE   0x0032  /* PCM LR DAC Rate */
-#define AC97_PCM_MIC_ADC_RATE   0x0034  /* PCM MIC ADC Rate */
-#define AC97_CENTER_LFE_MASTER  0x0036  /* Center + LFE Master Volume */
-#define AC97_SURROUND_MASTER    0x0038  /* Surround (Rear) Master Volume */
-#define AC97_RESERVED_3A       0x003A  /* Reserved */
-/* range 0x3c-0x58 - MODEM */
-
-/* registers 0x005a - 0x007a are vendor reserved */
-
-#define  AC97_VENDOR_ID1         0x007c
-#define  AC97_VENDOR_ID2         0x007e
-
-/* volume control bit defines */
-
-#define AC97_MUTE                0x8000
-#define AC97_MICBOOST            0x0040
-#define AC97_LEFTVOL             0x3f00
-#define AC97_RIGHTVOL            0x003f
-
-/* record mux defines */
-
-#define AC97_RECMUX_MIC          0x0000
-#define AC97_RECMUX_CD           0x0101
-#define AC97_RECMUX_VIDEO        0x0202      /* not used */
-#define AC97_RECMUX_AUX          0x0303      
-#define AC97_RECMUX_LINE         0x0404      
-#define AC97_RECMUX_STEREO_MIX   0x0505
-#define AC97_RECMUX_MONO_MIX     0x0606
-#define AC97_RECMUX_PHONE        0x0707
-
-
-/* general purpose register bit defines */
-
-#define AC97_GP_LPBK             0x0080      /* Loopback mode */
-#define AC97_GP_MS               0x0100      /* Mic Select 0=Mic1, 1=Mic2 */
-#define AC97_GP_MIX              0x0200      /* Mono output select 0=Mix, 1=Mic */
-#define AC97_GP_RLBK             0x0400      /* Remote Loopback - Modem line codec */
-#define AC97_GP_LLBK             0x0800      /* Local Loopback - Modem Line codec */
-#define AC97_GP_LD               0x1000      /* Loudness 1=on */
-#define AC97_GP_3D               0x2000      /* 3D Enhancement 1=on */
-#define AC97_GP_ST               0x4000      /* Stereo Enhancement 1=on */
-#define AC97_GP_POP              0x8000      /* Pcm Out Path, 0=pre 3D, 1=post 3D */
-
-
-/* powerdown control and status bit defines */
-
-/* status */
-#define AC97_PWR_MDM             0x0010      /* Modem section ready */
-#define AC97_PWR_REF             0x0008      /* Vref nominal */
-#define AC97_PWR_ANL             0x0004      /* Analog section ready */
-#define AC97_PWR_DAC             0x0002      /* DAC section ready */
-#define AC97_PWR_ADC             0x0001      /* ADC section ready */
-
-/* control */
-#define AC97_PWR_PR0             0x0100      /* ADC and Mux powerdown */
-#define AC97_PWR_PR1             0x0200      /* DAC powerdown */
-#define AC97_PWR_PR2             0x0400      /* Output mixer powerdown (Vref on) */
-#define AC97_PWR_PR3             0x0800      /* Output mixer powerdown (Vref off) */
-#define AC97_PWR_PR4             0x1000      /* AC-link powerdown */
-#define AC97_PWR_PR5             0x2000      /* Internal Clk disable */
-#define AC97_PWR_PR6             0x4000      /* HP amp powerdown */
-#define AC97_PWR_PR7             0x8000      /* Modem off - if supported */
-
-/* useful power states */
-#define AC97_PWR_D0              0x0000      /* everything on */
-#define AC97_PWR_D1              AC97_PWR_PR0|AC97_PWR_PR1|AC97_PWR_PR4
-#define AC97_PWR_D2              AC97_PWR_PR0|AC97_PWR_PR1|AC97_PWR_PR2|AC97_PWR_PR3|AC97_PWR_PR4
-#define AC97_PWR_D3              AC97_PWR_PR0|AC97_PWR_PR1|AC97_PWR_PR2|AC97_PWR_PR3|AC97_PWR_PR4
-#define AC97_PWR_ANLOFF          AC97_PWR_PR2|AC97_PWR_PR3  /* analog section off */
-
-/* Total number of defined registers.  */
-#define AC97_REG_CNT 64
-
-/* Generic AC97 mixer interface. */
-
-/* Structure describing access to the hardware. */
-struct ac97_hwint
-{
-    /* Perform any hardware-specific reset and initialization.  Returns
-     0 on success, or a negative error code.  */
-    int (*reset_device) (struct ac97_hwint *dev);
-
-    /* Returns the contents of the specified register REG.  The caller
-       should check to see if the desired contents are available in
-       the cache first, if applicable. Returns a positive unsigned value
-       representing the contents of the register, or a negative error
-       code.  */
-    int (*read_reg) (struct ac97_hwint *dev, u8 reg);
-
-    /* Writes VALUE to register REG.  Returns 0 on success, or a
-       negative error code.  */
-    int (*write_reg) (struct ac97_hwint *dev, u8 reg, u16 value);
-
-    /* Hardware-specific information. */
-    void *driver_private;
-
-    /* Three OSS masks. */
-    int mixer_devmask;
-    int mixer_stereomask;
-    int mixer_recmask;
-
-    /* The mixer cache. The indices correspond to the AC97 hardware register
-       number / 2, since the register numbers are always an even number.
-
-       Unknown values are set to -1; unsupported registers contain a
-       -2.  */
-    int last_written_mixer_values[AC97_REG_CNT];
-
-    /* A cache of values written via OSS; we need these so we can return
-       the values originally written by the user.
-
-       Why the original user values?  Because the real-world hardware
-       has less precision, and some existing applications assume that
-       they will get back the exact value that they wrote (aumix).
-
-       A -1 value indicates that no value has been written to this mixer
-       channel via OSS.  */
-    int last_written_OSS_values[SOUND_MIXER_NRDEVICES];
-};
-
-/* Values stored in the register cache.  */
-#define AC97_REGVAL_UNKNOWN -1
-#define AC97_REG_UNSUPPORTED -2
-
-struct ac97_mixer_value_list
-{
-    /* Mixer channel to set.  List is terminated by a value of -1.  */
-    int oss_channel;
-    /* The scaled value to set it to; values generally range from 0-100. */
-    union {
-       struct {
-           u8 left, right;
-       } stereo;
-       u8 mono;
-    } value;
-};
-
-/* Initialize the ac97 mixer by resetting it.  */
-extern int ac97_init (struct ac97_hwint *dev);
-
-/* Sets the mixer DEV to the values in VALUE_LIST.  Returns 0 on success,
-   or a negative error code.  */
-extern int ac97_set_values (struct ac97_hwint *dev,
-                           struct ac97_mixer_value_list *value_list);
-
-/* Writes the specified VALUE to the AC97 register REG in the mixer.
-   Takes care of setting the last-written cache as well.  */
-extern int ac97_put_register (struct ac97_hwint *dev, u8 reg, u16 value);
-
-/* Default ioctl. */
-extern int ac97_mixer_ioctl (struct ac97_hwint *dev, unsigned int cmd,
-                            void __user * arg);
-
-#endif
-\f
-/*
- * Local variables:
- *  c-basic-offset: 4
- * End:
- */
diff --git a/sound/oss/aci.c b/sound/oss/aci.c
deleted file mode 100644 (file)
index 3bfac37..0000000
+++ /dev/null
@@ -1,712 +0,0 @@
-/*
- * Audio Command Interface (ACI) driver (sound/aci.c)
- *
- * ACI is a protocol used to communicate with the microcontroller on
- * some sound cards produced by miro, e.g. the miroSOUND PCM12 and
- * PCM20. The ACI has been developed for miro by Norberto Pellicci
- * <pellicci@home.com>. Special thanks to both him and miro for
- * providing the ACI specification.
- *
- * The main function of the ACI is to control the mixer and to get a
- * product identification. On the PCM20, ACI also controls the radio
- * tuner on this card, this is supported in the Video for Linux 
- * miropcm20 driver.
- * -
- * This is a fullfeatured implementation. Unsupported features
- * are bugs... (:
- *
- * It is not longer necessary to load the mad16 module first. The
- * user is currently responsible to set the mad16 mixer correctly.
- *
- * To toggle the solo mode for full duplex operation just use the OSS
- * record switch for the pcm ('wave') controller.           Robert
- * -
- *
- * Revision history:
- *
- *   1995-11-10  Markus Kuhn <mskuhn@cip.informatik.uni-erlangen.de>
- *        First version written.
- *   1995-12-31  Markus Kuhn
- *        Second revision, general code cleanup.
- *   1996-05-16         Hannu Savolainen
- *       Integrated with other parts of the driver.
- *   1996-05-28  Markus Kuhn
- *        Initialize CS4231A mixer, make ACI first mixer,
- *        use new private mixer API for solo mode.
- *   1998-08-18  Ruurd Reitsma <R.A.Reitsma@wbmt.tudelft.nl>
- *       Small modification to export ACI functions and 
- *       complete modularisation.
- *   2000-06-20  Robert Siemer <Robert.Siemer@gmx.de>
- *        Don't initialize the CS4231A mixer anymore, so the code is
- *        working again, and other small changes to fit in todays
- *        kernels.
- *   2000-08-26  Robert Siemer
- *        Clean up and rewrite for 2.4.x. Maybe it's SMP safe now... (:
- *        ioctl bugfix, and integration of solo-mode into OSS-API,
- *        added (OSS-limited) equalizer support, return value bugfix,
- *        changed param aci_reset to reset, new params: ide, wss.
- *   2001-04-20  Robert Siemer
- *        even more cleanups...
- *   2001-10-08  Arnaldo Carvalho de Melo <acme@conectiva.com.br>
- *       Get rid of check_region, .bss optimizations, use set_current_state
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/module.h> 
-#include <linux/proc_fs.h>
-#include <linux/slab.h>
-#include <linux/mutex.h>
-
-#include <asm/io.h>
-#include <asm/uaccess.h>
-#include "sound_config.h"
-
-int aci_port;  /* as determined by bit 4 in the OPTi 929 MC4 register */
-static int aci_idcode[2];      /* manufacturer and product ID */
-int aci_version;       /* ACI firmware version */
-
-EXPORT_SYMBOL(aci_port);
-EXPORT_SYMBOL(aci_version);
-
-#include "aci.h"
-
-
-static int aci_solo;   /* status bit of the card that can't be         *
-                        * checked with ACI versions prior to 0xb0      */
-static int aci_amp;   /* status bit for power-amp/line-out level
-                          but I have no docs about what is what... */
-static int aci_micpreamp=3; /* microphone preamp-level that can't be    *
-                        * checked with ACI versions prior to 0xb0      */
-
-static int mixer_device;
-static struct mutex aci_mutex;
-
-#ifdef MODULE
-static int reset;
-module_param(reset, bool, 0);
-MODULE_PARM_DESC(reset,"When set to 1, reset aci mixer.");
-#else
-static int reset = 1;
-#endif
-
-static int ide=-1;
-module_param(ide, int, 0);
-MODULE_PARM_DESC(ide,"1 enable, 0 disable ide-port - untested"
-                " default: do nothing");
-static int wss=-1;
-module_param(wss, int, 0);
-MODULE_PARM_DESC(wss,"change between ACI/WSS-mixer; use 0 and 1 - untested"
-                " default: do nothing; for PCM1-pro only");
-
-#ifdef DEBUG
-static void print_bits(unsigned char c)
-{
-       int j;
-       printk(KERN_DEBUG "aci: ");
-
-       for (j=7; j>=0; j--) {
-               printk("%d", (c >> j) & 0x1);
-       }
-
-       printk("\n");
-}
-#endif
-
-/*
- * This busy wait code normally requires less than 15 loops and
- * practically always less than 100 loops on my i486/DX2 66 MHz.
- *
- * Warning: Waiting on the general status flag after reseting the MUTE
- * function can take a VERY long time, because the PCM12 does some kind
- * of fade-in effect. For this reason, access to the MUTE function has
- * not been implemented at all.
- *
- * - The OSS interface has no mute option. It takes about 3 seconds to
- * fade-in on my PCM20. busy_wait() handles it great now...     Robert
- */
-
-static int busy_wait(void)
-{
-       #define MINTIME 500
-       long timeout;
-       unsigned char byte;
-
-       for (timeout = 1; timeout <= MINTIME+30; timeout++) {
-               if (((byte=inb(BUSY_REGISTER)) & 1) == 0) {
-                       if (timeout >= MINTIME)
-                               printk(KERN_DEBUG "aci: Got READYFLAG in round %ld.\n", timeout-MINTIME);
-                       return byte;
-               }
-               if (timeout >= MINTIME) {
-                       long out=10*HZ;
-                       switch (timeout-MINTIME) {
-                       case 0 ... 9:
-                               out /= 10;
-                       case 10 ... 19:
-                               out /= 10;
-                       case 20 ... 30:
-                               out /= 10;
-                       default:
-                               set_current_state(TASK_UNINTERRUPTIBLE);
-                               schedule_timeout(out);
-                               break;
-                       }
-               }
-       }
-       printk(KERN_WARNING "aci: busy_wait() time out.\n");
-       return -EBUSY;
-}
-
-/* The four ACI command types are fucked up. [-:
- * implied is: 1w      - special case for INIT
- * write   is: 2w1r
- * read    is: x(1w1r) where x is 1 or 2 (1 CHECK_SIG, 1 CHECK_STER,
- *                                        1 VERSION, 2 IDCODE)
- *  the command is only in the first write, rest is protocol overhead
- *
- * indexed is technically a write and used for STATUS
- * and the special case for TUNE is: 3w1r
- * 
- * Here the new general sheme: TUNE --> aci_rw_cmd(x,  y,  z)
- *                indexed and write --> aci_rw_cmd(x,  y, -1)
- *           implied and read (x=1) --> aci_rw_cmd(x, -1, -1)
- *
- * Read (x>=2) is not implemented (only used during initialization).
- * Use aci_idcode[2] and aci_version...                    Robert
- */
-
-/* Some notes for error detection: theoretically it is possible.
- * But it doubles the I/O-traffic from ww(r) to wwwrw(r) in the normal 
- * case and doesn't seem to be designed for that...        Robert
- */
-
-static inline int aci_rawwrite(unsigned char byte)
-{
-       if (busy_wait() >= 0) {
-#ifdef DEBUG
-               printk(KERN_DEBUG "aci_rawwrite(%d)\n", byte);
-#endif
-               outb(byte, COMMAND_REGISTER);
-               return 0;
-       } else
-               return -EBUSY;
-}
-
-static inline int aci_rawread(void)
-{
-       unsigned char byte;
-
-       if (busy_wait() >= 0) {
-               byte=inb(STATUS_REGISTER);
-#ifdef DEBUG
-               printk(KERN_DEBUG "%d = aci_rawread()\n", byte);
-#endif
-               return byte;
-       } else
-               return -EBUSY;
-}
-
-
-int aci_rw_cmd(int write1, int write2, int write3)
-{
-       int write[] = {write1, write2, write3};
-       int read = -EINTR, i;
-
-       if (mutex_lock_interruptible(&aci_mutex))
-               goto out;
-
-       for (i=0; i<3; i++) {
-               if (write[i]< 0 || write[i] > 255)
-                       break;
-               else {
-                       read = aci_rawwrite(write[i]);
-                       if (read < 0)
-                               goto out_up;
-               }
-               
-       }
-       
-       read = aci_rawread();
-out_up:        mutex_unlock(&aci_mutex);
-out:   return read;
-}
-
-EXPORT_SYMBOL(aci_rw_cmd);
-
-static int setvolume(int __user *arg, 
-                    unsigned char left_index, unsigned char right_index)
-{
-       int vol, ret, uservol, buf;
-
-       __get_user(uservol, arg);
-
-       /* left channel */
-       vol = uservol & 0xff;
-       if (vol > 100)
-               vol = 100;
-       vol = SCALE(100, 0x20, vol);
-       if ((buf=aci_write_cmd(left_index, 0x20 - vol))<0)
-               return buf;
-       ret = SCALE(0x20, 100, vol);
-
-
-       /* right channel */
-       vol = (uservol >> 8) & 0xff;
-       if (vol > 100)
-               vol = 100;
-       vol = SCALE(100, 0x20, vol);
-       if ((buf=aci_write_cmd(right_index, 0x20 - vol))<0)
-               return buf;
-       ret |= SCALE(0x20, 100, vol) << 8;
-       __put_user(ret, arg);
-
-       return 0;
-}
-
-static int getvolume(int __user *arg,
-                    unsigned char left_index, unsigned char right_index)
-{
-       int vol;
-       int buf;
-
-       /* left channel */
-       if ((buf=aci_indexed_cmd(ACI_STATUS, left_index))<0)
-               return buf;
-       vol = SCALE(0x20, 100, buf < 0x20 ? 0x20-buf : 0);
-       
-       /* right channel */
-       if ((buf=aci_indexed_cmd(ACI_STATUS, right_index))<0)
-               return buf;
-       vol |= SCALE(0x20, 100, buf < 0x20 ? 0x20-buf : 0) << 8;
-
-       __put_user(vol, arg);
-
-       return 0;
-}
-
-
-/* The equalizer is somewhat strange on the ACI. From -12dB to +12dB
- * write:  0xff..down.to..0x80==0x00..up.to..0x7f
- */
-
-static inline unsigned int eq_oss2aci(unsigned int vol)
-{
-       int boost=0;
-       unsigned int ret;
-
-       if (vol > 100)
-               vol = 100;
-       if (vol > 50) {
-               vol -= 51;
-               boost=1;
-       }
-       if (boost)
-               ret=SCALE(49, 0x7e, vol)+1;
-       else
-               ret=0xff - SCALE(50, 0x7f, vol);
-       return ret;
-}
-
-static inline unsigned int eq_aci2oss(unsigned int vol)
-{
-       if (vol < 0x80)
-               return SCALE(0x7f, 50, vol) + 50;
-       else
-               return SCALE(0x7f, 50, 0xff-vol);
-}
-
-
-static int setequalizer(int __user *arg, 
-                       unsigned char left_index, unsigned char right_index)
-{
-       int buf;
-       unsigned int vol;
-
-       __get_user(vol, arg);
-
-       /* left channel */
-       if ((buf=aci_write_cmd(left_index, eq_oss2aci(vol & 0xff)))<0)
-               return buf;
-
-       /* right channel */
-       if ((buf=aci_write_cmd(right_index, eq_oss2aci((vol>>8) & 0xff)))<0)
-               return buf;
-
-       /* the ACI equalizer is more precise */
-       return 0;
-}
-
-static int getequalizer(int __user *arg,
-                       unsigned char left_index, unsigned char right_index)
-{
-       int buf;
-       unsigned int vol;
-
-       /* left channel */
-       if ((buf=aci_indexed_cmd(ACI_STATUS, left_index))<0)
-               return buf;
-       vol = eq_aci2oss(buf);
-       
-       /* right channel */
-       if ((buf=aci_indexed_cmd(ACI_STATUS, right_index))<0)
-               return buf;
-       vol |= eq_aci2oss(buf) << 8;
-
-       __put_user(vol, arg);
-
-       return 0;
-}
-
-static int aci_mixer_ioctl (int dev, unsigned int cmd, void __user * arg)
-{
-       int vol, buf;
-       int __user *p = arg;
-
-       switch (cmd) {
-       case SOUND_MIXER_WRITE_VOLUME:
-               return setvolume(p, 0x01, 0x00);
-       case SOUND_MIXER_WRITE_CD:
-               return setvolume(p, 0x3c, 0x34);
-       case SOUND_MIXER_WRITE_MIC:
-               return setvolume(p, 0x38, 0x30);
-       case SOUND_MIXER_WRITE_LINE:
-               return setvolume(p, 0x39, 0x31);
-       case SOUND_MIXER_WRITE_SYNTH:
-               return setvolume(p, 0x3b, 0x33);
-       case SOUND_MIXER_WRITE_PCM:
-               return setvolume(p, 0x3a, 0x32);
-       case MIXER_WRITE(SOUND_MIXER_RADIO): /* fall through */
-       case SOUND_MIXER_WRITE_LINE1:  /* AUX1 or radio */
-               return setvolume(p, 0x3d, 0x35);
-       case SOUND_MIXER_WRITE_LINE2:  /* AUX2 */
-               return setvolume(p, 0x3e, 0x36);
-       case SOUND_MIXER_WRITE_BASS:   /* set band one and two */
-               if (aci_idcode[1]=='C') {
-                       if ((buf=setequalizer(p, 0x48, 0x40)) || 
-                           (buf=setequalizer(p, 0x49, 0x41)));
-                       return buf;
-               }
-               break;
-       case SOUND_MIXER_WRITE_TREBLE: /* set band six and seven */
-               if (aci_idcode[1]=='C') {
-                       if ((buf=setequalizer(p, 0x4d, 0x45)) || 
-                           (buf=setequalizer(p, 0x4e, 0x46)));
-                       return buf;
-               }
-               break;
-       case SOUND_MIXER_WRITE_IGAIN:  /* MIC pre-amp */
-               if (aci_idcode[1]=='B' || aci_idcode[1]=='C') {
-                       __get_user(vol, p);
-                       vol = vol & 0xff;
-                       if (vol > 100)
-                               vol = 100;
-                       vol = SCALE(100, 3, vol);
-                       if ((buf=aci_write_cmd(ACI_WRITE_IGAIN, vol))<0)
-                               return buf;
-                       aci_micpreamp = vol;
-                       vol = SCALE(3, 100, vol);
-                       vol |= (vol << 8);
-                       __put_user(vol, p);
-                       return 0;
-               }
-               break;
-       case SOUND_MIXER_WRITE_OGAIN:  /* Power-amp/line-out level */
-               if (aci_idcode[1]=='A' || aci_idcode[1]=='B') {
-                       __get_user(buf, p);
-                       buf = buf & 0xff;
-                       if (buf > 50)
-                               vol = 1;
-                       else
-                               vol = 0;
-                       if ((buf=aci_write_cmd(ACI_SET_POWERAMP, vol))<0)
-                               return buf;
-                       aci_amp = vol;
-                       if (aci_amp)
-                               buf = (100 || 100<<8);
-                       else
-                               buf = 0;
-                       __put_user(buf, p);
-                       return 0;
-               }
-               break;
-       case SOUND_MIXER_WRITE_RECSRC:
-               /* handle solo mode control */
-               __get_user(buf, p);
-               /* unset solo when RECSRC for PCM is requested */
-               if (aci_idcode[1]=='B' || aci_idcode[1]=='C') {
-                       vol = !(buf & SOUND_MASK_PCM);
-                       if ((buf=aci_write_cmd(ACI_SET_SOLOMODE, vol))<0)
-                               return buf;
-                       aci_solo = vol;
-               }
-               buf = (SOUND_MASK_CD| SOUND_MASK_MIC| SOUND_MASK_LINE|
-                      SOUND_MASK_SYNTH| SOUND_MASK_LINE2);
-               if (aci_idcode[1] == 'C') /* PCM20 radio */
-                       buf |= SOUND_MASK_RADIO;
-               else
-                       buf |= SOUND_MASK_LINE1;
-               if (!aci_solo)
-                       buf |= SOUND_MASK_PCM;
-               __put_user(buf, p);
-               return 0;
-       case SOUND_MIXER_READ_DEVMASK:
-               buf = (SOUND_MASK_VOLUME | SOUND_MASK_CD    |
-                      SOUND_MASK_MIC    | SOUND_MASK_LINE  |
-                      SOUND_MASK_SYNTH  | SOUND_MASK_PCM   |
-                      SOUND_MASK_LINE2);
-               switch (aci_idcode[1]) {
-               case 'C': /* PCM20 radio */
-                       buf |= (SOUND_MASK_RADIO | SOUND_MASK_IGAIN |
-                               SOUND_MASK_BASS  | SOUND_MASK_TREBLE);
-                       break;
-               case 'B': /* PCM12 */
-                       buf |= (SOUND_MASK_LINE1 | SOUND_MASK_IGAIN |
-                               SOUND_MASK_OGAIN);
-                       break;
-               case 'A': /* PCM1-pro */
-                       buf |= (SOUND_MASK_LINE1 | SOUND_MASK_OGAIN);
-                       break;
-               default:
-                       buf |= SOUND_MASK_LINE1;
-               }
-               __put_user(buf, p);
-               return 0;
-       case SOUND_MIXER_READ_STEREODEVS:
-               buf = (SOUND_MASK_VOLUME | SOUND_MASK_CD    |
-                      SOUND_MASK_MIC    | SOUND_MASK_LINE  |
-                      SOUND_MASK_SYNTH  | SOUND_MASK_PCM   |
-                      SOUND_MASK_LINE2);
-               switch (aci_idcode[1]) {
-               case 'C': /* PCM20 radio */
-                       buf |= (SOUND_MASK_RADIO |
-                               SOUND_MASK_BASS  | SOUND_MASK_TREBLE);
-                       break;
-               default:
-                       buf |= SOUND_MASK_LINE1;
-               }
-               __put_user(buf, p);
-               return 0;
-       case SOUND_MIXER_READ_RECMASK:
-               buf = (SOUND_MASK_CD| SOUND_MASK_MIC| SOUND_MASK_LINE|
-                      SOUND_MASK_SYNTH| SOUND_MASK_LINE2| SOUND_MASK_PCM);
-               if (aci_idcode[1] == 'C') /* PCM20 radio */
-                       buf |= SOUND_MASK_RADIO;
-               else
-                       buf |= SOUND_MASK_LINE1;
-
-               __put_user(buf, p);
-               return 0;
-       case SOUND_MIXER_READ_RECSRC:
-               buf = (SOUND_MASK_CD    | SOUND_MASK_MIC   | SOUND_MASK_LINE  |
-                      SOUND_MASK_SYNTH | SOUND_MASK_LINE2);
-               /* do we need aci_solo or can I get it from the ACI? */
-               switch (aci_idcode[1]) {
-               case 'B': /* PCM12 */
-               case 'C': /* PCM20 radio */
-                       if (aci_version >= 0xb0) {
-                               if ((vol=aci_rw_cmd(ACI_STATUS,
-                                                   ACI_S_GENERAL, -1))<0)
-                                       return vol;
-                               if (vol & 0x20)
-                                       buf |= SOUND_MASK_PCM;
-                       }
-                       else
-                               if (!aci_solo)
-                                       buf |= SOUND_MASK_PCM;
-                       break;
-               default:
-                       buf |= SOUND_MASK_PCM;
-               }
-               if (aci_idcode[1] == 'C') /* PCM20 radio */
-                       buf |= SOUND_MASK_RADIO;
-               else
-                       buf |= SOUND_MASK_LINE1;
-
-               __put_user(buf, p);
-               return 0;
-       case SOUND_MIXER_READ_CAPS:
-               __put_user(0, p);
-               return 0;
-       case SOUND_MIXER_READ_VOLUME:
-               return getvolume(p, 0x04, 0x03);
-       case SOUND_MIXER_READ_CD:
-               return getvolume(p, 0x0a, 0x09);
-       case SOUND_MIXER_READ_MIC:
-               return getvolume(p, 0x06, 0x05);
-       case SOUND_MIXER_READ_LINE:
-               return getvolume(p, 0x08, 0x07);
-       case SOUND_MIXER_READ_SYNTH:
-               return getvolume(p, 0x0c, 0x0b);
-       case SOUND_MIXER_READ_PCM:
-               return getvolume(p, 0x0e, 0x0d);
-       case MIXER_READ(SOUND_MIXER_RADIO): /* fall through */
-       case SOUND_MIXER_READ_LINE1:  /* AUX1 */
-               return getvolume(p, 0x11, 0x10);
-       case SOUND_MIXER_READ_LINE2:  /* AUX2 */
-               return getvolume(p, 0x13, 0x12);
-       case SOUND_MIXER_READ_BASS:   /* get band one */
-               if (aci_idcode[1]=='C') {
-                       return getequalizer(p, 0x23, 0x22);
-               }
-               break;
-       case SOUND_MIXER_READ_TREBLE: /* get band seven */
-               if (aci_idcode[1]=='C') {
-                       return getequalizer(p, 0x2f, 0x2e);
-               }
-               break;
-       case SOUND_MIXER_READ_IGAIN:  /* MIC pre-amp */
-               if (aci_idcode[1]=='B' || aci_idcode[1]=='C') {
-                       /* aci_micpreamp or ACI? */
-                       if (aci_version >= 0xb0) {
-                               if ((buf=aci_indexed_cmd(ACI_STATUS,
-                                                        ACI_S_READ_IGAIN))<0)
-                                       return buf;
-                       }
-                       else
-                               buf=aci_micpreamp;
-                       vol = SCALE(3, 100, buf <= 3 ? buf : 3);
-                       vol |= vol << 8;
-                       __put_user(vol, p);
-                       return 0;
-               }
-               break;
-       case SOUND_MIXER_READ_OGAIN:
-               if (aci_amp)
-                       buf = (100 || 100<<8);
-               else
-                       buf = 0;
-               __put_user(buf, p);
-               return 0;
-       }
-       return -EINVAL;
-}
-
-static struct mixer_operations aci_mixer_operations =
-{
-       .owner = THIS_MODULE,
-       .id    = "ACI",
-       .ioctl = aci_mixer_ioctl
-};
-
-/*
- * There is also an internal mixer in the codec (CS4231A or AD1845),
- * that deserves no purpose in an ACI based system which uses an
- * external ACI controlled stereo mixer. Make sure that this codec
- * mixer has the AUX1 input selected as the recording source, that the
- * input gain is set near maximum and that the other channels going
- * from the inputs to the codec output are muted.
- */
-
-static int __init attach_aci(void)
-{
-       char *boardname;
-       int i, rc = -EBUSY;
-
-       mutex_init(&aci_mutex);
-
-       outb(0xE3, 0xf8f); /* Write MAD16 password */
-       aci_port = (inb(0xf90) & 0x10) ?
-               0x344: 0x354; /* Get aci_port from MC4_PORT */
-
-       if (!request_region(aci_port, 3, "sound mixer (ACI)")) {
-               printk(KERN_NOTICE
-                      "aci: I/O area 0x%03x-0x%03x already used.\n",
-                      aci_port, aci_port+2);
-               goto out;
-       }
-
-       /* force ACI into a known state */
-       rc = -EFAULT;
-       for (i=0; i<3; i++)
-               if (aci_rw_cmd(ACI_ERROR_OP, -1, -1)<0)
-                       goto out_release_region;
-
-       /* official this is one aci read call: */
-       rc = -EFAULT;
-       if ((aci_idcode[0]=aci_rw_cmd(ACI_READ_IDCODE, -1, -1))<0 ||
-           (aci_idcode[1]=aci_rw_cmd(ACI_READ_IDCODE, -1, -1))<0) {
-               printk(KERN_ERR "aci: Failed to read idcode on 0x%03x.\n",
-                      aci_port);
-               goto out_release_region;
-       }
-
-       if ((aci_version=aci_rw_cmd(ACI_READ_VERSION, -1, -1))<0) {
-               printk(KERN_ERR "aci: Failed to read version on 0x%03x.\n",
-                      aci_port);
-               goto out_release_region;
-       }
-
-       if (aci_idcode[0] == 'm') {
-               /* It looks like a miro sound card. */
-               switch (aci_idcode[1]) {
-               case 'A':
-                       boardname = "PCM1 pro / early PCM12";
-                       break;
-               case 'B':
-                       boardname = "PCM12";
-                       break;
-               case 'C':
-                       boardname = "PCM20 radio";
-                       break;
-               default:
-                       boardname = "unknown miro";
-               }
-       } else {
-               printk(KERN_WARNING "aci: Warning: unsupported card! - "
-                      "no hardware, no specs...\n");
-               boardname = "unknown Cardinal Technologies";
-       }
-
-       printk(KERN_INFO "<ACI 0x%02x, id %02x/%02x \"%c/%c\", (%s)> at 0x%03x\n",
-              aci_version,
-              aci_idcode[0], aci_idcode[1],
-              aci_idcode[0], aci_idcode[1],
-              boardname, aci_port);
-
-       rc = -EBUSY;
-       if (reset) {
-               /* first write()s after reset fail with my PCM20 */
-               if (aci_rw_cmd(ACI_INIT, -1, -1)<0 ||
-                   aci_rw_cmd(ACI_ERROR_OP, ACI_ERROR_OP, ACI_ERROR_OP)<0 ||
-                   aci_rw_cmd(ACI_ERROR_OP, ACI_ERROR_OP, ACI_ERROR_OP)<0)
-                       goto out_release_region;
-       }
-
-       /* the PCM20 is muted after reset (and reboot) */
-       if (aci_rw_cmd(ACI_SET_MUTE, 0x00, -1)<0)
-               goto out_release_region;
-
-       if (ide>=0)
-               if (aci_rw_cmd(ACI_SET_IDE, !ide, -1)<0)
-                       goto out_release_region;
-       
-       if (wss>=0 && aci_idcode[1]=='A')
-               if (aci_rw_cmd(ACI_SET_WSS, !!wss, -1)<0)
-                       goto out_release_region;
-
-       mixer_device = sound_install_mixer(MIXER_DRIVER_VERSION, boardname,
-                                          &aci_mixer_operations,
-                                          sizeof(aci_mixer_operations), NULL);
-       rc = 0;
-       if (mixer_device < 0) {
-               printk(KERN_ERR "aci: Failed to install mixer.\n");
-               rc = mixer_device;
-               goto out_release_region;
-       } /* else Maybe initialize the CS4231A mixer here... */
-out:   return rc;
-out_release_region:
-       release_region(aci_port, 3);
-       goto out;
-}
-
-static void __exit unload_aci(void)
-{
-       sound_unload_mixerdev(mixer_device);
-       release_region(aci_port, 3);
-}
-
-module_init(attach_aci);
-module_exit(unload_aci);
-MODULE_LICENSE("GPL");
diff --git a/sound/oss/aci.h b/sound/oss/aci.h
deleted file mode 100644 (file)
index 20102ee..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef _ACI_H_
-#define _ACI_H_
-
-extern int aci_port;
-extern int aci_version;                /* ACI firmware version */
-extern int aci_rw_cmd(int write1, int write2, int write3);
-
-#define aci_indexed_cmd(a, b) aci_rw_cmd(a, b, -1)
-#define aci_write_cmd(a, b)   aci_rw_cmd(a, b, -1)
-#define aci_read_cmd(a)       aci_rw_cmd(a,-1, -1)
-
-#define COMMAND_REGISTER    (aci_port)      /* write register */
-#define STATUS_REGISTER     (aci_port + 1)  /* read register */
-#define BUSY_REGISTER       (aci_port + 2)  /* also used for rds */
-
-#define RDS_REGISTER        BUSY_REGISTER
-
-#define ACI_SET_MUTE          0x0d
-#define ACI_SET_POWERAMP      0x0f
-#define ACI_SET_TUNERMUTE     0xa3
-#define ACI_SET_TUNERMONO     0xa4
-#define ACI_SET_IDE           0xd0
-#define ACI_SET_WSS           0xd1
-#define ACI_SET_SOLOMODE      0xd2
-#define ACI_WRITE_IGAIN       0x03
-#define ACI_WRITE_TUNE        0xa7
-#define ACI_READ_TUNERSTEREO  0xa8
-#define ACI_READ_TUNERSTATION 0xa9
-#define ACI_READ_VERSION      0xf1
-#define ACI_READ_IDCODE       0xf2
-#define ACI_INIT              0xff
-#define ACI_STATUS            0xf0
-#define     ACI_S_GENERAL     0x00
-#define     ACI_S_READ_IGAIN  0x21
-#define ACI_ERROR_OP          0xdf
-
-/*
- * The following macro SCALE can be used to scale one integer volume
- * value into another one using only integer arithmetic. If the input
- * value x is in the range 0 <= x <= xmax, then the result will be in
- * the range 0 <= SCALE(xmax,ymax,x) <= ymax.
- *
- * This macro has for all xmax, ymax > 0 and all 0 <= x <= xmax the
- * following nice properties:
- *
- * - SCALE(xmax,ymax,xmax) = ymax
- * - SCALE(xmax,ymax,0) = 0
- * - SCALE(xmax,ymax,SCALE(ymax,xmax,SCALE(xmax,ymax,x))) = SCALE(xmax,ymax,x)
- *
- * In addition, the rounding error is minimal and nicely distributed.
- * The proofs are left as an exercise to the reader.
- */
-
-#define SCALE(xmax,ymax,x) (((x)*(ymax)+(xmax)/2)/(xmax))
-
-
-#endif  /* _ACI_H_ */
diff --git a/sound/oss/ad1816.c b/sound/oss/ad1816.c
deleted file mode 100644 (file)
index caabf31..0000000
+++ /dev/null
@@ -1,1368 +0,0 @@
-/*
- *
- * AD1816 lowlevel sound driver for Linux 2.6.0 and above
- *
- * Copyright (C) 1998-2003 by Thorsten Knabe <linux@thorsten-knabe.de>
- *
- * Based on the CS4232/AD1848 driver Copyright (C) by Hannu Savolainen 1993-1996
- *
- *
- * version: 1.5
- * status: beta
- * date: 2003/07/15
- *
- * Changes:
- *     Oleg Drokin: Some cleanup of load/unload functions.     1998/11/24
- *     
- *     Thorsten Knabe: attach and unload rewritten, 
- *     some argument checks added                              1998/11/30
- *
- *     Thorsten Knabe: Buggy isa bridge workaround added       1999/01/16
- *     
- *     David Moews/Thorsten Knabe: Introduced options 
- *     parameter. Added slightly modified patch from 
- *     David Moews to disable dsp audio sources by setting 
- *     bit 0 of options parameter. This seems to be
- *     required by some Aztech/Newcom SC-16 cards.             1999/04/18
- *
- *     Christoph Hellwig: Adapted to module_init/module_exit.  2000/03/03
- *
- *     Christoph Hellwig: Added isapnp support                 2000/03/15
- *
- *     Arnaldo Carvalho de Melo: get rid of check_region       2001/10/07
- *      
- *      Thorsten Knabe: Compiling with CONFIG_PNP enabled
- *     works again. It is now possible to use more than one 
- *     AD1816 sound card. Sample rate now may be changed during
- *     playback/capture. printk() uses log levels everywhere.
- *     SMP fixes. DMA handling fixes.
- *     Other minor code cleanup.                               2003/07/15
- *
- */
-
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/isapnp.h>
-#include <linux/stddef.h>
-#include <linux/spinlock.h>
-#include "sound_config.h"
-
-#define DEBUGNOISE(x)
-
-#define CHECK_FOR_POWER { int timeout=100; \
-  while (timeout > 0 && (inb(devc->base)&0x80)!= 0x80) {\
-          timeout--; \
-  } \
-  if (timeout==0) {\
-          printk(KERN_WARNING "ad1816: Check for power failed in %s line: %d\n",__FILE__,__LINE__); \
-  } \
-}
-
-/* structure to hold device specific information */
-typedef struct
-{
-        int            base;          /* set in attach */
-       int            irq;
-       int            dma_playback;
-        int            dma_capture;
-  
-       int            opened;         /* open */
-        int            speed;  
-       int            channels;
-       int            audio_format;
-        int            audio_mode; 
-  
-        int            recmask;        /* setup */
-       unsigned char  format_bits;
-       int            supported_devices;
-       int            supported_rec_devices;
-       unsigned short levels[SOUND_MIXER_NRDEVICES];
-                                       /* misc */
-       struct pnp_dev *pnpdev;  /* configured via pnp */
-        int            dev_no;   /* this is the # in audio_devs and NOT 
-                                   in ad1816_info */
-       spinlock_t      lock;  
-} ad1816_info;
-
-static int nr_ad1816_devs;
-static int ad1816_clockfreq = 33000;
-static int options;
-
-/* supported audio formats */
-static int  ad_format_mask =
-AFMT_U8 | AFMT_S16_LE | AFMT_S16_BE | AFMT_MU_LAW | AFMT_A_LAW;
-
-/* array of device info structures */
-static ad1816_info dev_info[MAX_AUDIO_DEV];
-
-
-/* ------------------------------------------------------------------- */
-
-/* functions for easier access to inderect registers */
-
-static int ad_read (ad1816_info * devc, int reg)
-{
-       int result;
-       
-       CHECK_FOR_POWER;
-       outb ((unsigned char) (reg & 0x3f), devc->base+0);
-       result = inb(devc->base+2);
-       result+= inb(devc->base+3)<<8;
-       return (result);
-}
-
-
-static void ad_write (ad1816_info * devc, int reg, int data)
-{
-       CHECK_FOR_POWER;
-       outb ((unsigned char) (reg & 0xff), devc->base+0);
-       outb ((unsigned char) (data & 0xff),devc->base+2);
-       outb ((unsigned char) ((data>>8)&0xff),devc->base+3);
-}
-
-/* ------------------------------------------------------------------- */
-
-/* function interface required by struct audio_driver */
-
-static void ad1816_halt_input (int dev)
-{
-       unsigned long flags;
-       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
-       unsigned char buffer;
-       
-       DEBUGNOISE(printk(KERN_DEBUG "ad1816: halt_input called\n"));
-       
-       spin_lock_irqsave(&devc->lock,flags); 
-       
-       if(!isa_dma_bridge_buggy) {
-               disable_dma(audio_devs[dev]->dmap_in->dma);
-       }
-       
-       buffer=inb(devc->base+9);
-       if (buffer & 0x01) {
-               /* disable capture */
-               outb(buffer & ~0x01,devc->base+9); 
-       }
-
-       if(!isa_dma_bridge_buggy) {
-               enable_dma(audio_devs[dev]->dmap_in->dma);
-       }
-
-       /* Clear interrupt status */
-       outb (~0x40, devc->base+1);     
-       
-       devc->audio_mode &= ~PCM_ENABLE_INPUT;
-       spin_unlock_irqrestore(&devc->lock,flags);
-}
-
-static void ad1816_halt_output (int dev)
-{
-       unsigned long  flags;
-       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
-       
-       unsigned char buffer;
-
-       DEBUGNOISE(printk(KERN_DEBUG "ad1816: halt_output called!\n"));
-
-       spin_lock_irqsave(&devc->lock,flags); 
-       /* Mute pcm output */
-       ad_write(devc, 4, ad_read(devc,4)|0x8080);
-
-       if(!isa_dma_bridge_buggy) {
-               disable_dma(audio_devs[dev]->dmap_out->dma);
-       }
-
-       buffer=inb(devc->base+8);
-       if (buffer & 0x01) {
-               /* disable capture */
-               outb(buffer & ~0x01,devc->base+8); 
-       }
-
-       if(!isa_dma_bridge_buggy) {
-               enable_dma(audio_devs[dev]->dmap_out->dma);
-       }
-
-       /* Clear interrupt status */
-       outb ((unsigned char)~0x80, devc->base+1);      
-
-       devc->audio_mode &= ~PCM_ENABLE_OUTPUT;
-       spin_unlock_irqrestore(&devc->lock,flags);
-}
-
-static void ad1816_output_block (int dev, unsigned long buf, 
-                                int count, int intrflag)
-{
-       unsigned long flags;
-       unsigned long cnt;
-       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
-       
-       DEBUGNOISE(printk(KERN_DEBUG "ad1816: output_block called buf=%ld count=%d flags=%d\n",buf,count,intrflag));
-  
-       cnt = count/4 - 1;
-  
-       spin_lock_irqsave(&devc->lock,flags);
-       
-       /* set transfer count */
-       ad_write (devc, 8, cnt & 0xffff); 
-       
-       devc->audio_mode |= PCM_ENABLE_OUTPUT; 
-       spin_unlock_irqrestore(&devc->lock,flags);
-}
-
-
-static void ad1816_start_input (int dev, unsigned long buf, int count,
-                               int intrflag)
-{
-       unsigned long flags;
-       unsigned long  cnt;
-       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
-       
-       DEBUGNOISE(printk(KERN_DEBUG "ad1816: start_input called buf=%ld count=%d flags=%d\n",buf,count,intrflag));
-
-       cnt = count/4 - 1;
-
-       spin_lock_irqsave(&devc->lock,flags);
-
-       /* set transfer count */
-       ad_write (devc, 10, cnt & 0xffff); 
-       devc->audio_mode |= PCM_ENABLE_INPUT;
-       spin_unlock_irqrestore(&devc->lock,flags);
-}
-
-static int ad1816_prepare_for_input (int dev, int bsize, int bcount)
-{
-       unsigned long flags;
-       unsigned int freq;
-       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
-       unsigned char fmt_bits;
-       
-       DEBUGNOISE(printk(KERN_DEBUG "ad1816: prepare_for_input called: bsize=%d bcount=%d\n",bsize,bcount));
-
-       spin_lock_irqsave(&devc->lock,flags);
-       fmt_bits= (devc->format_bits&0x7)<<3;
-       
-       /* set mono/stereo mode */
-       if (devc->channels > 1) {
-               fmt_bits |=0x4;
-       }
-       /* set Mono/Stereo in playback/capture register */
-       outb( (inb(devc->base+8) & ~0x3C)|fmt_bits, devc->base+8); 
-       outb( (inb(devc->base+9) & ~0x3C)|fmt_bits, devc->base+9);
-
-       freq=((unsigned int)devc->speed*33000)/ad1816_clockfreq; 
-
-       /* write playback/capture speeds */
-       ad_write (devc, 2, freq & 0xffff);      
-       ad_write (devc, 3, freq & 0xffff);      
-
-       spin_unlock_irqrestore(&devc->lock,flags);
-
-       ad1816_halt_input(dev);
-       return 0;
-}
-
-static int ad1816_prepare_for_output (int dev, int bsize, int bcount)
-{
-       unsigned long flags;
-       unsigned int freq;
-       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
-       unsigned char fmt_bits;
-
-       DEBUGNOISE(printk(KERN_DEBUG "ad1816: prepare_for_output called: bsize=%d bcount=%d\n",bsize,bcount));
-
-       spin_lock_irqsave(&devc->lock,flags);
-
-       fmt_bits= (devc->format_bits&0x7)<<3;
-       /* set mono/stereo mode */
-       if (devc->channels > 1) {
-               fmt_bits |=0x4;
-       }
-
-       /* write format bits to playback/capture registers */
-       outb( (inb(devc->base+8) & ~0x3C)|fmt_bits, devc->base+8); 
-       outb( (inb(devc->base+9) & ~0x3C)|fmt_bits, devc->base+9);
-  
-       freq=((unsigned int)devc->speed*33000)/ad1816_clockfreq; 
-       
-       /* write playback/capture speeds */
-       ad_write (devc, 2, freq & 0xffff);
-       ad_write (devc, 3, freq & 0xffff);
-
-       spin_unlock_irqrestore(&devc->lock,flags);
-       
-       ad1816_halt_output(dev);
-       return 0;
-
-}
-
-static void ad1816_trigger (int dev, int state) 
-{
-       unsigned long flags;
-       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
-
-       DEBUGNOISE(printk(KERN_DEBUG "ad1816: trigger called! (devc=%d,devc->base=%d\n", devc, devc->base));
-
-       /* mode may have changed */
-
-       spin_lock_irqsave(&devc->lock,flags);
-
-       /* mask out modes not specified on open call */
-       state &= devc->audio_mode; 
-                               
-       /* setup soundchip to new io-mode */
-       if (state & PCM_ENABLE_INPUT) {
-               /* enable capture */
-               outb(inb(devc->base+9)|0x01, devc->base+9);
-       } else {
-               /* disable capture */
-               outb(inb(devc->base+9)&~0x01, devc->base+9);
-       }
-
-       if (state & PCM_ENABLE_OUTPUT) {
-               /* enable playback */
-               outb(inb(devc->base+8)|0x01, devc->base+8);
-               /* unmute pcm output */
-               ad_write(devc, 4, ad_read(devc,4)&~0x8080);
-       } else {
-               /* mute pcm output */
-               ad_write(devc, 4, ad_read(devc,4)|0x8080);
-               /* disable capture */
-               outb(inb(devc->base+8)&~0x01, devc->base+8);
-       }
-       spin_unlock_irqrestore(&devc->lock,flags);
-}
-
-
-/* halt input & output */
-static void ad1816_halt (int dev)
-{
-       ad1816_halt_input(dev);
-       ad1816_halt_output(dev);
-}
-
-static void ad1816_reset (int dev)
-{
-       ad1816_halt (dev);
-}
-
-/* set playback speed */
-static int ad1816_set_speed (int dev, int arg)
-{
-       unsigned long flags;
-       unsigned int freq;
-       int ret;
-
-       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
-       
-       spin_lock_irqsave(&devc->lock, flags);
-       if (arg == 0) {
-               ret = devc->speed;
-               spin_unlock_irqrestore(&devc->lock, flags);
-               return ret;
-       }
-       /* range checking */
-       if (arg < 4000) {
-               arg = 4000;
-       }
-       if (arg > 55000) {
-               arg = 55000;
-       }
-       devc->speed = arg;
-
-       /* change speed during playback */
-       freq=((unsigned int)devc->speed*33000)/ad1816_clockfreq; 
-       /* write playback/capture speeds */
-       ad_write (devc, 2, freq & 0xffff);      
-       ad_write (devc, 3, freq & 0xffff);      
-
-       ret = devc->speed;
-       spin_unlock_irqrestore(&devc->lock, flags);
-       return ret;
-
-}
-
-static unsigned int ad1816_set_bits (int dev, unsigned int arg)
-{
-       unsigned long flags;
-       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
-       
-       static struct format_tbl {
-               int             format;
-               unsigned char   bits;
-       } format2bits[] = {
-               { 0, 0 },
-               { AFMT_MU_LAW, 1 },
-               { AFMT_A_LAW, 3 },
-               { AFMT_IMA_ADPCM, 0 },
-               { AFMT_U8, 0 },
-               { AFMT_S16_LE, 2 },
-               { AFMT_S16_BE, 6 },
-               { AFMT_S8, 0 },
-               { AFMT_U16_LE, 0 },
-               { AFMT_U16_BE, 0 }
-       };
-
-       int  i, n = sizeof (format2bits) / sizeof (struct format_tbl);
-
-       spin_lock_irqsave(&devc->lock, flags);
-       /* return current format */
-       if (arg == 0) {
-               arg = devc->audio_format;
-               spin_unlock_irqrestore(&devc->lock, flags);
-               return arg;
-       }
-       devc->audio_format = arg;
-
-       /* search matching format bits */
-       for (i = 0; i < n; i++)
-               if (format2bits[i].format == arg) {
-                       devc->format_bits = format2bits[i].bits;
-                       devc->audio_format = arg;
-                       spin_unlock_irqrestore(&devc->lock, flags);
-                       return arg;
-               }
-
-       /* Still hanging here. Something must be terribly wrong */
-       devc->format_bits = 0;
-       devc->audio_format = AFMT_U8;
-       spin_unlock_irqrestore(&devc->lock, flags);
-       return(AFMT_U8); 
-}
-
-static short ad1816_set_channels (int dev, short arg)
-{
-       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
-
-       if (arg != 1 && arg != 2)
-               return devc->channels;
-
-       devc->channels = arg;
-       return arg;
-}
-
-/* open device */
-static int ad1816_open (int dev, int mode) 
-{
-       ad1816_info    *devc = NULL;
-       unsigned long   flags;
-
-       /* is device number valid ? */
-       if (dev < 0 || dev >= num_audiodevs)
-               return -(ENXIO);
-
-       /* get device info of this dev */
-       devc = (ad1816_info *) audio_devs[dev]->devc; 
-
-       /* make check if device already open atomic */
-       spin_lock_irqsave(&devc->lock,flags);
-
-       if (devc->opened) {
-               spin_unlock_irqrestore(&devc->lock,flags);
-               return -(EBUSY);
-       }
-
-       /* mark device as open */
-       devc->opened = 1; 
-
-       devc->audio_mode = 0;
-       devc->speed = 8000;
-       devc->audio_format=AFMT_U8;
-       devc->channels=1;
-       spin_unlock_irqrestore(&devc->lock,flags);
-       ad1816_reset(devc->dev_no); /* halt all pending output */
-       return 0;
-}
-
-static void ad1816_close (int dev) /* close device */
-{
-       unsigned long flags;
-       ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
-
-       /* halt all pending output */
-       ad1816_reset(devc->dev_no); 
-
-       spin_lock_irqsave(&devc->lock,flags);
-       devc->opened = 0;
-       devc->audio_mode = 0;
-       devc->speed = 8000;
-       devc->audio_format=AFMT_U8;
-       devc->format_bits = 0;
-       spin_unlock_irqrestore(&devc->lock,flags);
-}
-
-
-/* ------------------------------------------------------------------- */
-
-/* Audio driver structure */
-
-static struct audio_driver ad1816_audio_driver =
-{
-       .owner                  = THIS_MODULE,
-       .open                   = ad1816_open,
-       .close                  = ad1816_close,
-       .output_block           = ad1816_output_block,
-       .start_input            = ad1816_start_input,
-       .prepare_for_input      = ad1816_prepare_for_input,
-       .prepare_for_output     = ad1816_prepare_for_output,
-       .halt_io                = ad1816_halt,
-       .halt_input             = ad1816_halt_input,
-       .halt_output            = ad1816_halt_output,
-       .trigger                = ad1816_trigger,
-       .set_speed              = ad1816_set_speed,
-       .set_bits               = ad1816_set_bits,
-       .set_channels           = ad1816_set_channels,
-};
-
-
-/* ------------------------------------------------------------------- */
-
-/* Interrupt handler */
-
-
-static irqreturn_t ad1816_interrupt (int irq, void *dev_id)
-{
-       unsigned char   status;
-       ad1816_info     *devc = (ad1816_info *)dev_id;
-       
-       if (irq < 0 || irq > 15) {
-               printk(KERN_WARNING "ad1816: Got bogus interrupt %d\n", irq);
-               return IRQ_NONE;
-       }
-
-       spin_lock(&devc->lock);
-
-       /* read interrupt register */
-       status = inb (devc->base+1); 
-       /* Clear all interrupt  */
-       outb (~status, devc->base+1);   
-
-       DEBUGNOISE(printk(KERN_DEBUG "ad1816: Got interrupt subclass %d\n",status));
-
-       if (status == 0) {
-               DEBUGNOISE(printk(KERN_DEBUG "ad1816: interrupt: Got interrupt, but no source.\n"));
-               spin_unlock(&devc->lock);
-               return IRQ_NONE;
-       }
-
-       if (devc->opened && (devc->audio_mode & PCM_ENABLE_INPUT) && (status&64))
-               DMAbuf_inputintr (devc->dev_no);
-
-       if (devc->opened && (devc->audio_mode & PCM_ENABLE_OUTPUT) && (status & 128))
-               DMAbuf_outputintr (devc->dev_no, 1);
-
-       spin_unlock(&devc->lock);
-       return IRQ_HANDLED;
-}
-
-/* ------------------------------------------------------------------- */
-
-/* Mixer stuff */
-
-struct mixer_def {
-       unsigned int regno: 7;
-       unsigned int polarity:1;        /* 0=normal, 1=reversed */
-       unsigned int bitpos:4;
-       unsigned int nbits:4;
-};
-
-static char mix_cvt[101] = {
-        0, 0, 3, 7,10,13,16,19,21,23,26,28,30,32,34,35,37,39,40,42,
-       43,45,46,47,49,50,51,52,53,55,56,57,58,59,60,61,62,63,64,65,
-       65,66,67,68,69,70,70,71,72,73,73,74,75,75,76,77,77,78,79,79,
-       80,81,81,82,82,83,84,84,85,85,86,86,87,87,88,88,89,89,90,90,
-       91,91,92,92,93,93,94,94,95,95,96,96,96,97,97,98,98,98,99,99,
-       100
-};
-
-typedef struct mixer_def mixer_ent;
-
-/*
- * Most of the mixer entries work in backwards. Setting the polarity field
- * makes them to work correctly.
- *
- * The channel numbering used by individual soundcards is not fixed. Some
- * cards have assigned different meanings for the AUX1, AUX2 and LINE inputs.
- * The current version doesn't try to compensate this.
- */
-
-#define MIX_ENT(name, reg_l, pola_l, pos_l, len_l, reg_r, pola_r, pos_r, len_r)        \
-  {{reg_l, pola_l, pos_l, len_l}, {reg_r, pola_r, pos_r, len_r}}
-
-
-static mixer_ent mix_devices[SOUND_MIXER_NRDEVICES][2] = {
-MIX_ENT(SOUND_MIXER_VOLUME,    14, 1, 8, 5,    14, 1, 0, 5),
-MIX_ENT(SOUND_MIXER_BASS,       0, 0, 0, 0,     0, 0, 0, 0),
-MIX_ENT(SOUND_MIXER_TREBLE,     0, 0, 0, 0,     0, 0, 0, 0),
-MIX_ENT(SOUND_MIXER_SYNTH,      5, 1, 8, 6,     5, 1, 0, 6),
-MIX_ENT(SOUND_MIXER_PCM,        4, 1, 8, 6,     4, 1, 0, 6),
-MIX_ENT(SOUND_MIXER_SPEAKER,    0, 0, 0, 0,     0, 0, 0, 0),
-MIX_ENT(SOUND_MIXER_LINE,      18, 1, 8, 5,    18, 1, 0, 5),
-MIX_ENT(SOUND_MIXER_MIC,       19, 1, 8, 5,    19, 1, 0, 5),
-MIX_ENT(SOUND_MIXER_CD,                15, 1, 8, 5,    15, 1, 0, 5),
-MIX_ENT(SOUND_MIXER_IMIX,       0, 0, 0, 0,     0, 0, 0, 0),
-MIX_ENT(SOUND_MIXER_ALTPCM,     0, 0, 0, 0,     0, 0, 0, 0),
-MIX_ENT(SOUND_MIXER_RECLEV,    20, 0, 8, 4,    20, 0, 0, 4),
-MIX_ENT(SOUND_MIXER_IGAIN,      0, 0, 0, 0,     0, 0, 0, 0),
-MIX_ENT(SOUND_MIXER_OGAIN,      0, 0, 0, 0,     0, 0, 0, 0),
-MIX_ENT(SOUND_MIXER_LINE1,     17, 1, 8, 5,    17, 1, 0, 5),
-MIX_ENT(SOUND_MIXER_LINE2,     16, 1, 8, 5,    16, 1, 0, 5),
-MIX_ENT(SOUND_MIXER_LINE3,      39, 0, 9, 4,    39, 1, 0, 5)
-};
-
-
-static unsigned short default_mixer_levels[SOUND_MIXER_NRDEVICES] =
-{
-       0x4343,         /* Master Volume */
-       0x3232,         /* Bass */
-       0x3232,         /* Treble */
-       0x0000,         /* FM */
-       0x4343,         /* PCM */
-       0x0000,         /* PC Speaker */
-       0x0000,         /* Ext Line */
-       0x0000,         /* Mic */
-       0x0000,         /* CD */
-       0x0000,         /* Recording monitor */
-       0x0000,         /* SB PCM */
-       0x0000,         /* Recording level */
-       0x0000,         /* Input gain */
-       0x0000,         /* Output gain */
-       0x0000,         /* Line1 */
-       0x0000,         /* Line2 */
-       0x0000          /* Line3 (usually line in)*/
-};
-
-#define LEFT_CHN       0
-#define RIGHT_CHN      1
-
-
-
-static int
-ad1816_set_recmask (ad1816_info * devc, int mask)
-{
-       unsigned long   flags;
-       unsigned char   recdev;
-       int             i, n;
-       
-       spin_lock_irqsave(&devc->lock, flags);
-       mask &= devc->supported_rec_devices;
-       
-       n = 0;
-       /* Count selected device bits */
-       for (i = 0; i < 32; i++)
-               if (mask & (1 << i))
-                       n++;
-       
-       if (n == 0)
-               mask = SOUND_MASK_MIC;
-       else if (n != 1) { /* Too many devices selected */
-               /* Filter out active settings */
-               mask &= ~devc->recmask; 
-               
-               n = 0;
-               /* Count selected device bits */
-               for (i = 0; i < 32; i++) 
-                       if (mask & (1 << i))
-                               n++;
-               
-               if (n != 1)
-                       mask = SOUND_MASK_MIC;
-       }
-       
-       switch (mask) {
-       case SOUND_MASK_MIC:
-               recdev = 5;
-               break;
-               
-       case SOUND_MASK_LINE:
-               recdev = 0;
-               break;
-               
-       case SOUND_MASK_CD:
-               recdev = 2;
-               break;
-               
-       case SOUND_MASK_LINE1:
-               recdev = 4;
-               break;
-               
-       case SOUND_MASK_LINE2:
-               recdev = 3;
-               break;
-               
-       case SOUND_MASK_VOLUME:
-               recdev = 1;
-               break;
-               
-       default:
-               mask = SOUND_MASK_MIC;
-               recdev = 5;
-       }
-       
-       recdev <<= 4;
-       ad_write (devc, 20, 
-                 (ad_read (devc, 20) & 0x8f8f) | recdev | (recdev<<8));
-
-       devc->recmask = mask;
-       spin_unlock_irqrestore(&devc->lock, flags);
-       return mask;
-}
-
-static void
-change_bits (int *regval, int dev, int chn, int newval)
-{
-       unsigned char   mask;
-       int             shift;
-  
-       /* Reverse polarity*/
-
-       if (mix_devices[dev][chn].polarity == 1) 
-               newval = 100 - newval;
-
-       mask = (1 << mix_devices[dev][chn].nbits) - 1;
-       shift = mix_devices[dev][chn].bitpos;
-       /* Scale it */
-       newval = (int) ((newval * mask) + 50) / 100;    
-       /* Clear bits */
-       *regval &= ~(mask << shift);    
-       /* Set new value */
-       *regval |= (newval & mask) << shift;    
-}
-
-static int
-ad1816_mixer_get (ad1816_info * devc, int dev)
-{
-       DEBUGNOISE(printk(KERN_DEBUG "ad1816: mixer_get called!\n"));
-       
-       /* range check + supported mixer check */
-       if (dev < 0 || dev >= SOUND_MIXER_NRDEVICES )
-               return (-(EINVAL));
-       if (!((1 << dev) & devc->supported_devices))
-               return -(EINVAL);
-       
-       return devc->levels[dev];
-}
-
-static int
-ad1816_mixer_set (ad1816_info * devc, int dev, int value)
-{
-       int   left = value & 0x000000ff;
-       int   right = (value & 0x0000ff00) >> 8;
-       int   retvol;
-
-       int   regoffs;
-       int   val;
-       int   valmute;
-       unsigned long flags;
-
-       DEBUGNOISE(printk(KERN_DEBUG "ad1816: mixer_set called!\n"));
-       
-       if (dev < 0 || dev >= SOUND_MIXER_NRDEVICES )
-               return -(EINVAL);
-
-       if (left > 100)
-               left = 100;
-       if (left < 0)
-               left = 0;
-       if (right > 100)
-               right = 100;
-       if (right < 0)
-               right = 0;
-       
-       /* Mono control */
-       if (mix_devices[dev][RIGHT_CHN].nbits == 0) 
-               right = left;
-       retvol = left | (right << 8);
-       
-       /* Scale it */
-       
-       left = mix_cvt[left];
-       right = mix_cvt[right];
-
-       /* reject all mixers that are not supported */
-       if (!(devc->supported_devices & (1 << dev)))
-               return -(EINVAL);
-       
-       /* sanity check */
-       if (mix_devices[dev][LEFT_CHN].nbits == 0)
-               return -(EINVAL);
-       spin_lock_irqsave(&devc->lock, flags);
-
-       /* keep precise volume internal */
-       devc->levels[dev] = retvol;
-
-       /* Set the left channel */
-       regoffs = mix_devices[dev][LEFT_CHN].regno;
-       val = ad_read (devc, regoffs);
-       change_bits (&val, dev, LEFT_CHN, left);
-
-       valmute=val;
-
-       /* Mute bit masking on some registers */
-       if ( regoffs==5 || regoffs==14 || regoffs==15 ||
-            regoffs==16 || regoffs==17 || regoffs==18 || 
-            regoffs==19 || regoffs==39) {
-               if (left==0)
-                       valmute |= 0x8000;
-               else
-                       valmute &= ~0x8000;
-       }
-       ad_write (devc, regoffs, valmute); /* mute */
-
-       /*
-        * Set the right channel
-        */
-       /* Was just a mono channel */
-       if (mix_devices[dev][RIGHT_CHN].nbits == 0) {
-               spin_unlock_irqrestore(&devc->lock, flags);
-               return retvol;          
-       }
-
-       regoffs = mix_devices[dev][RIGHT_CHN].regno;
-       val = ad_read (devc, regoffs);
-       change_bits (&val, dev, RIGHT_CHN, right);
-
-       valmute=val;
-       if ( regoffs==5 || regoffs==14 || regoffs==15 ||
-            regoffs==16 || regoffs==17 || regoffs==18 || 
-            regoffs==19 || regoffs==39) {
-               if (right==0)
-                       valmute |= 0x80;
-               else
-                       valmute &= ~0x80;
-       }
-       ad_write (devc, regoffs, valmute); /* mute */
-       spin_unlock_irqrestore(&devc->lock, flags);
-               return retvol;
-}
-
-#define MIXER_DEVICES ( SOUND_MASK_VOLUME | \
-                       SOUND_MASK_SYNTH | \
-                       SOUND_MASK_PCM | \
-                       SOUND_MASK_LINE | \
-                       SOUND_MASK_LINE1 | \
-                       SOUND_MASK_LINE2 | \
-                       SOUND_MASK_LINE3 | \
-                       SOUND_MASK_MIC | \
-                       SOUND_MASK_CD | \
-                       SOUND_MASK_RECLEV  \
-                       )
-#define REC_DEVICES ( SOUND_MASK_LINE2 |\
-                     SOUND_MASK_LINE |\
-                     SOUND_MASK_LINE1 |\
-                     SOUND_MASK_MIC |\
-                     SOUND_MASK_CD |\
-                     SOUND_MASK_VOLUME \
-                     )
-     
-static void
-ad1816_mixer_reset (ad1816_info * devc)
-{
-       int  i;
-
-       devc->supported_devices = MIXER_DEVICES;
-       
-       devc->supported_rec_devices = REC_DEVICES;
-
-       for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
-               if (devc->supported_devices & (1 << i))
-                       ad1816_mixer_set (devc, i, default_mixer_levels[i]);
-       ad1816_set_recmask (devc, SOUND_MASK_MIC);
-}
-
-static int
-ad1816_mixer_ioctl (int dev, unsigned int cmd, void __user * arg)
-{
-       ad1816_info    *devc = mixer_devs[dev]->devc;
-       int val;
-       int __user *p = arg;
-  
-       DEBUGNOISE(printk(KERN_DEBUG "ad1816: mixer_ioctl called!\n"));
-  
-       /* Mixer ioctl */
-       if (((cmd >> 8) & 0xff) == 'M') { 
-               
-               /* set ioctl */
-               if (_SIOC_DIR (cmd) & _SIOC_WRITE) { 
-                       switch (cmd & 0xff){
-                       case SOUND_MIXER_RECSRC:
-                               
-                               if (get_user(val, p))
-                                       return -EFAULT;
-                               val=ad1816_set_recmask (devc, val);
-                               return put_user(val, p);
-                               break;
-                               
-                       default:
-                               if (get_user(val, p))
-                                       return -EFAULT;
-                               if ((val=ad1816_mixer_set (devc, cmd & 0xff, val))<0)
-                                       return val;
-                               else
-                                       return put_user(val, p);
-                       }
-               } else { 
-                       /* read ioctl */
-                       switch (cmd & 0xff) {
-                               
-                       case SOUND_MIXER_RECSRC:
-                               val=devc->recmask;
-                               return put_user(val, p);
-                               break;
-                               
-                       case SOUND_MIXER_DEVMASK:
-                               val=devc->supported_devices;
-                               return put_user(val, p);
-                               break;
-
-                       case SOUND_MIXER_STEREODEVS:
-                               val=devc->supported_devices & ~(SOUND_MASK_SPEAKER | SOUND_MASK_IMIX);
-                               return put_user(val, p);
-                               break;
-                               
-                       case SOUND_MIXER_RECMASK:
-                               val=devc->supported_rec_devices;
-                               return put_user(val, p);
-                               break;
-                               
-                       case SOUND_MIXER_CAPS:
-                               val=SOUND_CAP_EXCL_INPUT;
-                               return put_user(val, p);
-                               break;
-                               
-                       default:
-                               if ((val=ad1816_mixer_get (devc, cmd & 0xff))<0)
-                                       return val;
-                               else
-                                       return put_user(val, p);
-                       }
-               }
-       } else
-               /* not for mixer */
-               return -(EINVAL);
-}
-
-/* ------------------------------------------------------------------- */
-
-/* Mixer structure */
-
-static struct mixer_operations ad1816_mixer_operations = {
-       .owner  = THIS_MODULE,
-       .id     = "AD1816",
-       .name   = "AD1816 Mixer",
-       .ioctl  = ad1816_mixer_ioctl
-};
-
-
-/* ------------------------------------------------------------------- */
-
-/* stuff for card recognition, init and unloading PNP ...*/
-
-
-/* check if AD1816 present at specified hw_config and register device with OS 
- * return 1 if initialization was successful, 0 otherwise
- */
-static int __init ad1816_init_card (struct address_info *hw_config, 
-       struct pnp_dev *pnp)
-{
-       ad1816_info    *devc = NULL;
-       int tmp;
-       int oss_devno = -1;
-
-       printk(KERN_INFO "ad1816: initializing card: io=0x%x, irq=%d, dma=%d, "
-                        "dma2=%d, clockfreq=%d, options=%d isadmabug=%d "
-                        "%s\n",
-              hw_config->io_base,
-              hw_config->irq,
-              hw_config->dma,
-              hw_config->dma2,
-              ad1816_clockfreq,
-              options,
-              isa_dma_bridge_buggy,
-              pnp?"(PNP)":"");
-
-       /* ad1816_info structure remaining ? */
-       if (nr_ad1816_devs >= MAX_AUDIO_DEV) {
-               printk(KERN_WARNING "ad1816: no more ad1816_info structures "
-                       "left\n");
-               goto out;
-       }
-
-       devc = &dev_info[nr_ad1816_devs];
-       devc->base = hw_config->io_base;
-       devc->irq = hw_config->irq;
-       devc->dma_playback=hw_config->dma;
-       devc->dma_capture=hw_config->dma2;
-       devc->opened = 0;
-       devc->pnpdev = pnp;
-       spin_lock_init(&devc->lock);
-
-       if (!request_region(devc->base, 16, "AD1816 Sound")) {
-               printk(KERN_WARNING "ad1816: I/O port 0x%03x not free\n",
-                                   devc->base);
-               goto out;
-       }
-
-       printk(KERN_INFO "ad1816: Examining AD1816 at address 0x%03x.\n", 
-               devc->base);
-       
-
-       /* tests for ad1816 */
-       /* base+0: bit 1 must be set but not 255 */
-       tmp=inb(devc->base);
-       if ( (tmp&0x80)==0 || tmp==255 ) {
-               printk (KERN_INFO "ad1816: Chip is not an AD1816 or chip "
-                       "is not active (Test 0)\n");
-               goto out_release_region;
-       }
-
-       /* writes to ireg 8 are copied to ireg 9 */
-       ad_write(devc,8,12345); 
-       if (ad_read(devc,9)!=12345) {
-               printk(KERN_INFO "ad1816: Chip is not an AD1816 (Test 1)\n");
-               goto out_release_region;
-       }
-  
-       /* writes to ireg 8 are copied to ireg 9 */
-       ad_write(devc,8,54321); 
-       if (ad_read(devc,9)!=54321) {
-               printk(KERN_INFO "ad1816: Chip is not an AD1816 (Test 2)\n");
-               goto out_release_region;
-       }
-
-       /* writes to ireg 10 are copied to ireg 11 */
-       ad_write(devc,10,54321); 
-       if (ad_read(devc,11)!=54321) {
-               printk (KERN_INFO "ad1816: Chip is not an AD1816 (Test 3)\n");
-               goto out_release_region;
-       }
-
-       /* writes to ireg 10 are copied to ireg 11 */
-       ad_write(devc,10,12345); 
-       if (ad_read(devc,11)!=12345) {
-               printk (KERN_INFO "ad1816: Chip is not an AD1816 (Test 4)\n");
-               goto out_release_region;
-       }
-
-       /* bit in base +1 cannot be set to 1 */
-       tmp=inb(devc->base+1);
-       outb(0xff,devc->base+1); 
-       if (inb(devc->base+1)!=tmp) {
-               printk(KERN_INFO "ad1816: Chip is not an AD1816 (Test 5)\n");
-               goto out_release_region;
-       }
-  
-       printk(KERN_INFO "ad1816: AD1816 (version %d) successfully detected!\n",
-               ad_read(devc,45));
-
-       /* disable all interrupts */
-       ad_write(devc,1,0);     
-
-       /* Clear pending interrupts */
-       outb (0, devc->base+1); 
-
-       /* allocate irq */
-       if (devc->irq < 0 || devc->irq > 15)
-               goto out_release_region;
-       if (request_irq(devc->irq, ad1816_interrupt,0,
-                       "SoundPort", devc) < 0) {
-               printk(KERN_WARNING "ad1816: IRQ in use\n");
-               goto out_release_region;
-       }
-
-       /* DMA stuff */
-       if (sound_alloc_dma (devc->dma_playback, "Sound System")) {
-               printk(KERN_WARNING "ad1816: Can't allocate DMA%d\n",
-                                   devc->dma_playback);
-               goto out_free_irq;
-       }
-       
-       if ( devc->dma_capture >= 0 && 
-               devc->dma_capture != devc->dma_playback) {
-               if (sound_alloc_dma(devc->dma_capture,
-                                   "Sound System (capture)")) {
-                       printk(KERN_WARNING "ad1816: Can't allocate DMA%d\n",
-                                           devc->dma_capture);
-                       goto out_free_dma;
-               }
-               devc->audio_mode=DMA_AUTOMODE|DMA_DUPLEX;
-       } else {
-               printk(KERN_WARNING "ad1816: Only one DMA channel "
-                       "available/configured. No duplex operation possible\n");
-               devc->audio_mode=DMA_AUTOMODE;
-       }
-
-       conf_printf2 ("AD1816 audio driver",
-                     devc->base, devc->irq, devc->dma_playback, 
-                     devc->dma_capture);
-
-       /* register device */
-       if ((oss_devno = sound_install_audiodrv (AUDIO_DRIVER_VERSION,
-                                             "AD1816 audio driver",
-                                             &ad1816_audio_driver,
-                                             sizeof (struct audio_driver),
-                                             devc->audio_mode,
-                                             ad_format_mask,
-                                             devc,
-                                             devc->dma_playback, 
-                                             devc->dma_capture)) < 0) {
-               printk(KERN_WARNING "ad1816: Can't install sound driver\n");
-               goto out_free_dma_2;
-       }
-
-
-       ad_write(devc,32,0x80f0); /* sound system mode */
-       if (options&1) {
-               ad_write(devc,33,0); /* disable all audiosources for dsp */
-       } else {
-               ad_write(devc,33,0x03f8); /* enable all audiosources for dsp */
-       }
-       ad_write(devc,4,0x8080);  /* default values for volumes (muted)*/
-       ad_write(devc,5,0x8080);
-       ad_write(devc,6,0x8080);
-       ad_write(devc,7,0x8080);
-       ad_write(devc,15,0x8888);
-       ad_write(devc,16,0x8888);
-       ad_write(devc,17,0x8888);
-       ad_write(devc,18,0x8888);
-       ad_write(devc,19,0xc888); /* +20db mic active */
-       ad_write(devc,14,0x0000); /* Master volume unmuted */
-       ad_write(devc,39,0x009f); /* 3D effect on 0% phone out muted */
-       ad_write(devc,44,0x0080); /* everything on power, 3d enabled for d/a */
-       outb(0x10,devc->base+8); /* set dma mode */
-       outb(0x10,devc->base+9);
-  
-       /* enable capture + playback interrupt */
-       ad_write(devc,1,0xc000); 
-       
-       /* set mixer defaults */
-       ad1816_mixer_reset (devc); 
-  
-       /* register mixer */
-       if ((audio_devs[oss_devno]->mixer_dev=sound_install_mixer(
-                                      MIXER_DRIVER_VERSION,
-                                      "AD1816 audio driver",
-                                      &ad1816_mixer_operations,
-                                      sizeof (struct mixer_operations),
-                                      devc)) < 0) {
-               printk(KERN_WARNING "Can't install mixer\n");
-       }
-       /* make ad1816_info active */
-       nr_ad1816_devs++;
-       printk(KERN_INFO "ad1816: card successfully installed!\n");
-       return 1;
-       /* error handling */
-out_free_dma_2:
-       if (devc->dma_capture >= 0 && devc->dma_capture != devc->dma_playback)
-               sound_free_dma(devc->dma_capture);
-out_free_dma:
-       sound_free_dma(devc->dma_playback);
-out_free_irq:
-       free_irq(devc->irq, devc);
-out_release_region:
-       release_region(devc->base, 16);
-out:
-       return 0;
-}
-
-static void __exit unload_card(ad1816_info *devc)
-{
-       int  mixer, dev = 0;
-       
-       if (devc != NULL) {
-               printk("ad1816: Unloading card at address 0x%03x\n",devc->base);
-               
-               dev = devc->dev_no;
-               mixer = audio_devs[dev]->mixer_dev;
-
-               /* unreg mixer*/
-               if(mixer>=0) {
-                       sound_unload_mixerdev(mixer);
-               }
-               /* unreg audiodev */
-               sound_unload_audiodev(dev);
-               
-               /* free dma channels */
-               if (devc->dma_capture>=0 && 
-                       devc->dma_capture != devc->dma_playback) {
-                       sound_free_dma(devc->dma_capture);
-               }
-               sound_free_dma (devc->dma_playback);
-               /* free irq */
-               free_irq(devc->irq, devc);
-               /* free io */
-               release_region (devc->base, 16);
-#ifdef __ISAPNP__
-               if (devc->pnpdev) {
-                       pnp_disable_dev(devc->pnpdev);
-                       pnp_device_detach(devc->pnpdev);
-               }
-#endif
-               
-       } else
-               printk(KERN_WARNING "ad1816: no device/card specified\n");
-}
-
-static int __initdata io = -1;
-static int __initdata irq = -1;
-static int __initdata dma = -1;
-static int __initdata dma2 = -1;
-
-#ifdef __ISAPNP__
-/* use isapnp for configuration */
-static int isapnp      = 1;
-static int isapnpjump;
-module_param(isapnp, bool, 0);
-module_param(isapnpjump, int, 0);
-#endif
-
-module_param(io, int, 0);
-module_param(irq, int, 0);
-module_param(dma, int, 0);
-module_param(dma2, int, 0);
-module_param(ad1816_clockfreq, int, 0);
-module_param(options, int, 0);
-
-#ifdef __ISAPNP__
-static struct {
-       unsigned short card_vendor, card_device;
-       unsigned short vendor;
-       unsigned short function;
-       struct ad1816_data *data;
-} isapnp_ad1816_list[] __initdata = {
-       {       ISAPNP_ANY_ID, ISAPNP_ANY_ID,
-               ISAPNP_VENDOR('A','D','S'), ISAPNP_FUNCTION(0x7150), 
-               NULL },
-       {       ISAPNP_ANY_ID, ISAPNP_ANY_ID,
-               ISAPNP_VENDOR('A','D','S'), ISAPNP_FUNCTION(0x7180),
-               NULL },
-       {0}
-};
-
-MODULE_DEVICE_TABLE(isapnp, isapnp_ad1816_list);
-
-
-static void __init ad1816_config_pnp_card(struct pnp_card *card,
-                                         unsigned short vendor,
-                                         unsigned short function)
-{
-       struct address_info cfg;
-       struct pnp_dev *card_dev = pnp_find_dev(card, vendor, function, NULL);
-       if (!card_dev) return;
-       if (pnp_device_attach(card_dev) < 0) {
-               printk(KERN_WARNING "ad1816: Failed to attach PnP device\n");
-               return;
-       }
-       if (pnp_activate_dev(card_dev) < 0) {
-               printk(KERN_WARNING "ad1816: Failed to activate PnP device\n");
-               pnp_device_detach(card_dev);
-               return;
-       }
-       cfg.io_base = pnp_port_start(card_dev, 2);
-       cfg.irq = pnp_irq(card_dev, 0);
-       cfg.dma = pnp_irq(card_dev, 0);
-       cfg.dma2 = pnp_irq(card_dev, 1);
-       if (!ad1816_init_card(&cfg, card_dev)) {
-               pnp_disable_dev(card_dev);
-               pnp_device_detach(card_dev);
-       }
-}
-
-static void __init ad1816_config_pnp_cards(void)
-{
-       int nr_pnp_cfg;
-       int i;
-       
-       /* Count entries in isapnp_ad1816_list */
-       for (nr_pnp_cfg = 0; isapnp_ad1816_list[nr_pnp_cfg].card_vendor != 0; 
-               nr_pnp_cfg++);
-       /* Check and adjust isapnpjump */
-       if( isapnpjump < 0 || isapnpjump >= nr_pnp_cfg) {
-               printk(KERN_WARNING 
-                       "ad1816: Valid range for isapnpjump is 0-%d. "
-                       "Adjusted to 0.\n", nr_pnp_cfg-1);
-               isapnpjump = 0;
-       }
-       for (i = isapnpjump; isapnp_ad1816_list[i].card_vendor != 0; i++) {
-               struct pnp_card *card = NULL;
-               /* iterate over all pnp cards */                
-               while ((card = pnp_find_card(isapnp_ad1816_list[i].card_vendor,
-                               isapnp_ad1816_list[i].card_device, card))) 
-                       ad1816_config_pnp_card(card, 
-                               isapnp_ad1816_list[i].vendor,
-                               isapnp_ad1816_list[i].function);
-       }
-}
-#endif
-
-/* module initialization */
-static int __init init_ad1816(void)
-{
-       printk(KERN_INFO "ad1816: AD1816 sounddriver "
-                        "Copyright (C) 1998-2003 by Thorsten Knabe and "
-                        "others\n");
-#ifdef AD1816_CLOCK 
-       /* set ad1816_clockfreq if set during compilation */
-       ad1816_clockfreq=AD1816_CLOCK;
-#endif
-       if (ad1816_clockfreq<5000 || ad1816_clockfreq>100000) {
-               ad1816_clockfreq=33000;
-       }
-
-#ifdef __ISAPNP__
-       /* configure PnP cards */
-       if(isapnp) ad1816_config_pnp_cards();
-#endif
-       /* configure card by module params */
-       if (io != -1 && irq != -1 && dma != -1) {
-               struct address_info cfg;
-               cfg.io_base = io;
-               cfg.irq = irq;
-               cfg.dma = dma;
-               cfg.dma2 = dma2;
-               ad1816_init_card(&cfg, NULL);
-       }
-       if (nr_ad1816_devs <= 0)
-               return -ENODEV;
-       return 0;
-}
-
-/* module cleanup */
-static void __exit cleanup_ad1816 (void)
-{
-       int          i;
-       ad1816_info  *devc = NULL;
-  
-       /* remove any soundcard */
-       for (i = 0;  i < nr_ad1816_devs; i++) {
-               devc = &dev_info[i];
-               unload_card(devc);
-       }     
-       nr_ad1816_devs=0;
-       printk(KERN_INFO "ad1816: driver unloaded!\n");
-}
-
-module_init(init_ad1816);
-module_exit(cleanup_ad1816);
-
-#ifndef MODULE
-/* kernel command line parameter evaluation */
-static int __init setup_ad1816(char *str)
-{
-       /* io, irq, dma, dma2 */
-       int ints[5];
-       
-       str = get_options(str, ARRAY_SIZE(ints), ints);
-       
-       io      = ints[1];
-       irq     = ints[2];
-       dma     = ints[3];
-       dma2    = ints[4];
-       return 1;
-}
-
-__setup("ad1816=", setup_ad1816);
-#endif
-MODULE_LICENSE("GPL");
diff --git a/sound/oss/ad1889.c b/sound/oss/ad1889.c
deleted file mode 100644 (file)
index c0730a3..0000000
+++ /dev/null
@@ -1,1101 +0,0 @@
-/*
- *  Copyright 2001-2004 Randolph Chung <tausq@debian.org>
- *
- *  Analog Devices 1889 PCI audio driver (AD1819 AC97-compatible codec)
- *
- *   This program is free software; you can redistribute it and/or modify
- *   it under the terms of the GNU General Public License as published by
- *   the Free Software Foundation; either version 2 of the License, or
- *   (at your option) any later version.
- *
- *   This program is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
- *
- *   You should have received a copy of the GNU General Public License
- *   along with this program; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *   Notes:
- *   1. Only flat DMA is supported; s-g is not supported right now
- *
- *
-<jsm> tausq: Anyway, to set up sample rates for D to A, you just use the sample rate on the codec. For A to D, you need to set the codec always to 48K (using the split sample rate feature on the codec) and then set the resampler on the AD1889 to the sample rate you want.
-<jsm> Also, when changing the sample rate on the codec you need to power it down and re power it up for the change to take effect!
- *
- * $Id: ad1889.c,v 1.3 2002/10/19 21:31:44 grundler Exp $
- */
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/ioport.h>
-#include <linux/pci.h>
-#include <linux/poll.h>
-#include <linux/proc_fs.h>
-#include <linux/slab.h>
-#include <linux/soundcard.h>
-#include <linux/ac97_codec.h>
-#include <linux/sound.h>
-#include <linux/interrupt.h>
-#include <linux/mutex.h>
-
-#include <asm/delay.h>
-#include <asm/io.h>
-#include <asm/dma.h>
-#include <asm/uaccess.h>
-
-#include "ad1889.h"
-
-#define DBG(fmt, arg...) printk(fmt, ##arg)
-#define DEVNAME "ad1889"
-
-#define NR_HW_CH       4
-#define DAC_RUNNING    1
-#define ADC_RUNNING    2
-
-#define UNDERRUN(dev)  (0)
-
-#define AD1889_READW(dev,reg) readw(dev->regbase + reg)
-#define AD1889_WRITEW(dev,reg,val) writew((val), dev->regbase + reg)
-#define AD1889_READL(dev,reg) readl(dev->regbase + reg)
-#define AD1889_WRITEL(dev,reg,val) writel((val), dev->regbase + reg)
-
-//now 100ms
-/* #define WAIT_10MS() schedule_timeout(HZ/10) */
-#define WAIT_10MS()    do { int __i; for (__i = 0; __i < 100; __i++) udelay(1000); } while(0)
-
-/* currently only support a single device */
-static ad1889_dev_t *ad1889_dev = NULL;
-
-/************************* helper routines ***************************** */
-static inline void ad1889_set_wav_rate(ad1889_dev_t *dev, int rate)
-{
-       struct ac97_codec *ac97_codec = dev->ac97_codec;
-
-       DBG("Setting WAV rate to %d\n", rate);
-       dev->state[AD_WAV_STATE].dmabuf.rate = rate;
-       AD1889_WRITEW(dev, AD_DS_WAS, rate);
-
-       /* Cycle the DAC to enable the new rate */
-       ac97_codec->codec_write(dev->ac97_codec, AC97_POWER_CONTROL, 0x0200);
-       WAIT_10MS();
-       ac97_codec->codec_write(dev->ac97_codec, AC97_POWER_CONTROL, 0);
-}
-
-static inline void ad1889_set_wav_fmt(ad1889_dev_t *dev, int fmt)
-{
-       u16 tmp;
-
-       DBG("Setting WAV format to 0x%x\n", fmt);
-
-       tmp = AD1889_READW(ad1889_dev, AD_DS_WSMC);
-       if (fmt & AFMT_S16_LE) {
-               //tmp |= 0x0100; /* set WA16 */
-               tmp |= 0x0300; /* set WA16 stereo */
-       } else if (fmt & AFMT_U8) {
-               tmp &= ~0x0100; /* clear WA16 */
-       } 
-       AD1889_WRITEW(ad1889_dev, AD_DS_WSMC, tmp);
-}
-
-static inline void ad1889_set_adc_fmt(ad1889_dev_t *dev, int fmt)
-{
-       u16 tmp;
-
-       DBG("Setting ADC format to 0x%x\n", fmt);
-
-       tmp = AD1889_READW(ad1889_dev, AD_DS_RAMC);
-       if (fmt & AFMT_S16_LE) {
-               tmp |= 0x0100; /* set WA16 */
-       } else if (fmt & AFMT_U8) {
-               tmp &= ~0x0100; /* clear WA16 */
-       } 
-       AD1889_WRITEW(ad1889_dev, AD_DS_RAMC, tmp);
-}
-
-static void ad1889_start_wav(ad1889_state_t *state)
-{
-       unsigned long flags;
-       struct dmabuf *dmabuf = &state->dmabuf;
-       int cnt;
-       u16 tmp;
-
-       spin_lock_irqsave(&state->card->lock, flags);
-
-       if (dmabuf->dma_len)    /* DMA already in flight */
-               goto skip_dma;
-
-       /* setup dma */
-       cnt = dmabuf->wr_ptr - dmabuf->rd_ptr;
-       if (cnt == 0)           /* done - don't need to do anything */
-               goto skip_dma;
-
-       /* If the wr_ptr has wrapped, only map to the end */
-       if (cnt < 0)
-               cnt = DMA_SIZE - dmabuf->rd_ptr;
-
-       dmabuf->dma_handle = pci_map_single(ad1889_dev->pci,
-                                       dmabuf->rawbuf + dmabuf->rd_ptr,
-                                       cnt, PCI_DMA_TODEVICE);
-       dmabuf->dma_len = cnt;
-       dmabuf->ready = 1;
-
-       DBG("Starting playback at 0x%p for %ld bytes\n", dmabuf->rawbuf +
-           dmabuf->rd_ptr, dmabuf->dma_len);
-
-        /* load up the current register set */
-       AD1889_WRITEL(ad1889_dev, AD_DMA_WAVCC, cnt);
-       AD1889_WRITEL(ad1889_dev, AD_DMA_WAVICC, cnt);
-       AD1889_WRITEL(ad1889_dev, AD_DMA_WAVCA, dmabuf->dma_handle);
-
-       /* TODO: for now we load the base registers with the same thing */
-       AD1889_WRITEL(ad1889_dev, AD_DMA_WAVBC, cnt);
-       AD1889_WRITEL(ad1889_dev, AD_DMA_WAVIBC, cnt);
-       AD1889_WRITEL(ad1889_dev, AD_DMA_WAVBA, dmabuf->dma_handle);
-
-       /* and we're off to the races... */
-       AD1889_WRITEL(ad1889_dev, AD_DMA_CHSS, 0x8);
-       tmp = AD1889_READW(ad1889_dev, AD_DS_WSMC);
-       tmp |= 0x0400; /* set WAEN */
-       AD1889_WRITEW(ad1889_dev, AD_DS_WSMC, tmp);
-       (void) AD1889_READW(ad1889_dev, AD_DS_WSMC); /* flush posted PCI write */
-
-       dmabuf->enable |= DAC_RUNNING;
-
-skip_dma:
-       spin_unlock_irqrestore(&state->card->lock, flags);
-}
-
-
-static void ad1889_stop_wav(ad1889_state_t *state)
-{
-       unsigned long flags;
-       struct dmabuf *dmabuf = &state->dmabuf;
-
-       spin_lock_irqsave(&state->card->lock, flags);
-
-       if (dmabuf->enable & DAC_RUNNING) {
-               u16 tmp;
-               unsigned long cnt = dmabuf->dma_len;
-
-               tmp = AD1889_READW(ad1889_dev, AD_DS_WSMC);
-               tmp &= ~0x0400; /* clear WAEN */
-               AD1889_WRITEW(ad1889_dev, AD_DS_WSMC, tmp);
-               (void) AD1889_READW(ad1889_dev, AD_DS_WSMC); /* flush posted PCI write */
-               pci_unmap_single(ad1889_dev->pci, dmabuf->dma_handle, 
-                               cnt, PCI_DMA_TODEVICE);
-
-               dmabuf->enable &= ~DAC_RUNNING;
-
-               /* update dma pointers */
-               dmabuf->rd_ptr += cnt;
-               dmabuf->rd_ptr &= (DMA_SIZE - 1);
-
-               dmabuf->dma_handle = 0;
-               dmabuf->dma_len = 0;
-               dmabuf->ready = 0;
-
-               wake_up(&dmabuf->wait);
-       }
-
-       spin_unlock_irqrestore(&state->card->lock, flags);
-}
-
-
-#if 0
-static void ad1889_startstop_adc(ad1889_state_t *state, int start)
-{
-       u16 tmp;
-       unsigned long flags;
-
-       spin_lock_irqsave(&state->card->lock, flags);
-       
-       tmp = AD1889_READW(ad1889_dev, AD_DS_RAMC);
-       if (start) {
-               state->dmabuf.enable |= ADC_RUNNING;
-               tmp |= 0x0004; /* set ADEN */
-       } else {
-               state->dmabuf.enable &= ~ADC_RUNNING;
-               tmp &= ~0x0004; /* clear ADEN */
-       }
-       AD1889_WRITEW(ad1889_dev, AD_DS_RAMC, tmp);
-
-       spin_unlock_irqrestore(&state->card->lock, flags);
-}
-#endif
-
-static ad1889_dev_t *ad1889_alloc_dev(struct pci_dev *pci)
-{
-       ad1889_dev_t *dev;
-       struct dmabuf *dmabuf;
-       int i;
-
-       if ((dev = kzalloc(sizeof(ad1889_dev_t), GFP_KERNEL)) == NULL)
-               return NULL;
-       spin_lock_init(&dev->lock);
-       dev->pci = pci;
-
-       for (i = 0; i < AD_MAX_STATES; i++) {
-               dev->state[i].card = dev;
-               mutex_init(&dev->state[i].mutex);
-               init_waitqueue_head(&dev->state[i].dmabuf.wait);
-       }
-
-       /* allocate dma buffer */
-
-       for (i = 0; i < AD_MAX_STATES; i++) {
-               dmabuf = &dev->state[i].dmabuf;
-               dmabuf->rawbuf = kmalloc(DMA_SIZE, GFP_KERNEL|GFP_DMA);
-               if (!dmabuf->rawbuf)
-                       goto err_free_dmabuf;
-               dmabuf->rawbuf_size = DMA_SIZE;
-               dmabuf->dma_handle = 0;
-               dmabuf->rd_ptr = dmabuf->wr_ptr = dmabuf->dma_len = 0UL;
-               dmabuf->ready = 0;
-               dmabuf->rate = 48000;
-       }
-       return dev;
-
-err_free_dmabuf:
-       while (--i >= 0)
-               kfree(dev->state[i].dmabuf.rawbuf);
-       kfree(dev);
-       return NULL;
-}
-
-static void ad1889_free_dev(ad1889_dev_t *dev)
-{
-       int j;
-       struct dmabuf *dmabuf;
-
-       if (dev == NULL) 
-               return;
-
-       if (dev->ac97_codec)
-               ac97_release_codec(dev->ac97_codec);
-
-       for (j = 0; j < AD_MAX_STATES; j++) {
-               dmabuf = &dev->state[j].dmabuf;
-               kfree(dmabuf->rawbuf);
-       }
-
-       kfree(dev);
-}
-
-static inline void ad1889_trigger_playback(ad1889_dev_t *dev)
-{
-#if 0
-       u32 val;
-       struct dmabuf *dmabuf = &dev->state[AD_WAV_STATE].dmabuf;
-#endif
-
-       ad1889_start_wav(&dev->state[AD_WAV_STATE]);
-}
-
-static int ad1889_read_proc (char *page, char **start, off_t off,
-                            int count, int *eof, void *data)
-{
-       char *out = page;
-       int len, i;
-       ad1889_dev_t *dev = data;
-       ad1889_reg_t regs[] = {
-               { "WSMC", AD_DS_WSMC, 16 },
-               { "RAMC", AD_DS_RAMC, 16 },
-               { "WADA", AD_DS_WADA, 16 },
-               { "SYDA", AD_DS_SYDA, 16 },
-               { "WAS", AD_DS_WAS, 16 },
-               { "RES", AD_DS_RES, 16 },
-               { "CCS", AD_DS_CCS, 16 },
-               { "ADCBA", AD_DMA_ADCBA, 32 },
-               { "ADCCA", AD_DMA_ADCCA, 32 },
-               { "ADCBC", AD_DMA_ADCBC, 32 },
-               { "ADCCC", AD_DMA_ADCCC, 32 },
-               { "ADCIBC", AD_DMA_ADCIBC, 32 },
-               { "ADCICC", AD_DMA_ADCICC, 32 },
-               { "ADCCTRL", AD_DMA_ADCCTRL, 16 },
-               { "WAVBA", AD_DMA_WAVBA, 32 },
-               { "WAVCA", AD_DMA_WAVCA, 32 },
-               { "WAVBC", AD_DMA_WAVBC, 32 },
-               { "WAVCC", AD_DMA_WAVCC, 32 },
-               { "WAVIBC", AD_DMA_WAVIBC, 32 },
-               { "WAVICC", AD_DMA_WAVICC, 32 },
-               { "WAVCTRL", AD_DMA_WAVCTRL, 16 },
-               { "DISR", AD_DMA_DISR, 32 },
-               { "CHSS", AD_DMA_CHSS, 32 },
-               { "IPC", AD_GPIO_IPC, 16 },
-               { "OP", AD_GPIO_OP, 16 },
-               { "IP", AD_GPIO_IP, 16 },
-               { "ACIC", AD_AC97_ACIC, 16 },
-               { "AC97_RESET", AD_AC97_BASE + AC97_RESET, 16 },
-               { "AC97_MASTER_VOL_STEREO", AD_AC97_BASE + AC97_MASTER_VOL_STEREO, 16 },
-               { "AC97_HEADPHONE_VOL", AD_AC97_BASE + AC97_HEADPHONE_VOL, 16 },
-               { "AC97_MASTER_VOL_MONO", AD_AC97_BASE + AC97_MASTER_VOL_MONO, 16 },
-               { "AC97_MASTER_TONE", AD_AC97_BASE + AC97_MASTER_TONE, 16 },
-               { "AC97_PCBEEP_VOL", AD_AC97_BASE + AC97_PCBEEP_VOL, 16 },
-               { "AC97_PHONE_VOL", AD_AC97_BASE + AC97_PHONE_VOL, 16 },
-               { "AC97_MIC_VOL", AD_AC97_BASE + AC97_MIC_VOL, 16 },
-               { "AC97_LINEIN_VOL", AD_AC97_BASE + AC97_LINEIN_VOL, 16 },
-               { "AC97_CD_VOL", AD_AC97_BASE + AC97_CD_VOL, 16 },
-               { "AC97_VIDEO_VOL", AD_AC97_BASE + AC97_VIDEO_VOL, 16 },
-               { "AC97_AUX_VOL", AD_AC97_BASE + AC97_AUX_VOL, 16 },
-               { "AC97_PCMOUT_VOL", AD_AC97_BASE + AC97_PCMOUT_VOL, 16 },
-               { "AC97_RECORD_SELECT", AD_AC97_BASE + AC97_RECORD_SELECT, 16 },
-               { "AC97_RECORD_GAIN", AD_AC97_BASE + AC97_RECORD_GAIN, 16 },
-               { "AC97_RECORD_GAIN_MIC", AD_AC97_BASE + AC97_RECORD_GAIN_MIC, 16 },
-               { "AC97_GENERAL_PURPOSE", AD_AC97_BASE + AC97_GENERAL_PURPOSE, 16 },
-               { "AC97_3D_CONTROL", AD_AC97_BASE + AC97_3D_CONTROL, 16 },
-               { "AC97_MODEM_RATE", AD_AC97_BASE + AC97_MODEM_RATE, 16 },
-               { "AC97_POWER_CONTROL", AD_AC97_BASE + AC97_POWER_CONTROL, 16 },
-               { NULL }
-       };
-
-       if (dev == NULL)
-               return -ENODEV;
-
-       for (i = 0; regs[i].name != 0; i++)
-               out += sprintf(out, "%s: 0x%0*x\n", regs[i].name, 
-                       regs[i].width >> 2, 
-                       (regs[i].width == 16 
-                               ? AD1889_READW(dev, regs[i].offset)
-                               : AD1889_READL(dev, regs[i].offset)));
-
-       for (i = 0; i < AD_MAX_STATES; i++) {
-               out += sprintf(out, "DMA status for %s:\n", 
-                       (i == AD_WAV_STATE ? "WAV" : "ADC")); 
-               out += sprintf(out, "\t\t0x%p (IOVA: 0x%llu)\n",
-                       dev->state[i].dmabuf.rawbuf,
-                       (unsigned long long)dev->state[i].dmabuf.dma_handle);
-
-               out += sprintf(out, "\tread ptr: offset %u\n", 
-                       (unsigned int)dev->state[i].dmabuf.rd_ptr);
-               out += sprintf(out, "\twrite ptr: offset %u\n", 
-                       (unsigned int)dev->state[i].dmabuf.wr_ptr);
-               out += sprintf(out, "\tdma len: offset %u\n", 
-                       (unsigned int)dev->state[i].dmabuf.dma_len);
-       }
-
-       len = out - page - off;
-       if (len < count) {
-               *eof = 1;
-               if (len <= 0) return 0;
-       } else {
-               len = count;
-       }
-       *start = page + off;
-       return len;
-}
-
-/***************************** DMA interfaces ************************** */
-#if 0
-static inline unsigned long ad1889_get_dma_addr(ad1889_state_t *state)
-{
-       struct dmabuf *dmabuf = &state->dmabuf;
-       u32 offset;
-
-       if (!(dmabuf->enable & (DAC_RUNNING | ADC_RUNNING))) {
-               printk(KERN_ERR DEVNAME ": get_dma_addr called without dma enabled\n");
-               return 0;
-       }
-       
-       if (dmabuf->enable & DAC_RUNNING)
-               offset = le32_to_cpu(AD1889_READL(state->card, AD_DMA_WAVBA));
-       else
-               offset = le32_to_cpu(AD1889_READL(state->card, AD_DMA_ADCBA));
-
-       return (unsigned long)bus_to_virt((unsigned long)offset) - (unsigned long)dmabuf->rawbuf;
-}
-
-static void ad1889_update_ptr(ad1889_dev_t *dev, int wake)
-{
-       ad1889_state_t *state;
-       struct dmabuf *dmabuf;
-       unsigned long hwptr;
-       int diff;
-
-       /* check ADC first */
-       state = &dev->adc_state;
-       dmabuf = &state->dmabuf;
-       if (dmabuf->enable & ADC_RUNNING) {
-               hwptr = ad1889_get_dma_addr(state);
-               diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
-
-               dmabuf->hwptr = hwptr;
-               dmabuf->total_bytes += diff;
-               dmabuf->count += diff;
-               if (dmabuf->count > dmabuf->dmasize)
-                       dmabuf->count = dmabuf->dmasize;
-
-               if (dmabuf->mapped) {
-                       if (wake & dmabuf->count >= dmabuf->fragsize)
-                               wake_up(&dmabuf->wait);
-               } else {
-                       if (wake & dmabuf->count > 0)
-                               wake_up(&dmabuf->wait);
-               }
-       }
-
-       /* check DAC */
-       state = &dev->wav_state;
-       dmabuf = &state->dmabuf;
-       if (dmabuf->enable & DAC_RUNNING) {
-XXX
-
-}
-#endif
-
-/************************* /dev/dsp interfaces ************************* */
-
-static ssize_t ad1889_read(struct file *file, char __user *buffer, size_t count,
-       loff_t *ppos)
-{
-       return 0;
-}
-
-static ssize_t ad1889_write(struct file *file, const char __user *buffer, size_t count,
-       loff_t *ppos)
-{
-       ad1889_dev_t *dev = (ad1889_dev_t *)file->private_data;
-       ad1889_state_t *state = &dev->state[AD_WAV_STATE];
-       volatile struct dmabuf *dmabuf = &state->dmabuf;
-       ssize_t ret = 0;
-       DECLARE_WAITQUEUE(wait, current);
-
-       mutex_lock(&state->mutex);
-#if 0
-       if (dmabuf->mapped) {
-               ret = -ENXIO;
-               goto err1;
-       }
-#endif
-       if (!access_ok(VERIFY_READ, buffer, count)) {
-               ret = -EFAULT;
-               goto err1;
-       }
-
-       add_wait_queue(&state->dmabuf.wait, &wait);
-
-       /* start filling dma buffer.... */
-       while (count > 0) {
-               long rem;
-               long cnt = count;
-               unsigned long flags;
-
-               for (;;) {
-                       long used_bytes;
-                       long timeout;   /* max time for DMA in jiffies */
-
-                       /* buffer is full if wr catches up to rd */
-                       spin_lock_irqsave(&state->card->lock, flags);
-                       used_bytes = dmabuf->wr_ptr - dmabuf->rd_ptr;
-                       timeout = (dmabuf->dma_len * HZ) / dmabuf->rate;
-                       spin_unlock_irqrestore(&state->card->lock, flags);
-
-                       /* adjust for buffer wrap around */
-                       used_bytes = (used_bytes + DMA_SIZE) & (DMA_SIZE - 1);
-
-                       /* If at least one page unused */
-                       if (used_bytes < (DMA_SIZE - 0x1000))
-                               break;
-
-                       /* dma buffer full */
-
-                       if (file->f_flags & O_NONBLOCK) {
-                               ret = -EAGAIN;
-                               goto err2;
-                       }
-
-                       set_current_state(TASK_INTERRUPTIBLE);
-                       schedule_timeout(timeout + 1);
-                       if (signal_pending(current)) {
-                               ret = -ERESTARTSYS;
-                               goto err2;
-                       }
-               }
-
-               /* watch out for wrapping around static buffer */
-               spin_lock_irqsave(&state->card->lock, flags);
-               rem = DMA_SIZE - dmabuf->wr_ptr;
-               if (cnt > rem)
-                       cnt = rem;
-
-               rem = dmabuf->wr_ptr;
-
-               /* update dma pointers */
-               dmabuf->wr_ptr += cnt;
-               dmabuf->wr_ptr &= DMA_SIZE - 1; /* wrap ptr if necessary */
-               spin_unlock_irqrestore(&state->card->lock, flags);
-
-               /* transfer unwrapped chunk */
-               if (copy_from_user(dmabuf->rawbuf + rem, buffer, cnt)) {
-                       ret = -EFAULT;
-                       goto err2;
-               }
-
-               DBG("Writing 0x%lx bytes to +0x%lx\n", cnt, rem);
-
-               /* update counters */
-               count -= cnt;
-               buffer += cnt;
-               ret += cnt;
-
-               /* we have something to play - go play it! */
-               ad1889_trigger_playback(dev);
-       }
-
-err2:
-       remove_wait_queue(&state->dmabuf.wait, &wait);
-err1:
-       mutex_unlock(&state->mutex);
-       return ret;
-}
-
-static unsigned int ad1889_poll(struct file *file, struct poll_table_struct *wait)
-{
-       unsigned int mask = 0;
-#if 0
-       ad1889_dev_t *dev = (ad1889_dev_t *)file->private_data;
-       ad1889_state_t *state = NULL;
-       struct dmabuf *dmabuf;
-       unsigned long flags;
-       
-       if (!(file->f_mode & (FMODE_READ | FMODE_WRITE)))
-               return -EINVAL;
-
-       if (file->f_mode & FMODE_WRITE) {
-               state = &dev->state[AD_WAV_STATE];
-               if (!state) return 0;
-               dmabuf = &state->dmabuf;
-               poll_wait(file, &dmabuf->wait, wait);
-       }
-
-       if (file->f_mode & FMODE_READ) {
-               state = &dev->state[AD_ADC_STATE];
-               if (!state) return 0;
-               dmabuf = &state->dmabuf;
-               poll_wait(file, &dmabuf->wait, wait);
-       }
-
-       spin_lock_irqsave(&dev->lock, flags);
-       ad1889_update_ptr(dev, 0);
-
-       if (file->f_mode & FMODE_WRITE) {
-               state = &dev->state[WAV_STATE];
-               dmabuf = &state->dmabuf;
-               if (dmabuf->mapped) {
-                       if (dmabuf->count >= (int)dmabuf->fragsize)
-                               mask |= POLLOUT | POLLWRNORM;
-               } else {
-                       if ((int)dmabuf->dmasize >= dmabuf->count + 
-                               (int)dmabuf->fragsize)
-                               mask |= POLLOUT | POLLWRNORM;
-               }
-       }
-
-       if (file ->f_mode & FMODE_READ) {
-               state = &dev->state[AD_ADC_STATE];
-               dmabuf = &state->dmabuf;
-               if (dmabuf->count >= (int)dmabuf->fragsize)
-                       mask |= POLLIN | POLLRDNORM;
-       }
-       spin_unlock_irqrestore(&dev->lock, flags);
-
-#endif
-       return mask;
-}
-
-static int ad1889_mmap(struct file *file, struct vm_area_struct *vma)
-{
-       return 0;
-}
-
-static int ad1889_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-       unsigned long arg)
-{
-       int val = 0;
-       ad1889_dev_t *dev = (ad1889_dev_t *)file->private_data;
-       struct dmabuf *dmabuf;
-       audio_buf_info abinfo;
-       int __user *p = (int __user *)arg;
-
-       DBG("ad1889_ioctl cmd 0x%x arg %lu\n", cmd, arg);
-
-       switch (cmd)
-       {
-       case OSS_GETVERSION:
-               return put_user(SOUND_VERSION, p);
-
-       case SNDCTL_DSP_RESET:
-               break;
-
-       case SNDCTL_DSP_SYNC:
-               break;
-
-       case SNDCTL_DSP_SPEED:
-               /* set sampling rate */
-               if (get_user(val, p))
-                       return -EFAULT;
-               if (val > 5400 && val < 48000)
-               {
-                       if (file->f_mode & FMODE_WRITE)
-                               AD1889_WRITEW(ad1889_dev, AD_DS_WAS, val);
-                       if (file->f_mode & FMODE_READ)
-                               AD1889_WRITEW(ad1889_dev, AD_DS_RES, val);
-               }
-               return 0;
-
-       case SNDCTL_DSP_STEREO: /* undocumented? */
-               if (get_user(val, p))
-                       return -EFAULT;
-               if (file->f_mode & FMODE_READ) {
-                       val = AD1889_READW(ad1889_dev, AD_DS_WSMC);
-                       if (val) {
-                               val |= 0x0200;  /* set WAST */
-                       } else {
-                               val &= ~0x0200; /* clear WAST */
-                       }
-                       AD1889_WRITEW(ad1889_dev, AD_DS_WSMC, val);
-               }
-               if (file->f_mode & FMODE_WRITE) {
-                       val = AD1889_READW(ad1889_dev, AD_DS_RAMC);
-                       if (val) {
-                               val |= 0x0002;  /* set ADST */
-                       } else {
-                               val &= ~0x0002; /* clear ADST */
-                       }
-                       AD1889_WRITEW(ad1889_dev, AD_DS_RAMC, val);
-               }
-
-               return 0;
-
-       case SNDCTL_DSP_GETBLKSIZE:
-               return put_user(DMA_SIZE, p);
-
-       case SNDCTL_DSP_GETFMTS:
-               return put_user(AFMT_S16_LE|AFMT_U8, p);
-
-       case SNDCTL_DSP_SETFMT:
-               if (get_user(val, p))
-                       return -EFAULT;
-
-               if (val == 0) {
-                       if (file->f_mode & FMODE_READ) 
-                               ad1889_set_adc_fmt(dev, val);
-
-                       if (file->f_mode & FMODE_WRITE) 
-                               ad1889_set_wav_fmt(dev, val);
-               } else {
-                       val = AFMT_S16_LE | AFMT_U8;
-               }
-
-               return put_user(val, p);
-
-       case SNDCTL_DSP_CHANNELS:
-               break;
-
-       case SNDCTL_DSP_POST:
-               /* send all data to device */
-               break;
-
-       case SNDCTL_DSP_SUBDIVIDE:
-               break;
-
-       case SNDCTL_DSP_SETFRAGMENT:
-               /* not supported; uses fixed fragment sizes */
-               return put_user(DMA_SIZE, p);
-
-       case SNDCTL_DSP_GETOSPACE:
-       case SNDCTL_DSP_GETISPACE:
-               /* space left in dma buffers */
-               if (cmd == SNDCTL_DSP_GETOSPACE)
-                       dmabuf = &dev->state[AD_WAV_STATE].dmabuf;
-               else
-                       dmabuf = &dev->state[AD_ADC_STATE].dmabuf;
-               abinfo.fragments = 1;
-               abinfo.fragstotal = 1;
-               abinfo.fragsize = DMA_SIZE;
-               abinfo.bytes = DMA_SIZE;
-               return copy_to_user(p, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
-       case SNDCTL_DSP_NONBLOCK:
-               file->f_flags |= O_NONBLOCK;
-               return 0;
-
-       case SNDCTL_DSP_GETCAPS:
-               return put_user(0, p);
-
-       case SNDCTL_DSP_GETTRIGGER:
-       case SNDCTL_DSP_SETTRIGGER:
-               break;
-
-       case SNDCTL_DSP_GETIPTR:
-       case SNDCTL_DSP_GETOPTR:
-               break;
-
-       case SNDCTL_DSP_SETDUPLEX:
-               break;
-       
-       case SNDCTL_DSP_GETODELAY:
-               break;
-
-       case SOUND_PCM_READ_RATE:
-               return put_user(AD1889_READW(ad1889_dev, AD_DS_WAS), p);
-
-       case SOUND_PCM_READ_CHANNELS:
-       case SOUND_PCM_READ_BITS:
-               break;
-
-       case SNDCTL_DSP_MAPINBUF:
-       case SNDCTL_DSP_MAPOUTBUF:
-       case SNDCTL_DSP_SETSYNCRO:
-       case SOUND_PCM_WRITE_FILTER:
-       case SOUND_PCM_READ_FILTER:
-               break;
-
-       default:
-               break;
-       }
-
-       return -ENOTTY;
-}
-
-static int ad1889_open(struct inode *inode, struct file *file)
-{
-       /* check minor; only support /dev/dsp atm */
-       if (iminor(inode) != 3)
-               return -ENXIO;
-       
-       file->private_data = ad1889_dev;
-
-       ad1889_set_wav_rate(ad1889_dev, 48000);
-       ad1889_set_wav_fmt(ad1889_dev, AFMT_S16_LE);
-       AD1889_WRITEW(ad1889_dev, AD_DS_WADA, 0x0404); /* attenuation */
-       return nonseekable_open(inode, file);
-}
-
-static int ad1889_release(struct inode *inode, struct file *file)
-{
-       /* if we have state free it here */
-       return 0;
-}
-
-static const struct file_operations ad1889_fops = {
-       .owner          = THIS_MODULE,
-       .llseek         = no_llseek,
-       .read           = ad1889_read,
-       .write          = ad1889_write,
-       .poll           = ad1889_poll,
-       .ioctl          = ad1889_ioctl,
-       .mmap           = ad1889_mmap,
-       .open           = ad1889_open,
-       .release        = ad1889_release,
-};
-
-/************************* /dev/mixer interfaces ************************ */
-static int ad1889_mixer_open(struct inode *inode, struct file *file)
-{
-       if (ad1889_dev->ac97_codec->dev_mixer != iminor(inode))
-               return -ENODEV;
-
-       file->private_data = ad1889_dev->ac97_codec;
-       return 0;
-}
-
-static int ad1889_mixer_release(struct inode *inode, struct file *file)
-{
-       return 0;
-}
-
-static int ad1889_mixer_ioctl(struct inode *inode, struct file *file,
-       unsigned int cmd, unsigned long arg)
-{
-       struct ac97_codec *codec = (struct ac97_codec *)file->private_data;
-       return codec->mixer_ioctl(codec, cmd, arg);
-}
-
-static const struct file_operations ad1889_mixer_fops = {
-       .owner          = THIS_MODULE,
-       .llseek         = no_llseek,
-       .ioctl          = ad1889_mixer_ioctl,
-       .open           = ad1889_mixer_open,
-       .release        = ad1889_mixer_release,
-};
-
-/************************* AC97 interfaces ****************************** */
-static void ad1889_codec_write(struct ac97_codec *ac97, u8 reg, u16 val)
-{
-       ad1889_dev_t *dev = ac97->private_data;
-
-       //DBG("Writing 0x%x to 0x%lx\n", val, dev->regbase + AD_AC97_BASE + reg);
-       AD1889_WRITEW(dev, AD_AC97_BASE + reg, val);
-}
-
-static u16 ad1889_codec_read(struct ac97_codec *ac97, u8 reg)
-{
-       ad1889_dev_t *dev = ac97->private_data;
-       //DBG("Reading from 0x%lx\n", dev->regbase + AD_AC97_BASE + reg);
-       return AD1889_READW(dev, AD_AC97_BASE + reg);
-}      
-
-static int ad1889_ac97_init(ad1889_dev_t *dev, int id)
-{
-       struct ac97_codec *ac97;
-       u16 eid;
-
-       if ((ac97 = ac97_alloc_codec()) == NULL) 
-               return -ENOMEM;
-
-       ac97->private_data = dev;
-       ac97->id = id;
-
-       ac97->codec_read = ad1889_codec_read;
-       ac97->codec_write = ad1889_codec_write;
-
-       if (ac97_probe_codec(ac97) == 0) {
-               printk(DEVNAME ": ac97_probe_codec failed\n");
-               goto out_free;
-       }
-
-       eid = ad1889_codec_read(ac97, AC97_EXTENDED_ID);
-       if (eid == 0xffff) {
-               printk(KERN_WARNING DEVNAME ": no codec attached?\n");
-               goto out_free;
-       }
-
-       dev->ac97_features = eid;
-
-       if ((ac97->dev_mixer = register_sound_mixer(&ad1889_mixer_fops, -1)) < 0) {
-               printk(KERN_ERR DEVNAME ": cannot register mixer\n");
-               goto out_free;
-       }
-
-       dev->ac97_codec = ac97;
-       return 0;
-
-out_free:
-       ac97_release_codec(ac97);
-       return -ENODEV;
-}
-
-static int ad1889_aclink_reset(struct pci_dev * pcidev)
-{
-       u16 stat;
-       int retry = 200;
-       ad1889_dev_t *dev = pci_get_drvdata(pcidev);
-
-       AD1889_WRITEW(dev, AD_DS_CCS, 0x8000); /* turn on clock */
-       AD1889_READW(dev, AD_DS_CCS);
-
-       WAIT_10MS();
-
-       stat = AD1889_READW(dev, AD_AC97_ACIC);
-       stat |= 0x0002;                         /* Reset Disable */
-       AD1889_WRITEW(dev, AD_AC97_ACIC, stat);
-       (void) AD1889_READW(dev, AD_AC97_ACIC); /* flush posted write */
-
-       udelay(10);
-
-       stat = AD1889_READW(dev, AD_AC97_ACIC);
-       stat |= 0x0001;                         /* Interface Enable */
-       AD1889_WRITEW(dev, AD_AC97_ACIC, stat);
-
-       do {
-               if (AD1889_READW(dev, AD_AC97_ACIC) & 0x8000)   /* Ready */
-                       break;
-               WAIT_10MS();
-               retry--;
-       } while (retry > 0);
-
-       if (!retry) {
-               printk(KERN_ERR "ad1889_aclink_reset: codec is not ready [0x%x]\n",
-                           AD1889_READW(dev, AD_AC97_ACIC));
-               return -EBUSY;
-       }
-
-       /* TODO reset AC97 codec */
-       /* TODO set wave/adc pci ctrl status */
-
-       stat = AD1889_READW(dev, AD_AC97_ACIC);
-       stat |= 0x0004;                         /* Audio Stream Output Enable */
-       AD1889_WRITEW(dev, AD_AC97_ACIC, stat);
-       return 0;
-}
-
-/************************* PCI interfaces ****************************** */
-/* PCI device table */
-static struct pci_device_id ad1889_id_tbl[] = {
-       { PCI_VENDOR_ID_ANALOG_DEVICES, PCI_DEVICE_ID_AD1889JS, PCI_ANY_ID, 
-         PCI_ANY_ID, 0, 0, (unsigned long)DEVNAME },
-       { },
-};
-MODULE_DEVICE_TABLE(pci, ad1889_id_tbl);
-
-static irqreturn_t ad1889_interrupt(int irq, void *dev_id)
-{
-       u32 stat;
-       ad1889_dev_t *dev = (ad1889_dev_t *)dev_id;
-
-       stat = AD1889_READL(dev, AD_DMA_DISR);
-
-       /* clear ISR */
-       AD1889_WRITEL(dev, AD_DMA_DISR, stat);
-
-       if (stat & 0x8) {               /* WAVI */
-               DBG("WAV interrupt\n");
-               dev->stats.wav_intrs++;
-               if (dev->state[AD_WAV_STATE].dmabuf.ready) {
-                       ad1889_stop_wav(&dev->state[AD_WAV_STATE]);     /* clean up */
-                       ad1889_start_wav(&dev->state[AD_WAV_STATE]);    /* start new */
-               }
-       }
-
-       if ((stat & 0x2) && dev->state[AD_ADC_STATE].dmabuf.ready) { /* ADCI */
-               DBG("ADC interrupt\n");
-               dev->stats.adc_intrs++;
-       }
-       if(stat)
-               return IRQ_HANDLED;
-       return IRQ_NONE;
-}
-
-static void ad1889_initcfg(ad1889_dev_t *dev)
-{
-       u16 tmp16;
-       u32 tmp32;
-
-       /* make sure the interrupt bits are setup the way we want */
-       tmp32 = AD1889_READL(dev, AD_DMA_WAVCTRL);
-       tmp32 &= ~0xff; /* flat dma, no sg, mask out the intr bits */
-       tmp32 |= 0x6;  /* intr on count, loop */
-       AD1889_WRITEL(dev, AD_DMA_WAVCTRL, tmp32);
-
-       /* unmute... */
-       tmp16 = AD1889_READW(dev, AD_DS_WADA);
-       tmp16 &= ~0x8080;
-       AD1889_WRITEW(dev, AD_DS_WADA, tmp16);
-}
-
-static int __devinit ad1889_probe(struct pci_dev *pcidev, const struct pci_device_id *ent)
-{
-       int err;
-       ad1889_dev_t *dev;
-       unsigned long bar;
-       struct proc_dir_entry *proc_root = NULL;
-
-       if ((err = pci_enable_device(pcidev)) != 0) {
-               printk(KERN_ERR DEVNAME ": pci_enable_device failed\n");
-               return err;
-       }
-
-       pci_set_master(pcidev);
-       if ((dev = ad1889_alloc_dev(pcidev)) == NULL) {
-               printk(KERN_ERR DEVNAME ": cannot allocate memory for device\n");
-               return -ENOMEM;
-       }
-       pci_set_drvdata(pcidev, dev);
-       bar = pci_resource_start(pcidev, 0);
-       
-        if (!(pci_resource_flags(pcidev, 0) & IORESOURCE_MEM)) {
-               printk(KERN_ERR DEVNAME ": memory region not assigned\n");
-               goto out1;
-       }
-
-       if (pci_request_region(pcidev, 0, DEVNAME)) {
-               printk(KERN_ERR DEVNAME ": unable to request memory region\n");
-               goto out1;
-       }
-
-       dev->regbase = ioremap_nocache(bar, AD_DS_IOMEMSIZE);
-       if (!dev->regbase) {
-               printk(KERN_ERR DEVNAME ": unable to remap iomem\n");
-               goto out2;
-       }
-
-       if (request_irq(pcidev->irq, ad1889_interrupt, IRQF_SHARED, DEVNAME, dev) != 0) {
-               printk(KERN_ERR DEVNAME ": unable to request interrupt\n");
-               goto out3;
-       }
-
-       printk(KERN_INFO DEVNAME ": %s at %p IRQ %d\n",
-               (char *)ent->driver_data, dev->regbase, pcidev->irq);
-
-       if (ad1889_aclink_reset(pcidev) != 0)
-               goto out4;
-
-       /* register /dev/dsp */
-       if ((dev->dev_audio = register_sound_dsp(&ad1889_fops, -1)) < 0) {
-               printk(KERN_ERR DEVNAME ": cannot register /dev/dsp\n");
-               goto out4;
-       }
-
-       if ((err = ad1889_ac97_init(dev, 0)) != 0)
-               goto out5;
-
-       /* XXX: cleanups */
-       if (((proc_root = proc_mkdir("driver/ad1889", NULL)) == NULL) ||
-           create_proc_read_entry("ac97", S_IFREG|S_IRUGO, proc_root, ac97_read_proc, dev->ac97_codec) == NULL ||
-           create_proc_read_entry("info", S_IFREG|S_IRUGO, proc_root, ad1889_read_proc, dev) == NULL) 
-               goto out5;
-       
-       ad1889_initcfg(dev);
-
-       //DBG(DEVNAME ": Driver initialization done!\n");
-
-       ad1889_dev = dev;
-
-       return 0;
-
-out5:
-       unregister_sound_dsp(dev->dev_audio);
-out4:
-       free_irq(pcidev->irq, dev);
-out3:
-       iounmap(dev->regbase);
-out2:
-       pci_release_region(pcidev, 0);
-out1:
-       ad1889_free_dev(dev);
-       pci_set_drvdata(pcidev, NULL);
-
-       return -ENODEV;
-}
-
-static void __devexit ad1889_remove(struct pci_dev *pcidev)
-{
-       ad1889_dev_t *dev = pci_get_drvdata(pcidev);
-
-       if (dev == NULL) return;
-       
-       unregister_sound_mixer(dev->ac97_codec->dev_mixer);
-       unregister_sound_dsp(dev->dev_audio);
-       free_irq(pcidev->irq, dev);
-       iounmap(dev->regbase);
-       pci_release_region(pcidev, 0);
-
-       /* any hw programming needed? */
-       ad1889_free_dev(dev);
-       pci_set_drvdata(pcidev, NULL);
-}
-
-MODULE_AUTHOR("Randolph Chung");
-MODULE_DESCRIPTION("Analog Devices AD1889 PCI Audio");
-MODULE_LICENSE("GPL");
-
-static struct pci_driver ad1889_driver = {
-       .name           = DEVNAME,
-       .id_table       = ad1889_id_tbl,
-       .probe          = ad1889_probe,
-       .remove         = __devexit_p(ad1889_remove),
-};
-
-static int __init ad1889_init_module(void)
-{
-       return pci_register_driver(&ad1889_driver);
-}
-
-static void ad1889_exit_module(void)
-{
-       pci_unregister_driver(&ad1889_driver);
-       return;
-}
-
-module_init(ad1889_init_module);
-module_exit(ad1889_exit_module);
diff --git a/sound/oss/ad1889.h b/sound/oss/ad1889.h
deleted file mode 100644 (file)
index 0991376..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-#ifndef _AD1889_H_
-#define _AD1889_H_
-
-#define AD_DS_WSMC     0x00    /* DMA input wave/syn mixer control */
-#define AD_DS_RAMC     0x02    /* DMA output resamp/ADC mixer control */
-#define AD_DS_WADA     0x04    /* DMA input wave attenuation */
-#define AD_DS_SYDA     0x06    /* DMA input syn attentuation */
-#define AD_DS_WAS      0x08    /* wave input sample rate */
-#define AD_DS_RES      0x0a    /* resampler output sample rate */
-#define AD_DS_CCS      0x0c    /* chip control/status */
-
-#define AD_DMA_RESBA   0x40    /* RES base addr */
-#define AD_DMA_RESCA   0x44    /* RES current addr */
-#define AD_DMA_RESBC   0x48    /* RES base cnt */
-#define AD_DMA_RESCC   0x4c    /* RES current count */
-#define AD_DMA_ADCBA   0x50    /* ADC */
-#define AD_DMA_ADCCA   0x54
-#define AD_DMA_ADCBC   0x58
-#define AD_DMA_ADCCC   0x5c
-#define AD_DMA_SYNBA   0x60    /* SYN */
-#define AD_DMA_SYNCA   0x64
-#define AD_DMA_SYNBC   0x68
-#define AD_DMA_SYNCC   0x6c
-#define AD_DMA_WAVBA   0x70    /* WAV */
-#define AD_DMA_WAVCA   0x74
-#define AD_DMA_WAVBC   0x78
-#define AD_DMA_WAVCC   0x7c
-#define AD_DMA_RESICC  0x80    /* RES interrupt current count */
-#define AD_DMA_RESIBC  0x84    /* RES interrupt base count */
-#define AD_DMA_ADCICC  0x88    /* ADC interrupt current count */
-#define AD_DMA_ADCIBC  0x8c    /* ADC interrupt base count */
-#define AD_DMA_SYNICC  0x90    /* SYN interrupt current count */
-#define AD_DMA_SYNIBC  0x94    /* SYN interrupt base count */
-#define AD_DMA_WAVICC  0x98    /* WAV interrupt current count */
-#define AD_DMA_WAVIBC  0x9c    /* WAV interrupt base count */
-#define AD_DMA_RESCTRL 0xa0    /* RES PCI control/status */
-#define AD_DMA_ADCCTRL 0xa8    /* ADC PCI control/status */
-#define AD_DMA_SYNCTRL 0xb0    /* SYN PCI control/status */
-#define AD_DMA_WAVCTRL 0xb8    /* WAV PCI control/status */
-#define AD_DMA_DISR    0xc0    /* PCI DMA intr status */
-#define AD_DMA_CHSS    0xc4    /* PCI DMA channel stop status */
-
-#define AD_GPIO_IPC    0xc8    /* IO port ctrl */
-#define AD_GPIO_OP     0xca    /* IO output status */
-#define AD_GPIO_IP     0xcc    /* IO input status */
-
-/* AC97 registers, 0x100 - 0x17f; see ac97.h */
-#define AD_AC97_BASE    0x100   /* ac97 base register */
-#define AD_AC97_ACIC   0x180   /* AC Link interface ctrl */
-
-/* OPL3; BAR1 */
-#define AD_OPL_M0AS    0x00    /* Music0 address/status */
-#define AD_OPL_M0DATA  0x01    /* Music0 data */
-#define AD_OPL_M1A     0x02    /* Music1 address */
-#define AD_OPL_M1DATA  0x03    /* Music1 data */
-/* 0x04-0x0f reserved */
-
-/* MIDI; BAR2 */
-#define AD_MIDA                0x00    /* MIDI data */
-#define AD_MISC                0x01    /* MIDI status/cmd */
-/* 0x02-0xff reserved */
-
-#define AD_DS_IOMEMSIZE        512
-#define AD_OPL_MEMSIZE 16
-#define AD_MIDI_MEMSIZE        16
-
-#define AD_WAV_STATE   0
-#define AD_ADC_STATE   1
-#define AD_MAX_STATES  2
-
-#define DMA_SIZE       (128*1024)
-
-#define DMA_FLAG_MAPPED        1
-
-struct ad1889_dev;
-
-typedef struct ad1889_state {
-       struct ad1889_dev *card;
-
-       mode_t open_mode;
-       struct dmabuf {
-               unsigned int rate;
-               unsigned char fmt, enable;
-
-               /* buf management */
-               size_t rawbuf_size;
-               void *rawbuf;
-               dma_addr_t dma_handle;  /* mapped address */
-               unsigned long dma_len;  /* number of bytes mapped */
-
-               /* indexes into rawbuf for setting up DMA engine */
-               volatile unsigned long rd_ptr, wr_ptr;
-
-               wait_queue_head_t wait; /* to wait for buf servicing */
-
-               /* OSS bits */
-               unsigned int mapped:1;
-               unsigned int ready:1;
-               unsigned int ossfragshift;
-               int ossmaxfrags;
-               unsigned int subdivision;
-       } dmabuf;
-
-       struct mutex mutex;
-} ad1889_state_t;
-
-typedef struct ad1889_dev {
-       void __iomem *regbase;
-       struct pci_dev *pci;
-       
-       spinlock_t lock;
-
-       int dev_audio;
-
-       /* states; one per channel; right now only WAV and ADC */
-       struct ad1889_state state[AD_MAX_STATES];
-
-       /* AC97 codec */
-       struct ac97_codec *ac97_codec;
-       u16 ac97_features;
-
-       /* debugging stuff */
-       struct stats {
-               unsigned int wav_intrs, adc_intrs;
-               unsigned int blocks, underrun, error;
-       } stats;
-} ad1889_dev_t;
-
-typedef struct ad1889_reg {
-       const char *name;
-       int offset;
-       int width;
-} ad1889_reg_t;
-
-#endif
diff --git a/sound/oss/adlib_card.c b/sound/oss/adlib_card.c
deleted file mode 100644 (file)
index c9a7c9b..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * sound/oss/adlib_card.c
- *
- * Detection routine for the AdLib card.
- *
- * Copyright (C) by Hannu Savolainen 1993-1997
- *
- * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
- * Version 2 (June 1991). See the "COPYING" file distributed with this software
- * for more info.
- */
-
-#include <linux/module.h>
-#include <linux/init.h>
-
-#include "sound_config.h"
-
-#include "opl3.h"
-
-static void __init attach_adlib_card(struct address_info *hw_config)
-{
-       hw_config->slots[0] = opl3_init(hw_config->io_base, hw_config->osp, THIS_MODULE);
-}
-
-static int __init probe_adlib(struct address_info *hw_config)
-{
-       return opl3_detect(hw_config->io_base, hw_config->osp);
-}
-
-static struct address_info cfg;
-
-static int __initdata io = -1;
-
-module_param(io, int, 0);
-
-static int __init init_adlib(void)
-{
-       cfg.io_base = io;
-
-       if (cfg.io_base == -1) {
-               printk(KERN_ERR "adlib: must specify I/O address.\n");
-               return -EINVAL;
-       }
-       if (probe_adlib(&cfg) == 0)
-               return -ENODEV;
-       attach_adlib_card(&cfg);
-
-       return 0;
-}
-
-static void __exit cleanup_adlib(void)
-{
-       sound_unload_synthdev(cfg.slots[0]);
-       
-}
-
-module_init(init_adlib);
-module_exit(cleanup_adlib);
-
-#ifndef MODULE
-static int __init setup_adlib(char *str)
-{
-        /* io */
-       int ints[2];
-       str = get_options(str, ARRAY_SIZE(ints), ints);
-       
-       io = ints[1];
-
-       return 1;
-}
-__setup("adlib=", setup_adlib);
-#endif
-MODULE_LICENSE("GPL");
diff --git a/sound/oss/cs461x.h b/sound/oss/cs461x.h
deleted file mode 100644 (file)
index 0ce4133..0000000
+++ /dev/null
@@ -1,1691 +0,0 @@
-#ifndef __CS461X_H
-#define __CS461X_H
-
-/*
- *  Copyright (c) by Cirrus Logic Corporation <pcaudio@crystal.cirrus.com>
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
- *  Definitions for Cirrus Logic CS461x chips
- *
- *
- *   This program is free software; you can redistribute it and/or modify
- *   it under the terms of the GNU General Public License as published by
- *   the Free Software Foundation; either version 2 of the License, or
- *   (at your option) any later version.
- *
- *   This program is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
- *
- *   You should have received a copy of the GNU General Public License
- *   along with this program; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-#ifndef PCI_VENDOR_ID_CIRRUS
-#define PCI_VENDOR_ID_CIRRUS            0x1013
-#endif
-#ifndef PCI_DEVICE_ID_CIRRUS_4610
-#define PCI_DEVICE_ID_CIRRUS_4610       0x6001
-#endif
-#ifndef PCI_DEVICE_ID_CIRRUS_4612
-#define PCI_DEVICE_ID_CIRRUS_4612       0x6003
-#endif
-#ifndef PCI_DEVICE_ID_CIRRUS_4615
-#define PCI_DEVICE_ID_CIRRUS_4615       0x6004
-#endif
-
-/*
- *  Direct registers
- */
-
-/*
- *  The following define the offsets of the registers accessed via base address
- *  register zero on the CS461x part.
- */
-#define BA0_HISR                               0x00000000
-#define BA0_HSR0                                0x00000004
-#define BA0_HICR                                0x00000008
-#define BA0_DMSR                                0x00000100
-#define BA0_HSAR                                0x00000110
-#define BA0_HDAR                                0x00000114
-#define BA0_HDMR                                0x00000118
-#define BA0_HDCR                                0x0000011C
-#define BA0_PFMC                                0x00000200
-#define BA0_PFCV1                               0x00000204
-#define BA0_PFCV2                               0x00000208
-#define BA0_PCICFG00                            0x00000300
-#define BA0_PCICFG04                            0x00000304
-#define BA0_PCICFG08                            0x00000308
-#define BA0_PCICFG0C                            0x0000030C
-#define BA0_PCICFG10                            0x00000310
-#define BA0_PCICFG14                            0x00000314
-#define BA0_PCICFG18                            0x00000318
-#define BA0_PCICFG1C                            0x0000031C
-#define BA0_PCICFG20                            0x00000320
-#define BA0_PCICFG24                            0x00000324
-#define BA0_PCICFG28                            0x00000328
-#define BA0_PCICFG2C                            0x0000032C
-#define BA0_PCICFG30                            0x00000330
-#define BA0_PCICFG34                            0x00000334
-#define BA0_PCICFG38                            0x00000338
-#define BA0_PCICFG3C                            0x0000033C
-#define BA0_CLKCR1                              0x00000400
-#define BA0_CLKCR2                              0x00000404
-#define BA0_PLLM                                0x00000408
-#define BA0_PLLCC                               0x0000040C
-#define BA0_FRR                                 0x00000410 
-#define BA0_CFL1                                0x00000414
-#define BA0_CFL2                                0x00000418
-#define BA0_SERMC1                              0x00000420
-#define BA0_SERMC2                              0x00000424
-#define BA0_SERC1                               0x00000428
-#define BA0_SERC2                               0x0000042C
-#define BA0_SERC3                               0x00000430
-#define BA0_SERC4                               0x00000434
-#define BA0_SERC5                               0x00000438
-#define BA0_SERBSP                              0x0000043C
-#define BA0_SERBST                              0x00000440
-#define BA0_SERBCM                              0x00000444
-#define BA0_SERBAD                              0x00000448
-#define BA0_SERBCF                              0x0000044C
-#define BA0_SERBWP                              0x00000450
-#define BA0_SERBRP                              0x00000454
-#ifndef NO_CS4612
-#define BA0_ASER_FADDR                          0x00000458
-#endif
-#define BA0_ACCTL                               0x00000460
-#define BA0_ACSTS                               0x00000464
-#define BA0_ACOSV                               0x00000468
-#define BA0_ACCAD                               0x0000046C
-#define BA0_ACCDA                               0x00000470
-#define BA0_ACISV                               0x00000474
-#define BA0_ACSAD                               0x00000478
-#define BA0_ACSDA                               0x0000047C
-#define BA0_JSPT                                0x00000480
-#define BA0_JSCTL                               0x00000484
-#define BA0_JSC1                                0x00000488
-#define BA0_JSC2                                0x0000048C
-#define BA0_MIDCR                               0x00000490
-#define BA0_MIDSR                               0x00000494
-#define BA0_MIDWP                               0x00000498
-#define BA0_MIDRP                               0x0000049C
-#define BA0_JSIO                                0x000004A0
-#ifndef NO_CS4612
-#define BA0_ASER_MASTER                         0x000004A4
-#endif
-#define BA0_CFGI                                0x000004B0
-#define BA0_SSVID                               0x000004B4
-#define BA0_GPIOR                               0x000004B8
-#ifndef NO_CS4612
-#define BA0_EGPIODR                             0x000004BC
-#define BA0_EGPIOPTR                            0x000004C0
-#define BA0_EGPIOTR                             0x000004C4
-#define BA0_EGPIOWR                             0x000004C8
-#define BA0_EGPIOSR                             0x000004CC
-#define BA0_SERC6                               0x000004D0
-#define BA0_SERC7                               0x000004D4
-#define BA0_SERACC                              0x000004D8
-#define BA0_ACCTL2                              0x000004E0
-#define BA0_ACSTS2                              0x000004E4
-#define BA0_ACOSV2                              0x000004E8
-#define BA0_ACCAD2                              0x000004EC
-#define BA0_ACCDA2                              0x000004F0
-#define BA0_ACISV2                              0x000004F4
-#define BA0_ACSAD2                              0x000004F8
-#define BA0_ACSDA2                              0x000004FC
-#define BA0_IOTAC0                              0x00000500
-#define BA0_IOTAC1                              0x00000504
-#define BA0_IOTAC2                              0x00000508
-#define BA0_IOTAC3                              0x0000050C
-#define BA0_IOTAC4                              0x00000510
-#define BA0_IOTAC5                              0x00000514
-#define BA0_IOTAC6                              0x00000518
-#define BA0_IOTAC7                              0x0000051C
-#define BA0_IOTAC8                              0x00000520
-#define BA0_IOTAC9                              0x00000524
-#define BA0_IOTAC10                             0x00000528
-#define BA0_IOTAC11                             0x0000052C
-#define BA0_IOTFR0                              0x00000540
-#define BA0_IOTFR1                              0x00000544
-#define BA0_IOTFR2                              0x00000548
-#define BA0_IOTFR3                              0x0000054C
-#define BA0_IOTFR4                              0x00000550
-#define BA0_IOTFR5                              0x00000554
-#define BA0_IOTFR6                              0x00000558
-#define BA0_IOTFR7                              0x0000055C
-#define BA0_IOTFIFO                             0x00000580
-#define BA0_IOTRRD                              0x00000584
-#define BA0_IOTFP                               0x00000588
-#define BA0_IOTCR                               0x0000058C
-#define BA0_DPCID                               0x00000590
-#define BA0_DPCIA                               0x00000594
-#define BA0_DPCIC                               0x00000598
-#define BA0_PCPCIR                              0x00000600
-#define BA0_PCPCIG                              0x00000604
-#define BA0_PCPCIEN                             0x00000608
-#define BA0_EPCIPMC                             0x00000610
-#endif
-
-/*
- *  The following define the offsets of the registers and memories accessed via
- *  base address register one on the CS461x part.
- */
-#define BA1_SP_DMEM0                            0x00000000
-#define BA1_SP_DMEM1                            0x00010000
-#define BA1_SP_PMEM                             0x00020000
-#define BA1_SP_REG                             0x00030000
-#define BA1_SPCR                                0x00030000
-#define BA1_DREG                                0x00030004
-#define BA1_DSRWP                               0x00030008
-#define BA1_TWPR                                0x0003000C
-#define BA1_SPWR                                0x00030010
-#define BA1_SPIR                                0x00030014
-#define BA1_FGR1                                0x00030020
-#define BA1_SPCS                                0x00030028
-#define BA1_SDSR                                0x0003002C
-#define BA1_FRMT                                0x00030030
-#define BA1_FRCC                                0x00030034
-#define BA1_FRSC                                0x00030038
-#define BA1_OMNI_MEM                            0x000E0000
-
-/*
- *  The following defines are for the flags in the host interrupt status
- *  register.
- */
-#define HISR_VC_MASK                            0x0000FFFF
-#define HISR_VC0                                0x00000001
-#define HISR_VC1                                0x00000002
-#define HISR_VC2                                0x00000004
-#define HISR_VC3                                0x00000008
-#define HISR_VC4                                0x00000010
-#define HISR_VC5                                0x00000020
-#define HISR_VC6                                0x00000040
-#define HISR_VC7                                0x00000080
-#define HISR_VC8                                0x00000100
-#define HISR_VC9                                0x00000200
-#define HISR_VC10                               0x00000400
-#define HISR_VC11                               0x00000800
-#define HISR_VC12                               0x00001000
-#define HISR_VC13                               0x00002000
-#define HISR_VC14                               0x00004000
-#define HISR_VC15                               0x00008000
-#define HISR_INT0                               0x00010000
-#define HISR_INT1                               0x00020000
-#define HISR_DMAI                               0x00040000
-#define HISR_FROVR                              0x00080000
-#define HISR_MIDI                               0x00100000
-#ifdef NO_CS4612
-#define HISR_RESERVED                           0x0FE00000
-#else
-#define HISR_SBINT                              0x00200000
-#define HISR_RESERVED                           0x0FC00000
-#endif
-#define HISR_H0P                                0x40000000
-#define HISR_INTENA                             0x80000000
-
-/*
- *  The following defines are for the flags in the host signal register 0.
- */
-#define HSR0_VC_MASK                            0xFFFFFFFF
-#define HSR0_VC16                               0x00000001
-#define HSR0_VC17                               0x00000002
-#define HSR0_VC18                               0x00000004
-#define HSR0_VC19                               0x00000008
-#define HSR0_VC20                               0x00000010
-#define HSR0_VC21                               0x00000020
-#define HSR0_VC22                               0x00000040
-#define HSR0_VC23                               0x00000080
-#define HSR0_VC24                               0x00000100
-#define HSR0_VC25                               0x00000200
-#define HSR0_VC26                               0x00000400
-#define HSR0_VC27                               0x00000800
-#define HSR0_VC28                               0x00001000
-#define HSR0_VC29                               0x00002000
-#define HSR0_VC30                               0x00004000
-#define HSR0_VC31                               0x00008000
-#define HSR0_VC32                               0x00010000
-#define HSR0_VC33                               0x00020000
-#define HSR0_VC34                               0x00040000
-#define HSR0_VC35                               0x00080000
-#define HSR0_VC36                               0x00100000
-#define HSR0_VC37                               0x00200000
-#define HSR0_VC38                               0x00400000
-#define HSR0_VC39                               0x00800000
-#define HSR0_VC40                               0x01000000
-#define HSR0_VC41                               0x02000000
-#define HSR0_VC42                               0x04000000
-#define HSR0_VC43                               0x08000000
-#define HSR0_VC44                               0x10000000
-#define HSR0_VC45                               0x20000000
-#define HSR0_VC46                               0x40000000
-#define HSR0_VC47                               0x80000000
-
-/*
- *  The following defines are for the flags in the host interrupt control
- *  register.
- */
-#define HICR_IEV                                0x00000001
-#define HICR_CHGM                               0x00000002
-
-/*
- *  The following defines are for the flags in the DMA status register.
- */
-#define DMSR_HP                                 0x00000001
-#define DMSR_HR                                 0x00000002
-#define DMSR_SP                                 0x00000004
-#define DMSR_SR                                 0x00000008
-
-/*
- *  The following defines are for the flags in the host DMA source address
- *  register.
- */
-#define HSAR_HOST_ADDR_MASK                     0xFFFFFFFF
-#define HSAR_DSP_ADDR_MASK                      0x0000FFFF
-#define HSAR_MEMID_MASK                         0x000F0000
-#define HSAR_MEMID_SP_DMEM0                     0x00000000
-#define HSAR_MEMID_SP_DMEM1                     0x00010000
-#define HSAR_MEMID_SP_PMEM                      0x00020000
-#define HSAR_MEMID_SP_DEBUG                     0x00030000
-#define HSAR_MEMID_OMNI_MEM                     0x000E0000
-#define HSAR_END                                0x40000000
-#define HSAR_ERR                                0x80000000
-
-/*
- *  The following defines are for the flags in the host DMA destination address
- *  register.
- */
-#define HDAR_HOST_ADDR_MASK                     0xFFFFFFFF
-#define HDAR_DSP_ADDR_MASK                      0x0000FFFF
-#define HDAR_MEMID_MASK                         0x000F0000
-#define HDAR_MEMID_SP_DMEM0                     0x00000000
-#define HDAR_MEMID_SP_DMEM1                     0x00010000
-#define HDAR_MEMID_SP_PMEM                      0x00020000
-#define HDAR_MEMID_SP_DEBUG                     0x00030000
-#define HDAR_MEMID_OMNI_MEM                     0x000E0000
-#define HDAR_END                                0x40000000
-#define HDAR_ERR                                0x80000000
-
-/*
- *  The following defines are for the flags in the host DMA control register.
- */
-#define HDMR_AC_MASK                            0x0000F000
-#define HDMR_AC_8_16                            0x00001000
-#define HDMR_AC_M_S                             0x00002000
-#define HDMR_AC_B_L                             0x00004000
-#define HDMR_AC_S_U                             0x00008000
-
-/*
- *  The following defines are for the flags in the host DMA control register.
- */
-#define HDCR_COUNT_MASK                         0x000003FF
-#define HDCR_DONE                               0x00004000
-#define HDCR_OPT                                0x00008000
-#define HDCR_WBD                                0x00400000
-#define HDCR_WBS                                0x00800000
-#define HDCR_DMS_MASK                           0x07000000
-#define HDCR_DMS_LINEAR                         0x00000000
-#define HDCR_DMS_16_DWORDS                      0x01000000
-#define HDCR_DMS_32_DWORDS                      0x02000000
-#define HDCR_DMS_64_DWORDS                      0x03000000
-#define HDCR_DMS_128_DWORDS                     0x04000000
-#define HDCR_DMS_256_DWORDS                     0x05000000
-#define HDCR_DMS_512_DWORDS                     0x06000000
-#define HDCR_DMS_1024_DWORDS                    0x07000000
-#define HDCR_DH                                 0x08000000
-#define HDCR_SMS_MASK                           0x70000000
-#define HDCR_SMS_LINEAR                         0x00000000
-#define HDCR_SMS_16_DWORDS                      0x10000000
-#define HDCR_SMS_32_DWORDS                      0x20000000
-#define HDCR_SMS_64_DWORDS                      0x30000000
-#define HDCR_SMS_128_DWORDS                     0x40000000
-#define HDCR_SMS_256_DWORDS                     0x50000000
-#define HDCR_SMS_512_DWORDS                     0x60000000
-#define HDCR_SMS_1024_DWORDS                    0x70000000
-#define HDCR_SH                                 0x80000000
-#define HDCR_COUNT_SHIFT                        0
-
-/*
- *  The following defines are for the flags in the performance monitor control
- *  register.
- */
-#define PFMC_C1SS_MASK                          0x0000001F
-#define PFMC_C1EV                               0x00000020
-#define PFMC_C1RS                               0x00008000
-#define PFMC_C2SS_MASK                          0x001F0000
-#define PFMC_C2EV                               0x00200000
-#define PFMC_C2RS                               0x80000000
-#define PFMC_C1SS_SHIFT                         0
-#define PFMC_C2SS_SHIFT                         16
-#define PFMC_BUS_GRANT                          0
-#define PFMC_GRANT_AFTER_REQ                    1
-#define PFMC_TRANSACTION                        2
-#define PFMC_DWORD_TRANSFER                     3
-#define PFMC_SLAVE_READ                         4
-#define PFMC_SLAVE_WRITE                        5
-#define PFMC_PREEMPTION                         6
-#define PFMC_DISCONNECT_RETRY                   7
-#define PFMC_INTERRUPT                          8
-#define PFMC_BUS_OWNERSHIP                      9
-#define PFMC_TRANSACTION_LAG                    10
-#define PFMC_PCI_CLOCK                          11
-#define PFMC_SERIAL_CLOCK                       12
-#define PFMC_SP_CLOCK                           13
-
-/*
- *  The following defines are for the flags in the performance counter value 1
- *  register.
- */
-#define PFCV1_PC1V_MASK                         0xFFFFFFFF
-#define PFCV1_PC1V_SHIFT                        0
-
-/*
- *  The following defines are for the flags in the performance counter value 2
- *  register.
- */
-#define PFCV2_PC2V_MASK                         0xFFFFFFFF
-#define PFCV2_PC2V_SHIFT                        0
-
-/*
- *  The following defines are for the flags in the clock control register 1.
- */
-#define CLKCR1_OSCS                             0x00000001
-#define CLKCR1_OSCP                             0x00000002
-#define CLKCR1_PLLSS_MASK                       0x0000000C
-#define CLKCR1_PLLSS_SERIAL                     0x00000000
-#define CLKCR1_PLLSS_CRYSTAL                    0x00000004
-#define CLKCR1_PLLSS_PCI                        0x00000008
-#define CLKCR1_PLLSS_RESERVED                   0x0000000C
-#define CLKCR1_PLLP                             0x00000010
-#define CLKCR1_SWCE                             0x00000020
-#define CLKCR1_PLLOS                            0x00000040
-
-/*
- *  The following defines are for the flags in the clock control register 2.
- */
-#define CLKCR2_PDIVS_MASK                       0x0000000F
-#define CLKCR2_PDIVS_1                          0x00000001
-#define CLKCR2_PDIVS_2                          0x00000002
-#define CLKCR2_PDIVS_4                          0x00000004
-#define CLKCR2_PDIVS_7                          0x00000007
-#define CLKCR2_PDIVS_8                          0x00000008
-#define CLKCR2_PDIVS_16                         0x00000000
-
-/*
- *  The following defines are for the flags in the PLL multiplier register.
- */
-#define PLLM_MASK                               0x000000FF
-#define PLLM_SHIFT                              0
-
-/*
- *  The following defines are for the flags in the PLL capacitor coefficient
- *  register.
- */
-#define PLLCC_CDR_MASK                          0x00000007
-#ifndef NO_CS4610
-#define PLLCC_CDR_240_350_MHZ                   0x00000000
-#define PLLCC_CDR_184_265_MHZ                   0x00000001
-#define PLLCC_CDR_144_205_MHZ                   0x00000002
-#define PLLCC_CDR_111_160_MHZ                   0x00000003
-#define PLLCC_CDR_87_123_MHZ                    0x00000004
-#define PLLCC_CDR_67_96_MHZ                     0x00000005
-#define PLLCC_CDR_52_74_MHZ                     0x00000006
-#define PLLCC_CDR_45_58_MHZ                     0x00000007
-#endif
-#ifndef NO_CS4612
-#define PLLCC_CDR_271_398_MHZ                   0x00000000
-#define PLLCC_CDR_227_330_MHZ                   0x00000001
-#define PLLCC_CDR_167_239_MHZ                   0x00000002
-#define PLLCC_CDR_150_215_MHZ                   0x00000003
-#define PLLCC_CDR_107_154_MHZ                   0x00000004
-#define PLLCC_CDR_98_140_MHZ                    0x00000005
-#define PLLCC_CDR_73_104_MHZ                    0x00000006
-#define PLLCC_CDR_63_90_MHZ                     0x00000007
-#endif
-#define PLLCC_LPF_MASK                          0x000000F8
-#ifndef NO_CS4610
-#define PLLCC_LPF_23850_60000_KHZ               0x00000000
-#define PLLCC_LPF_7960_26290_KHZ                0x00000008
-#define PLLCC_LPF_4160_10980_KHZ                0x00000018
-#define PLLCC_LPF_1740_4580_KHZ                 0x00000038
-#define PLLCC_LPF_724_1910_KHZ                  0x00000078
-#define PLLCC_LPF_317_798_KHZ                   0x000000F8
-#endif
-#ifndef NO_CS4612
-#define PLLCC_LPF_25580_64530_KHZ               0x00000000
-#define PLLCC_LPF_14360_37270_KHZ               0x00000008
-#define PLLCC_LPF_6100_16020_KHZ                0x00000018
-#define PLLCC_LPF_2540_6690_KHZ                 0x00000038
-#define PLLCC_LPF_1050_2780_KHZ                 0x00000078
-#define PLLCC_LPF_450_1160_KHZ                  0x000000F8
-#endif
-
-/*
- *  The following defines are for the flags in the feature reporting register.
- */
-#define FRR_FAB_MASK                            0x00000003
-#define FRR_MASK_MASK                           0x0000001C
-#ifdef NO_CS4612
-#define FRR_CFOP_MASK                           0x000000E0
-#else
-#define FRR_CFOP_MASK                           0x00000FE0
-#endif
-#define FRR_CFOP_NOT_DVD                        0x00000020
-#define FRR_CFOP_A3D                            0x00000040
-#define FRR_CFOP_128_PIN                        0x00000080
-#ifndef NO_CS4612
-#define FRR_CFOP_CS4280                         0x00000800
-#endif
-#define FRR_FAB_SHIFT                           0
-#define FRR_MASK_SHIFT                          2
-#define FRR_CFOP_SHIFT                          5
-
-/*
- *  The following defines are for the flags in the configuration load 1
- *  register.
- */
-#define CFL1_CLOCK_SOURCE_MASK                  0x00000003
-#define CFL1_CLOCK_SOURCE_CS423X                0x00000000
-#define CFL1_CLOCK_SOURCE_AC97                  0x00000001
-#define CFL1_CLOCK_SOURCE_CRYSTAL               0x00000002
-#define CFL1_CLOCK_SOURCE_DUAL_AC97             0x00000003
-#define CFL1_VALID_DATA_MASK                    0x000000FF
-
-/*
- *  The following defines are for the flags in the configuration load 2
- *  register.
- */
-#define CFL2_VALID_DATA_MASK                    0x000000FF
-
-/*
- *  The following defines are for the flags in the serial port master control
- *  register 1.
- */
-#define SERMC1_MSPE                             0x00000001
-#define SERMC1_PTC_MASK                         0x0000000E
-#define SERMC1_PTC_CS423X                       0x00000000
-#define SERMC1_PTC_AC97                         0x00000002
-#define SERMC1_PTC_DAC                          0x00000004
-#define SERMC1_PLB                              0x00000010
-#define SERMC1_XLB                              0x00000020
-
-/*
- *  The following defines are for the flags in the serial port master control
- *  register 2.
- */
-#define SERMC2_LROE                             0x00000001
-#define SERMC2_MCOE                             0x00000002
-#define SERMC2_MCDIV                            0x00000004
-
-/*
- *  The following defines are for the flags in the serial port 1 configuration
- *  register.
- */
-#define SERC1_SO1EN                             0x00000001
-#define SERC1_SO1F_MASK                         0x0000000E
-#define SERC1_SO1F_CS423X                       0x00000000
-#define SERC1_SO1F_AC97                         0x00000002
-#define SERC1_SO1F_DAC                          0x00000004
-#define SERC1_SO1F_SPDIF                        0x00000006
-
-/*
- *  The following defines are for the flags in the serial port 2 configuration
- *  register.
- */
-#define SERC2_SI1EN                             0x00000001
-#define SERC2_SI1F_MASK                         0x0000000E
-#define SERC2_SI1F_CS423X                       0x00000000
-#define SERC2_SI1F_AC97                         0x00000002
-#define SERC2_SI1F_ADC                          0x00000004
-#define SERC2_SI1F_SPDIF                        0x00000006
-
-/*
- *  The following defines are for the flags in the serial port 3 configuration
- *  register.
- */
-#define SERC3_SO2EN                             0x00000001
-#define SERC3_SO2F_MASK                         0x00000006
-#define SERC3_SO2F_DAC                          0x00000000
-#define SERC3_SO2F_SPDIF                        0x00000002
-
-/*
- *  The following defines are for the flags in the serial port 4 configuration
- *  register.
- */
-#define SERC4_SO3EN                             0x00000001
-#define SERC4_SO3F_MASK                         0x00000006
-#define SERC4_SO3F_DAC                          0x00000000
-#define SERC4_SO3F_SPDIF                        0x00000002
-
-/*
- *  The following defines are for the flags in the serial port 5 configuration
- *  register.
- */
-#define SERC5_SI2EN                             0x00000001
-#define SERC5_SI2F_MASK                         0x00000006
-#define SERC5_SI2F_ADC                          0x00000000
-#define SERC5_SI2F_SPDIF                        0x00000002
-
-/*
- *  The following defines are for the flags in the serial port backdoor sample
- *  pointer register.
- */
-#define SERBSP_FSP_MASK                         0x0000000F
-#define SERBSP_FSP_SHIFT                        0
-
-/*
- *  The following defines are for the flags in the serial port backdoor status
- *  register.
- */
-#define SERBST_RRDY                             0x00000001
-#define SERBST_WBSY                             0x00000002
-
-/*
- *  The following defines are for the flags in the serial port backdoor command
- *  register.
- */
-#define SERBCM_RDC                              0x00000001
-#define SERBCM_WRC                              0x00000002
-
-/*
- *  The following defines are for the flags in the serial port backdoor address
- *  register.
- */
-#ifdef NO_CS4612
-#define SERBAD_FAD_MASK                         0x000000FF
-#else
-#define SERBAD_FAD_MASK                         0x000001FF
-#endif
-#define SERBAD_FAD_SHIFT                        0
-
-/*
- *  The following defines are for the flags in the serial port backdoor
- *  configuration register.
- */
-#define SERBCF_HBP                              0x00000001
-
-/*
- *  The following defines are for the flags in the serial port backdoor write
- *  port register.
- */
-#define SERBWP_FWD_MASK                         0x000FFFFF
-#define SERBWP_FWD_SHIFT                        0
-
-/*
- *  The following defines are for the flags in the serial port backdoor read
- *  port register.
- */
-#define SERBRP_FRD_MASK                         0x000FFFFF
-#define SERBRP_FRD_SHIFT                        0
-
-/*
- *  The following defines are for the flags in the async FIFO address register.
- */
-#ifndef NO_CS4612
-#define ASER_FADDR_A1_MASK                      0x000001FF
-#define ASER_FADDR_EN1                          0x00008000
-#define ASER_FADDR_A2_MASK                      0x01FF0000
-#define ASER_FADDR_EN2                          0x80000000
-#define ASER_FADDR_A1_SHIFT                     0
-#define ASER_FADDR_A2_SHIFT                     16
-#endif
-
-/*
- *  The following defines are for the flags in the AC97 control register.
- */
-#define ACCTL_RSTN                              0x00000001
-#define ACCTL_ESYN                              0x00000002
-#define ACCTL_VFRM                              0x00000004
-#define ACCTL_DCV                               0x00000008
-#define ACCTL_CRW                               0x00000010
-#define ACCTL_ASYN                              0x00000020
-#ifndef NO_CS4612
-#define ACCTL_TC                                0x00000040
-#endif
-
-/*
- *  The following defines are for the flags in the AC97 status register.
- */
-#define ACSTS_CRDY                              0x00000001
-#define ACSTS_VSTS                              0x00000002
-#ifndef NO_CS4612
-#define ACSTS_WKUP                              0x00000004
-#endif
-
-/*
- *  The following defines are for the flags in the AC97 output slot valid
- *  register.
- */
-#define ACOSV_SLV3                              0x00000001
-#define ACOSV_SLV4                              0x00000002
-#define ACOSV_SLV5                              0x00000004
-#define ACOSV_SLV6                              0x00000008
-#define ACOSV_SLV7                              0x00000010
-#define ACOSV_SLV8                              0x00000020
-#define ACOSV_SLV9                              0x00000040
-#define ACOSV_SLV10                             0x00000080
-#define ACOSV_SLV11                             0x00000100
-#define ACOSV_SLV12                             0x00000200
-
-/*
- *  The following defines are for the flags in the AC97 command address
- *  register.
- */
-#define ACCAD_CI_MASK                           0x0000007F
-#define ACCAD_CI_SHIFT                          0
-
-/*
- *  The following defines are for the flags in the AC97 command data register.
- */
-#define ACCDA_CD_MASK                           0x0000FFFF
-#define ACCDA_CD_SHIFT                          0
-
-/*
- *  The following defines are for the flags in the AC97 input slot valid
- *  register.
- */
-#define ACISV_ISV3                              0x00000001
-#define ACISV_ISV4                              0x00000002
-#define ACISV_ISV5                              0x00000004
-#define ACISV_ISV6                              0x00000008
-#define ACISV_ISV7                              0x00000010
-#define ACISV_ISV8                              0x00000020
-#define ACISV_ISV9                              0x00000040
-#define ACISV_ISV10                             0x00000080
-#define ACISV_ISV11                             0x00000100
-#define ACISV_ISV12                             0x00000200
-
-/*
- *  The following defines are for the flags in the AC97 status address
- *  register.
- */
-#define ACSAD_SI_MASK                           0x0000007F
-#define ACSAD_SI_SHIFT                          0
-
-/*
- *  The following defines are for the flags in the AC97 status data register.
- */
-#define ACSDA_SD_MASK                           0x0000FFFF
-#define ACSDA_SD_SHIFT                          0
-
-/*
- *  The following defines are for the flags in the joystick poll/trigger
- *  register.
- */
-#define JSPT_CAX                                0x00000001
-#define JSPT_CAY                                0x00000002
-#define JSPT_CBX                                0x00000004
-#define JSPT_CBY                                0x00000008
-#define JSPT_BA1                                0x00000010
-#define JSPT_BA2                                0x00000020
-#define JSPT_BB1                                0x00000040
-#define JSPT_BB2                                0x00000080
-
-/*
- *  The following defines are for the flags in the joystick control register.
- */
-#define JSCTL_SP_MASK                           0x00000003
-#define JSCTL_SP_SLOW                           0x00000000
-#define JSCTL_SP_MEDIUM_SLOW                    0x00000001
-#define JSCTL_SP_MEDIUM_FAST                    0x00000002
-#define JSCTL_SP_FAST                           0x00000003
-#define JSCTL_ARE                               0x00000004
-
-/*
- *  The following defines are for the flags in the joystick coordinate pair 1
- *  readback register.
- */
-#define JSC1_Y1V_MASK                           0x0000FFFF
-#define JSC1_X1V_MASK                           0xFFFF0000
-#define JSC1_Y1V_SHIFT                          0
-#define JSC1_X1V_SHIFT                          16
-
-/*
- *  The following defines are for the flags in the joystick coordinate pair 2
- *  readback register.
- */
-#define JSC2_Y2V_MASK                           0x0000FFFF
-#define JSC2_X2V_MASK                           0xFFFF0000
-#define JSC2_Y2V_SHIFT                          0
-#define JSC2_X2V_SHIFT                          16
-
-/*
- *  The following defines are for the flags in the MIDI control register.
- */
-#define MIDCR_TXE                               0x00000001     /* Enable transmitting. */
-#define MIDCR_RXE                               0x00000002     /* Enable receiving. */
-#define MIDCR_RIE                               0x00000004     /* Interrupt upon tx ready. */
-#define MIDCR_TIE                               0x00000008     /* Interrupt upon rx ready. */
-#define MIDCR_MLB                               0x00000010     /* Enable midi loopback. */
-#define MIDCR_MRST                              0x00000020     /* Reset interface. */
-
-/*
- *  The following defines are for the flags in the MIDI status register.
- */
-#define MIDSR_TBF                               0x00000001     /* Tx FIFO is full. */
-#define MIDSR_RBE                               0x00000002     /* Rx FIFO is empty. */
-
-/*
- *  The following defines are for the flags in the MIDI write port register.
- */
-#define MIDWP_MWD_MASK                          0x000000FF
-#define MIDWP_MWD_SHIFT                         0
-
-/*
- *  The following defines are for the flags in the MIDI read port register.
- */
-#define MIDRP_MRD_MASK                          0x000000FF
-#define MIDRP_MRD_SHIFT                         0
-
-/*
- *  The following defines are for the flags in the joystick GPIO register.
- */
-#define JSIO_DAX                                0x00000001
-#define JSIO_DAY                                0x00000002
-#define JSIO_DBX                                0x00000004
-#define JSIO_DBY                                0x00000008
-#define JSIO_AXOE                               0x00000010
-#define JSIO_AYOE                               0x00000020
-#define JSIO_BXOE                               0x00000040
-#define JSIO_BYOE                               0x00000080
-
-/*
- *  The following defines are for the flags in the master async/sync serial
- *  port enable register.
- */
-#ifndef NO_CS4612
-#define ASER_MASTER_ME                          0x00000001
-#endif
-
-/*
- *  The following defines are for the flags in the configuration interface
- *  register.
- */
-#define CFGI_CLK                                0x00000001
-#define CFGI_DOUT                               0x00000002
-#define CFGI_DIN_EEN                            0x00000004
-#define CFGI_EELD                               0x00000008
-
-/*
- *  The following defines are for the flags in the subsystem ID and vendor ID
- *  register.
- */
-#define SSVID_VID_MASK                          0x0000FFFF
-#define SSVID_SID_MASK                          0xFFFF0000
-#define SSVID_VID_SHIFT                         0
-#define SSVID_SID_SHIFT                         16
-
-/*
- *  The following defines are for the flags in the GPIO pin interface register.
- */
-#define GPIOR_VOLDN                             0x00000001
-#define GPIOR_VOLUP                             0x00000002
-#define GPIOR_SI2D                              0x00000004
-#define GPIOR_SI2OE                             0x00000008
-
-/*
- *  The following defines are for the flags in the extended GPIO pin direction
- *  register.
- */
-#ifndef NO_CS4612
-#define EGPIODR_GPOE0                           0x00000001
-#define EGPIODR_GPOE1                           0x00000002
-#define EGPIODR_GPOE2                           0x00000004
-#define EGPIODR_GPOE3                           0x00000008
-#define EGPIODR_GPOE4                           0x00000010
-#define EGPIODR_GPOE5                           0x00000020
-#define EGPIODR_GPOE6                           0x00000040
-#define EGPIODR_GPOE7                           0x00000080
-#define EGPIODR_GPOE8                           0x00000100
-#endif
-
-/*
- *  The following defines are for the flags in the extended GPIO pin polarity/
- *  type register.
- */
-#ifndef NO_CS4612
-#define EGPIOPTR_GPPT0                          0x00000001
-#define EGPIOPTR_GPPT1                          0x00000002
-#define EGPIOPTR_GPPT2                          0x00000004
-#define EGPIOPTR_GPPT3                          0x00000008
-#define EGPIOPTR_GPPT4                          0x00000010
-#define EGPIOPTR_GPPT5                          0x00000020
-#define EGPIOPTR_GPPT6                          0x00000040
-#define EGPIOPTR_GPPT7                          0x00000080
-#define EGPIOPTR_GPPT8                          0x00000100
-#endif
-
-/*
- *  The following defines are for the flags in the extended GPIO pin sticky
- *  register.
- */
-#ifndef NO_CS4612
-#define EGPIOTR_GPS0                            0x00000001
-#define EGPIOTR_GPS1                            0x00000002
-#define EGPIOTR_GPS2                            0x00000004
-#define EGPIOTR_GPS3                            0x00000008
-#define EGPIOTR_GPS4                            0x00000010
-#define EGPIOTR_GPS5                            0x00000020
-#define EGPIOTR_GPS6                            0x00000040
-#define EGPIOTR_GPS7                            0x00000080
-#define EGPIOTR_GPS8                            0x00000100
-#endif
-
-/*
- *  The following defines are for the flags in the extended GPIO ping wakeup
- *  register.
- */
-#ifndef NO_CS4612
-#define EGPIOWR_GPW0                            0x00000001
-#define EGPIOWR_GPW1                            0x00000002
-#define EGPIOWR_GPW2                            0x00000004
-#define EGPIOWR_GPW3                            0x00000008
-#define EGPIOWR_GPW4                            0x00000010
-#define EGPIOWR_GPW5                            0x00000020
-#define EGPIOWR_GPW6                            0x00000040
-#define EGPIOWR_GPW7                            0x00000080
-#define EGPIOWR_GPW8                            0x00000100
-#endif
-
-/*
- *  The following defines are for the flags in the extended GPIO pin status
- *  register.
- */
-#ifndef NO_CS4612
-#define EGPIOSR_GPS0                            0x00000001
-#define EGPIOSR_GPS1                            0x00000002
-#define EGPIOSR_GPS2                            0x00000004
-#define EGPIOSR_GPS3                            0x00000008
-#define EGPIOSR_GPS4                            0x00000010
-#define EGPIOSR_GPS5                            0x00000020
-#define EGPIOSR_GPS6                            0x00000040
-#define EGPIOSR_GPS7                            0x00000080
-#define EGPIOSR_GPS8                            0x00000100
-#endif
-
-/*
- *  The following defines are for the flags in the serial port 6 configuration
- *  register.
- */
-#ifndef NO_CS4612
-#define SERC6_ASDO2EN                           0x00000001
-#endif
-
-/*
- *  The following defines are for the flags in the serial port 7 configuration
- *  register.
- */
-#ifndef NO_CS4612
-#define SERC7_ASDI2EN                           0x00000001
-#define SERC7_POSILB                            0x00000002
-#define SERC7_SIPOLB                            0x00000004
-#define SERC7_SOSILB                            0x00000008
-#define SERC7_SISOLB                            0x00000010
-#endif
-
-/*
- *  The following defines are for the flags in the serial port AC link
- *  configuration register.
- */
-#ifndef NO_CS4612
-#define SERACC_CODEC_TYPE_MASK                  0x00000001
-#define SERACC_CODEC_TYPE_1_03                  0x00000000
-#define SERACC_CODEC_TYPE_2_0                   0x00000001
-#define SERACC_TWO_CODECS                       0x00000002
-#define SERACC_MDM                              0x00000004
-#define SERACC_HSP                              0x00000008
-#endif
-
-/*
- *  The following defines are for the flags in the AC97 control register 2.
- */
-#ifndef NO_CS4612
-#define ACCTL2_RSTN                             0x00000001
-#define ACCTL2_ESYN                             0x00000002
-#define ACCTL2_VFRM                             0x00000004
-#define ACCTL2_DCV                              0x00000008
-#define ACCTL2_CRW                              0x00000010
-#define ACCTL2_ASYN                             0x00000020
-#endif
-
-/*
- *  The following defines are for the flags in the AC97 status register 2.
- */
-#ifndef NO_CS4612
-#define ACSTS2_CRDY                             0x00000001
-#define ACSTS2_VSTS                             0x00000002
-#endif
-
-/*
- *  The following defines are for the flags in the AC97 output slot valid
- *  register 2.
- */
-#ifndef NO_CS4612
-#define ACOSV2_SLV3                             0x00000001
-#define ACOSV2_SLV4                             0x00000002
-#define ACOSV2_SLV5                             0x00000004
-#define ACOSV2_SLV6                             0x00000008
-#define ACOSV2_SLV7                             0x00000010
-#define ACOSV2_SLV8                             0x00000020
-#define ACOSV2_SLV9                             0x00000040
-#define ACOSV2_SLV10                            0x00000080
-#define ACOSV2_SLV11                            0x00000100
-#define ACOSV2_SLV12                            0x00000200
-#endif
-
-/*
- *  The following defines are for the flags in the AC97 command address
- *  register 2.
- */
-#ifndef NO_CS4612
-#define ACCAD2_CI_MASK                          0x0000007F
-#define ACCAD2_CI_SHIFT                         0
-#endif
-
-/*
- *  The following defines are for the flags in the AC97 command data register
- *  2.
- */
-#ifndef NO_CS4612
-#define ACCDA2_CD_MASK                          0x0000FFFF
-#define ACCDA2_CD_SHIFT                         0  
-#endif
-
-/*
- *  The following defines are for the flags in the AC97 input slot valid
- *  register 2.
- */
-#ifndef NO_CS4612
-#define ACISV2_ISV3                             0x00000001
-#define ACISV2_ISV4                             0x00000002
-#define ACISV2_ISV5                             0x00000004
-#define ACISV2_ISV6                             0x00000008
-#define ACISV2_ISV7                             0x00000010
-#define ACISV2_ISV8                             0x00000020
-#define ACISV2_ISV9                             0x00000040
-#define ACISV2_ISV10                            0x00000080
-#define ACISV2_ISV11                            0x00000100
-#define ACISV2_ISV12                            0x00000200
-#endif
-
-/*
- *  The following defines are for the flags in the AC97 status address
- *  register 2.
- */
-#ifndef NO_CS4612
-#define ACSAD2_SI_MASK                          0x0000007F
-#define ACSAD2_SI_SHIFT                         0
-#endif
-
-/*
- *  The following defines are for the flags in the AC97 status data register 2.
- */
-#ifndef NO_CS4612
-#define ACSDA2_SD_MASK                          0x0000FFFF
-#define ACSDA2_SD_SHIFT                         0
-#endif
-
-/*
- *  The following defines are for the flags in the I/O trap address and control
- *  registers (all 12).
- */
-#ifndef NO_CS4612
-#define IOTAC_SA_MASK                           0x0000FFFF
-#define IOTAC_MSK_MASK                          0x000F0000
-#define IOTAC_IODC_MASK                         0x06000000
-#define IOTAC_IODC_16_BIT                       0x00000000
-#define IOTAC_IODC_10_BIT                       0x02000000
-#define IOTAC_IODC_12_BIT                       0x04000000
-#define IOTAC_WSPI                              0x08000000
-#define IOTAC_RSPI                              0x10000000
-#define IOTAC_WSE                               0x20000000
-#define IOTAC_WE                                0x40000000
-#define IOTAC_RE                                0x80000000
-#define IOTAC_SA_SHIFT                          0
-#define IOTAC_MSK_SHIFT                         16
-#endif
-
-/*
- *  The following defines are for the flags in the I/O trap fast read registers
- *  (all 8).
- */
-#ifndef NO_CS4612
-#define IOTFR_D_MASK                            0x0000FFFF
-#define IOTFR_A_MASK                            0x000F0000
-#define IOTFR_R_MASK                            0x0F000000
-#define IOTFR_ALL                               0x40000000
-#define IOTFR_VL                                0x80000000
-#define IOTFR_D_SHIFT                           0
-#define IOTFR_A_SHIFT                           16
-#define IOTFR_R_SHIFT                           24
-#endif
-
-/*
- *  The following defines are for the flags in the I/O trap FIFO register.
- */
-#ifndef NO_CS4612
-#define IOTFIFO_BA_MASK                         0x00003FFF
-#define IOTFIFO_S_MASK                          0x00FF0000
-#define IOTFIFO_OF                              0x40000000
-#define IOTFIFO_SPIOF                           0x80000000
-#define IOTFIFO_BA_SHIFT                        0
-#define IOTFIFO_S_SHIFT                         16
-#endif
-
-/*
- *  The following defines are for the flags in the I/O trap retry read data
- *  register.
- */
-#ifndef NO_CS4612
-#define IOTRRD_D_MASK                           0x0000FFFF
-#define IOTRRD_RDV                              0x80000000
-#define IOTRRD_D_SHIFT                          0
-#endif
-
-/*
- *  The following defines are for the flags in the I/O trap FIFO pointer
- *  register.
- */
-#ifndef NO_CS4612
-#define IOTFP_CA_MASK                           0x00003FFF
-#define IOTFP_PA_MASK                           0x3FFF0000
-#define IOTFP_CA_SHIFT                          0
-#define IOTFP_PA_SHIFT                          16
-#endif
-
-/*
- *  The following defines are for the flags in the I/O trap control register.
- */
-#ifndef NO_CS4612
-#define IOTCR_ITD                               0x00000001
-#define IOTCR_HRV                               0x00000002
-#define IOTCR_SRV                               0x00000004
-#define IOTCR_DTI                               0x00000008
-#define IOTCR_DFI                               0x00000010
-#define IOTCR_DDP                               0x00000020
-#define IOTCR_JTE                               0x00000040
-#define IOTCR_PPE                               0x00000080
-#endif
-
-/*
- *  The following defines are for the flags in the direct PCI data register.
- */
-#ifndef NO_CS4612
-#define DPCID_D_MASK                            0xFFFFFFFF
-#define DPCID_D_SHIFT                           0
-#endif
-
-/*
- *  The following defines are for the flags in the direct PCI address register.
- */
-#ifndef NO_CS4612
-#define DPCIA_A_MASK                            0xFFFFFFFF
-#define DPCIA_A_SHIFT                           0
-#endif
-
-/*
- *  The following defines are for the flags in the direct PCI command register.
- */
-#ifndef NO_CS4612
-#define DPCIC_C_MASK                            0x0000000F
-#define DPCIC_C_IOREAD                          0x00000002
-#define DPCIC_C_IOWRITE                         0x00000003
-#define DPCIC_BE_MASK                           0x000000F0
-#endif
-
-/*
- *  The following defines are for the flags in the PC/PCI request register.
- */
-#ifndef NO_CS4612
-#define PCPCIR_RDC_MASK                         0x00000007
-#define PCPCIR_C_MASK                           0x00007000
-#define PCPCIR_REQ                              0x00008000
-#define PCPCIR_RDC_SHIFT                        0
-#define PCPCIR_C_SHIFT                          12
-#endif
-
-/*
- *  The following defines are for the flags in the PC/PCI grant register.
- */ 
-#ifndef NO_CS4612
-#define PCPCIG_GDC_MASK                         0x00000007
-#define PCPCIG_VL                               0x00008000
-#define PCPCIG_GDC_SHIFT                        0
-#endif
-
-/*
- *  The following defines are for the flags in the PC/PCI master enable
- *  register.
- */
-#ifndef NO_CS4612
-#define PCPCIEN_EN                              0x00000001
-#endif
-
-/*
- *  The following defines are for the flags in the extended PCI power
- *  management control register.
- */
-#ifndef NO_CS4612
-#define EPCIPMC_GWU                             0x00000001
-#define EPCIPMC_FSPC                            0x00000002
-#endif 
-
-/*
- *  The following defines are for the flags in the SP control register.
- */
-#define SPCR_RUN                                0x00000001
-#define SPCR_STPFR                              0x00000002
-#define SPCR_RUNFR                              0x00000004
-#define SPCR_TICK                               0x00000008
-#define SPCR_DRQEN                              0x00000020
-#define SPCR_RSTSP                              0x00000040
-#define SPCR_OREN                               0x00000080
-#ifndef NO_CS4612
-#define SPCR_PCIINT                             0x00000100
-#define SPCR_OINTD                              0x00000200
-#define SPCR_CRE                                0x00008000
-#endif
-
-/*
- *  The following defines are for the flags in the debug index register.
- */
-#define DREG_REGID_MASK                         0x0000007F
-#define DREG_DEBUG                              0x00000080
-#define DREG_RGBK_MASK                          0x00000700
-#define DREG_TRAP                               0x00000800
-#if !defined(NO_CS4612)
-#if !defined(NO_CS4615)
-#define DREG_TRAPX                              0x00001000
-#endif
-#endif
-#define DREG_REGID_SHIFT                        0
-#define DREG_RGBK_SHIFT                         8
-#define DREG_RGBK_REGID_MASK                    0x0000077F
-#define DREG_REGID_R0                           0x00000010
-#define DREG_REGID_R1                           0x00000011
-#define DREG_REGID_R2                           0x00000012
-#define DREG_REGID_R3                           0x00000013
-#define DREG_REGID_R4                           0x00000014
-#define DREG_REGID_R5                           0x00000015
-#define DREG_REGID_R6                           0x00000016
-#define DREG_REGID_R7                           0x00000017
-#define DREG_REGID_R8                           0x00000018
-#define DREG_REGID_R9                           0x00000019
-#define DREG_REGID_RA                           0x0000001A
-#define DREG_REGID_RB                           0x0000001B
-#define DREG_REGID_RC                           0x0000001C
-#define DREG_REGID_RD                           0x0000001D
-#define DREG_REGID_RE                           0x0000001E
-#define DREG_REGID_RF                           0x0000001F
-#define DREG_REGID_RA_BUS_LOW                   0x00000020
-#define DREG_REGID_RA_BUS_HIGH                  0x00000038
-#define DREG_REGID_YBUS_LOW                     0x00000050
-#define DREG_REGID_YBUS_HIGH                    0x00000058
-#define DREG_REGID_TRAP_0                       0x00000100
-#define DREG_REGID_TRAP_1                       0x00000101
-#define DREG_REGID_TRAP_2                       0x00000102
-#define DREG_REGID_TRAP_3                       0x00000103
-#define DREG_REGID_TRAP_4                       0x00000104
-#define DREG_REGID_TRAP_5                       0x00000105
-#define DREG_REGID_TRAP_6                       0x00000106
-#define DREG_REGID_TRAP_7                       0x00000107
-#define DREG_REGID_INDIRECT_ADDRESS             0x0000010E
-#define DREG_REGID_TOP_OF_STACK                 0x0000010F
-#if !defined(NO_CS4612)
-#if !defined(NO_CS4615)
-#define DREG_REGID_TRAP_8                       0x00000110
-#define DREG_REGID_TRAP_9                       0x00000111
-#define DREG_REGID_TRAP_10                      0x00000112
-#define DREG_REGID_TRAP_11                      0x00000113
-#define DREG_REGID_TRAP_12                      0x00000114
-#define DREG_REGID_TRAP_13                      0x00000115
-#define DREG_REGID_TRAP_14                      0x00000116
-#define DREG_REGID_TRAP_15                      0x00000117
-#define DREG_REGID_TRAP_16                      0x00000118
-#define DREG_REGID_TRAP_17                      0x00000119
-#define DREG_REGID_TRAP_18                      0x0000011A
-#define DREG_REGID_TRAP_19                      0x0000011B
-#define DREG_REGID_TRAP_20                      0x0000011C
-#define DREG_REGID_TRAP_21                      0x0000011D
-#define DREG_REGID_TRAP_22                      0x0000011E
-#define DREG_REGID_TRAP_23                      0x0000011F
-#endif
-#endif
-#define DREG_REGID_RSA0_LOW                     0x00000200
-#define DREG_REGID_RSA0_HIGH                    0x00000201
-#define DREG_REGID_RSA1_LOW                     0x00000202
-#define DREG_REGID_RSA1_HIGH                    0x00000203
-#define DREG_REGID_RSA2                         0x00000204
-#define DREG_REGID_RSA3                         0x00000205
-#define DREG_REGID_RSI0_LOW                     0x00000206
-#define DREG_REGID_RSI0_HIGH                    0x00000207
-#define DREG_REGID_RSI1                         0x00000208
-#define DREG_REGID_RSI2                         0x00000209
-#define DREG_REGID_SAGUSTATUS                   0x0000020A
-#define DREG_REGID_RSCONFIG01_LOW               0x0000020B
-#define DREG_REGID_RSCONFIG01_HIGH              0x0000020C
-#define DREG_REGID_RSCONFIG23_LOW               0x0000020D
-#define DREG_REGID_RSCONFIG23_HIGH              0x0000020E
-#define DREG_REGID_RSDMA01E                     0x0000020F
-#define DREG_REGID_RSDMA23E                     0x00000210
-#define DREG_REGID_RSD0_LOW                     0x00000211
-#define DREG_REGID_RSD0_HIGH                    0x00000212
-#define DREG_REGID_RSD1_LOW                     0x00000213
-#define DREG_REGID_RSD1_HIGH                    0x00000214
-#define DREG_REGID_RSD2_LOW                     0x00000215
-#define DREG_REGID_RSD2_HIGH                    0x00000216
-#define DREG_REGID_RSD3_LOW                     0x00000217
-#define DREG_REGID_RSD3_HIGH                    0x00000218
-#define DREG_REGID_SRAR_HIGH                    0x0000021A
-#define DREG_REGID_SRAR_LOW                     0x0000021B
-#define DREG_REGID_DMA_STATE                    0x0000021C
-#define DREG_REGID_CURRENT_DMA_STREAM           0x0000021D
-#define DREG_REGID_NEXT_DMA_STREAM              0x0000021E
-#define DREG_REGID_CPU_STATUS                   0x00000300
-#define DREG_REGID_MAC_MODE                     0x00000301
-#define DREG_REGID_STACK_AND_REPEAT             0x00000302
-#define DREG_REGID_INDEX0                       0x00000304
-#define DREG_REGID_INDEX1                       0x00000305
-#define DREG_REGID_DMA_STATE_0_3                0x00000400
-#define DREG_REGID_DMA_STATE_4_7                0x00000404
-#define DREG_REGID_DMA_STATE_8_11               0x00000408
-#define DREG_REGID_DMA_STATE_12_15              0x0000040C
-#define DREG_REGID_DMA_STATE_16_19              0x00000410
-#define DREG_REGID_DMA_STATE_20_23              0x00000414
-#define DREG_REGID_DMA_STATE_24_27              0x00000418
-#define DREG_REGID_DMA_STATE_28_31              0x0000041C
-#define DREG_REGID_DMA_STATE_32_35              0x00000420
-#define DREG_REGID_DMA_STATE_36_39              0x00000424
-#define DREG_REGID_DMA_STATE_40_43              0x00000428
-#define DREG_REGID_DMA_STATE_44_47              0x0000042C
-#define DREG_REGID_DMA_STATE_48_51              0x00000430
-#define DREG_REGID_DMA_STATE_52_55              0x00000434
-#define DREG_REGID_DMA_STATE_56_59              0x00000438
-#define DREG_REGID_DMA_STATE_60_63              0x0000043C
-#define DREG_REGID_DMA_STATE_64_67              0x00000440
-#define DREG_REGID_DMA_STATE_68_71              0x00000444
-#define DREG_REGID_DMA_STATE_72_75              0x00000448
-#define DREG_REGID_DMA_STATE_76_79              0x0000044C
-#define DREG_REGID_DMA_STATE_80_83              0x00000450
-#define DREG_REGID_DMA_STATE_84_87              0x00000454
-#define DREG_REGID_DMA_STATE_88_91              0x00000458
-#define DREG_REGID_DMA_STATE_92_95              0x0000045C
-#define DREG_REGID_TRAP_SELECT                  0x00000500
-#define DREG_REGID_TRAP_WRITE_0                 0x00000500
-#define DREG_REGID_TRAP_WRITE_1                 0x00000501
-#define DREG_REGID_TRAP_WRITE_2                 0x00000502
-#define DREG_REGID_TRAP_WRITE_3                 0x00000503
-#define DREG_REGID_TRAP_WRITE_4                 0x00000504
-#define DREG_REGID_TRAP_WRITE_5                 0x00000505
-#define DREG_REGID_TRAP_WRITE_6                 0x00000506
-#define DREG_REGID_TRAP_WRITE_7                 0x00000507
-#if !defined(NO_CS4612)
-#if !defined(NO_CS4615)
-#define DREG_REGID_TRAP_WRITE_8                 0x00000510
-#define DREG_REGID_TRAP_WRITE_9                 0x00000511
-#define DREG_REGID_TRAP_WRITE_10                0x00000512
-#define DREG_REGID_TRAP_WRITE_11                0x00000513
-#define DREG_REGID_TRAP_WRITE_12                0x00000514
-#define DREG_REGID_TRAP_WRITE_13                0x00000515
-#define DREG_REGID_TRAP_WRITE_14                0x00000516
-#define DREG_REGID_TRAP_WRITE_15                0x00000517
-#define DREG_REGID_TRAP_WRITE_16                0x00000518
-#define DREG_REGID_TRAP_WRITE_17                0x00000519
-#define DREG_REGID_TRAP_WRITE_18                0x0000051A
-#define DREG_REGID_TRAP_WRITE_19                0x0000051B
-#define DREG_REGID_TRAP_WRITE_20                0x0000051C
-#define DREG_REGID_TRAP_WRITE_21                0x0000051D
-#define DREG_REGID_TRAP_WRITE_22                0x0000051E
-#define DREG_REGID_TRAP_WRITE_23                0x0000051F
-#endif
-#endif
-#define DREG_REGID_MAC0_ACC0_LOW                0x00000600
-#define DREG_REGID_MAC0_ACC1_LOW                0x00000601
-#define DREG_REGID_MAC0_ACC2_LOW                0x00000602
-#define DREG_REGID_MAC0_ACC3_LOW                0x00000603
-#define DREG_REGID_MAC1_ACC0_LOW                0x00000604
-#define DREG_REGID_MAC1_ACC1_LOW                0x00000605
-#define DREG_REGID_MAC1_ACC2_LOW                0x00000606
-#define DREG_REGID_MAC1_ACC3_LOW                0x00000607
-#define DREG_REGID_MAC0_ACC0_MID                0x00000608
-#define DREG_REGID_MAC0_ACC1_MID                0x00000609
-#define DREG_REGID_MAC0_ACC2_MID                0x0000060A
-#define DREG_REGID_MAC0_ACC3_MID                0x0000060B
-#define DREG_REGID_MAC1_ACC0_MID                0x0000060C
-#define DREG_REGID_MAC1_ACC1_MID                0x0000060D
-#define DREG_REGID_MAC1_ACC2_MID                0x0000060E
-#define DREG_REGID_MAC1_ACC3_MID                0x0000060F
-#define DREG_REGID_MAC0_ACC0_HIGH               0x00000610
-#define DREG_REGID_MAC0_ACC1_HIGH               0x00000611
-#define DREG_REGID_MAC0_ACC2_HIGH               0x00000612
-#define DREG_REGID_MAC0_ACC3_HIGH               0x00000613
-#define DREG_REGID_MAC1_ACC0_HIGH               0x00000614
-#define DREG_REGID_MAC1_ACC1_HIGH               0x00000615
-#define DREG_REGID_MAC1_ACC2_HIGH               0x00000616
-#define DREG_REGID_MAC1_ACC3_HIGH               0x00000617
-#define DREG_REGID_RSHOUT_LOW                   0x00000620
-#define DREG_REGID_RSHOUT_MID                   0x00000628
-#define DREG_REGID_RSHOUT_HIGH                  0x00000630
-
-/*
- *  The following defines are for the flags in the DMA stream requestor write
- */
-#define DSRWP_DSR_MASK                          0x0000000F
-#define DSRWP_DSR_BG_RQ                         0x00000001
-#define DSRWP_DSR_PRIORITY_MASK                 0x00000006
-#define DSRWP_DSR_PRIORITY_0                    0x00000000
-#define DSRWP_DSR_PRIORITY_1                    0x00000002
-#define DSRWP_DSR_PRIORITY_2                    0x00000004
-#define DSRWP_DSR_PRIORITY_3                    0x00000006
-#define DSRWP_DSR_RQ_PENDING                    0x00000008
-
-/*
- *  The following defines are for the flags in the trap write port register.
- */
-#define TWPR_TW_MASK                            0x0000FFFF
-#define TWPR_TW_SHIFT                           0
-
-/*
- *  The following defines are for the flags in the stack pointer write
- *  register.
- */
-#define SPWR_STKP_MASK                          0x0000000F
-#define SPWR_STKP_SHIFT                         0
-
-/*
- *  The following defines are for the flags in the SP interrupt register.
- */
-#define SPIR_FRI                                0x00000001
-#define SPIR_DOI                                0x00000002
-#define SPIR_GPI2                               0x00000004
-#define SPIR_GPI3                               0x00000008
-#define SPIR_IP0                                0x00000010
-#define SPIR_IP1                                0x00000020
-#define SPIR_IP2                                0x00000040
-#define SPIR_IP3                                0x00000080
-
-/*
- *  The following defines are for the flags in the functional group 1 register.
- */
-#define FGR1_F1S_MASK                           0x0000FFFF
-#define FGR1_F1S_SHIFT                          0
-
-/*
- *  The following defines are for the flags in the SP clock status register.
- */
-#define SPCS_FRI                                0x00000001
-#define SPCS_DOI                                0x00000002
-#define SPCS_GPI2                               0x00000004
-#define SPCS_GPI3                               0x00000008
-#define SPCS_IP0                                0x00000010
-#define SPCS_IP1                                0x00000020
-#define SPCS_IP2                                0x00000040
-#define SPCS_IP3                                0x00000080
-#define SPCS_SPRUN                              0x00000100
-#define SPCS_SLEEP                              0x00000200
-#define SPCS_FG                                 0x00000400
-#define SPCS_ORUN                               0x00000800
-#define SPCS_IRQ                                0x00001000
-#define SPCS_FGN_MASK                           0x0000E000
-#define SPCS_FGN_SHIFT                          13
-
-/*
- *  The following defines are for the flags in the SP DMA requestor status
- *  register.
- */
-#define SDSR_DCS_MASK                           0x000000FF
-#define SDSR_DCS_SHIFT                          0
-#define SDSR_DCS_NONE                           0x00000007
-
-/*
- *  The following defines are for the flags in the frame timer register.
- */
-#define FRMT_FTV_MASK                           0x0000FFFF
-#define FRMT_FTV_SHIFT                          0
-
-/*
- *  The following defines are for the flags in the frame timer current count
- *  register.
- */
-#define FRCC_FCC_MASK                           0x0000FFFF
-#define FRCC_FCC_SHIFT                          0
-
-/*
- *  The following defines are for the flags in the frame timer save count
- *  register.
- */
-#define FRSC_FCS_MASK                           0x0000FFFF
-#define FRSC_FCS_SHIFT                          0
-
-/*
- *  The following define the various flags stored in the scatter/gather
- *  descriptors.
- */
-#define DMA_SG_NEXT_ENTRY_MASK                  0x00000FF8
-#define DMA_SG_SAMPLE_END_MASK                  0x0FFF0000
-#define DMA_SG_SAMPLE_END_FLAG                  0x10000000
-#define DMA_SG_LOOP_END_FLAG                    0x20000000
-#define DMA_SG_SIGNAL_END_FLAG                  0x40000000
-#define DMA_SG_SIGNAL_PAGE_FLAG                 0x80000000
-#define DMA_SG_NEXT_ENTRY_SHIFT                 3
-#define DMA_SG_SAMPLE_END_SHIFT                 16
-
-/*
- *  The following define the offsets of the fields within the on-chip generic
- *  DMA requestor.
- */
-#define DMA_RQ_CONTROL1                         0x00000000
-#define DMA_RQ_CONTROL2                         0x00000004
-#define DMA_RQ_SOURCE_ADDR                      0x00000008
-#define DMA_RQ_DESTINATION_ADDR                 0x0000000C
-#define DMA_RQ_NEXT_PAGE_ADDR                   0x00000010
-#define DMA_RQ_NEXT_PAGE_SGDESC                 0x00000014
-#define DMA_RQ_LOOP_START_ADDR                  0x00000018
-#define DMA_RQ_POST_LOOP_ADDR                   0x0000001C
-#define DMA_RQ_PAGE_MAP_ADDR                    0x00000020
-
-/*
- *  The following defines are for the flags in the first control word of the
- *  on-chip generic DMA requestor.
- */
-#define DMA_RQ_C1_COUNT_MASK                    0x000003FF
-#define DMA_RQ_C1_DESTINATION_SCATTER           0x00001000
-#define DMA_RQ_C1_SOURCE_GATHER                 0x00002000
-#define DMA_RQ_C1_DONE_FLAG                     0x00004000
-#define DMA_RQ_C1_OPTIMIZE_STATE                0x00008000
-#define DMA_RQ_C1_SAMPLE_END_STATE_MASK         0x00030000
-#define DMA_RQ_C1_FULL_PAGE                     0x00000000
-#define DMA_RQ_C1_BEFORE_SAMPLE_END             0x00010000
-#define DMA_RQ_C1_PAGE_MAP_ERROR                0x00020000
-#define DMA_RQ_C1_AT_SAMPLE_END                 0x00030000
-#define DMA_RQ_C1_LOOP_END_STATE_MASK           0x000C0000
-#define DMA_RQ_C1_NOT_LOOP_END                  0x00000000
-#define DMA_RQ_C1_BEFORE_LOOP_END               0x00040000
-#define DMA_RQ_C1_2PAGE_LOOP_BEGIN              0x00080000
-#define DMA_RQ_C1_LOOP_BEGIN                    0x000C0000
-#define DMA_RQ_C1_PAGE_MAP_MASK                 0x00300000
-#define DMA_RQ_C1_PM_NONE_PENDING               0x00000000
-#define DMA_RQ_C1_PM_NEXT_PENDING               0x00100000
-#define DMA_RQ_C1_PM_RESERVED                   0x00200000
-#define DMA_RQ_C1_PM_LOOP_NEXT_PENDING          0x00300000
-#define DMA_RQ_C1_WRITEBACK_DEST_FLAG           0x00400000
-#define DMA_RQ_C1_WRITEBACK_SRC_FLAG            0x00800000
-#define DMA_RQ_C1_DEST_SIZE_MASK                0x07000000
-#define DMA_RQ_C1_DEST_LINEAR                   0x00000000
-#define DMA_RQ_C1_DEST_MOD16                    0x01000000
-#define DMA_RQ_C1_DEST_MOD32                    0x02000000
-#define DMA_RQ_C1_DEST_MOD64                    0x03000000
-#define DMA_RQ_C1_DEST_MOD128                   0x04000000
-#define DMA_RQ_C1_DEST_MOD256                   0x05000000
-#define DMA_RQ_C1_DEST_MOD512                   0x06000000
-#define DMA_RQ_C1_DEST_MOD1024                  0x07000000
-#define DMA_RQ_C1_DEST_ON_HOST                  0x08000000
-#define DMA_RQ_C1_SOURCE_SIZE_MASK              0x70000000
-#define DMA_RQ_C1_SOURCE_LINEAR                 0x00000000
-#define DMA_RQ_C1_SOURCE_MOD16                  0x10000000
-#define DMA_RQ_C1_SOURCE_MOD32                  0x20000000
-#define DMA_RQ_C1_SOURCE_MOD64                  0x30000000
-#define DMA_RQ_C1_SOURCE_MOD128                 0x40000000
-#define DMA_RQ_C1_SOURCE_MOD256                 0x50000000
-#define DMA_RQ_C1_SOURCE_MOD512                 0x60000000
-#define DMA_RQ_C1_SOURCE_MOD1024                0x70000000
-#define DMA_RQ_C1_SOURCE_ON_HOST                0x80000000
-#define DMA_RQ_C1_COUNT_SHIFT                   0
-
-/*
- *  The following defines are for the flags in the second control word of the
- *  on-chip generic DMA requestor.
- */
-#define DMA_RQ_C2_VIRTUAL_CHANNEL_MASK          0x0000003F
-#define DMA_RQ_C2_VIRTUAL_SIGNAL_MASK           0x00000300
-#define DMA_RQ_C2_NO_VIRTUAL_SIGNAL             0x00000000
-#define DMA_RQ_C2_SIGNAL_EVERY_DMA              0x00000100
-#define DMA_RQ_C2_SIGNAL_SOURCE_PINGPONG        0x00000200
-#define DMA_RQ_C2_SIGNAL_DEST_PINGPONG          0x00000300
-#define DMA_RQ_C2_AUDIO_CONVERT_MASK            0x0000F000
-#define DMA_RQ_C2_AC_NONE                       0x00000000
-#define DMA_RQ_C2_AC_8_TO_16_BIT                0x00001000
-#define DMA_RQ_C2_AC_MONO_TO_STEREO             0x00002000
-#define DMA_RQ_C2_AC_ENDIAN_CONVERT             0x00004000
-#define DMA_RQ_C2_AC_SIGNED_CONVERT             0x00008000
-#define DMA_RQ_C2_LOOP_END_MASK                 0x0FFF0000
-#define DMA_RQ_C2_LOOP_MASK                     0x30000000
-#define DMA_RQ_C2_NO_LOOP                       0x00000000
-#define DMA_RQ_C2_ONE_PAGE_LOOP                 0x10000000
-#define DMA_RQ_C2_TWO_PAGE_LOOP                 0x20000000
-#define DMA_RQ_C2_MULTI_PAGE_LOOP               0x30000000
-#define DMA_RQ_C2_SIGNAL_LOOP_BACK              0x40000000
-#define DMA_RQ_C2_SIGNAL_POST_BEGIN_PAGE        0x80000000
-#define DMA_RQ_C2_VIRTUAL_CHANNEL_SHIFT         0
-#define DMA_RQ_C2_LOOP_END_SHIFT                16
-
-/*
- *  The following defines are for the flags in the source and destination words
- *  of the on-chip generic DMA requestor.
- */
-#define DMA_RQ_SD_ADDRESS_MASK                  0x0000FFFF
-#define DMA_RQ_SD_MEMORY_ID_MASK                0x000F0000
-#define DMA_RQ_SD_SP_PARAM_ADDR                 0x00000000
-#define DMA_RQ_SD_SP_SAMPLE_ADDR                0x00010000
-#define DMA_RQ_SD_SP_PROGRAM_ADDR               0x00020000
-#define DMA_RQ_SD_SP_DEBUG_ADDR                 0x00030000
-#define DMA_RQ_SD_OMNIMEM_ADDR                  0x000E0000
-#define DMA_RQ_SD_END_FLAG                      0x40000000
-#define DMA_RQ_SD_ERROR_FLAG                    0x80000000
-#define DMA_RQ_SD_ADDRESS_SHIFT                 0
-
-/*
- *  The following defines are for the flags in the page map address word of the
- *  on-chip generic DMA requestor.
- */
-#define DMA_RQ_PMA_LOOP_THIRD_PAGE_ENTRY_MASK   0x00000FF8
-#define DMA_RQ_PMA_PAGE_TABLE_MASK              0xFFFFF000
-#define DMA_RQ_PMA_LOOP_THIRD_PAGE_ENTRY_SHIFT  3
-#define DMA_RQ_PMA_PAGE_TABLE_SHIFT             12
-
-#define BA1_VARIDEC_BUF_1       0x000
-
-#define BA1_PDTC                0x0c0    /* BA1_PLAY_DMA_TRANSACTION_COUNT_REG */
-#define BA1_PFIE                0x0c4    /* BA1_PLAY_FORMAT_&_INTERRUPT_ENABLE_REG */
-#define BA1_PBA                 0x0c8    /* BA1_PLAY_BUFFER_ADDRESS */
-#define BA1_PVOL                0x0f8    /* BA1_PLAY_VOLUME_REG */
-#define BA1_PSRC                0x288    /* BA1_PLAY_SAMPLE_RATE_CORRECTION_REG */
-#define BA1_PCTL                0x2a4    /* BA1_PLAY_CONTROL_REG */
-#define BA1_PPI                 0x2b4    /* BA1_PLAY_PHASE_INCREMENT_REG */
-
-#define BA1_CCTL                0x064    /* BA1_CAPTURE_CONTROL_REG */
-#define BA1_CIE                 0x104    /* BA1_CAPTURE_INTERRUPT_ENABLE_REG */
-#define BA1_CBA                 0x10c    /* BA1_CAPTURE_BUFFER_ADDRESS */
-#define BA1_CSRC                0x2c8    /* BA1_CAPTURE_SAMPLE_RATE_CORRECTION_REG */
-#define BA1_CCI                 0x2d8    /* BA1_CAPTURE_COEFFICIENT_INCREMENT_REG */
-#define BA1_CD                  0x2e0    /* BA1_CAPTURE_DELAY_REG */
-#define BA1_CPI                 0x2f4    /* BA1_CAPTURE_PHASE_INCREMENT_REG */
-#define BA1_CVOL                0x2f8    /* BA1_CAPTURE_VOLUME_REG */
-
-#define BA1_CFG1                0x134    /* BA1_CAPTURE_FRAME_GROUP_1_REG */
-#define BA1_CFG2                0x138    /* BA1_CAPTURE_FRAME_GROUP_2_REG */
-#define BA1_CCST                0x13c    /* BA1_CAPTURE_CONSTANT_REG */
-#define BA1_CSPB                0x340    /* BA1_CAPTURE_SPB_ADDRESS */
-
-/*
- *
- */
-
-#define CS461X_MODE_OUTPUT     (1<<0)   /* MIDI UART - output */ 
-#define CS461X_MODE_INPUT      (1<<1)   /* MIDI UART - input */
-
-//****************************************************************************
-//
-// The following define the offsets of the AC97 shadow registers, which appear
-// as a virtual extension to the base address register zero memory range.
-//
-//****************************************************************************
-#define AC97_REG_OFFSET_MASK                    0x0000007EL
-#define AC97_CODEC_NUMBER_MASK                  0x00003000L
-
-#define BA0_AC97_RESET                          0x00001000L
-#define BA0_AC97_MASTER_VOLUME                  0x00001002L
-#define BA0_AC97_HEADPHONE_VOLUME               0x00001004L
-#define BA0_AC97_MASTER_VOLUME_MONO             0x00001006L
-#define BA0_AC97_MASTER_TONE                    0x00001008L
-#define BA0_AC97_PC_BEEP_VOLUME                 0x0000100AL
-#define BA0_AC97_PHONE_VOLUME                   0x0000100CL
-#define BA0_AC97_MIC_VOLUME                     0x0000100EL
-#define BA0_AC97_LINE_IN_VOLUME                 0x00001010L
-#define BA0_AC97_CD_VOLUME                      0x00001012L
-#define BA0_AC97_VIDEO_VOLUME                   0x00001014L
-#define BA0_AC97_AUX_VOLUME                     0x00001016L
-#define BA0_AC97_PCM_OUT_VOLUME                 0x00001018L
-#define BA0_AC97_RECORD_SELECT                  0x0000101AL
-#define BA0_AC97_RECORD_GAIN                    0x0000101CL
-#define BA0_AC97_RECORD_GAIN_MIC                0x0000101EL
-#define BA0_AC97_GENERAL_PURPOSE                0x00001020L
-#define BA0_AC97_3D_CONTROL                     0x00001022L
-#define BA0_AC97_MODEM_RATE                     0x00001024L
-#define BA0_AC97_POWERDOWN                      0x00001026L
-#define BA0_AC97_EXT_AUDIO_ID                   0x00001028L
-#define BA0_AC97_EXT_AUDIO_POWER                0x0000102AL
-#define BA0_AC97_PCM_FRONT_DAC_RATE             0x0000102CL
-#define BA0_AC97_PCM_SURR_DAC_RATE              0x0000102EL
-#define BA0_AC97_PCM_LFE_DAC_RATE               0x00001030L
-#define BA0_AC97_PCM_LR_ADC_RATE                0x00001032L
-#define BA0_AC97_MIC_ADC_RATE                   0x00001034L
-#define BA0_AC97_6CH_VOL_C_LFE                  0x00001036L
-#define BA0_AC97_6CH_VOL_SURROUND               0x00001038L
-#define BA0_AC97_RESERVED_3A                    0x0000103AL
-#define BA0_AC97_EXT_MODEM_ID                   0x0000103CL
-#define BA0_AC97_EXT_MODEM_POWER                0x0000103EL
-#define BA0_AC97_LINE1_CODEC_RATE               0x00001040L
-#define BA0_AC97_LINE2_CODEC_RATE               0x00001042L
-#define BA0_AC97_HANDSET_CODEC_RATE             0x00001044L
-#define BA0_AC97_LINE1_CODEC_LEVEL              0x00001046L
-#define BA0_AC97_LINE2_CODEC_LEVEL              0x00001048L
-#define BA0_AC97_HANDSET_CODEC_LEVEL            0x0000104AL
-#define BA0_AC97_GPIO_PIN_CONFIG                0x0000104CL
-#define BA0_AC97_GPIO_PIN_TYPE                  0x0000104EL
-#define BA0_AC97_GPIO_PIN_STICKY                0x00001050L
-#define BA0_AC97_GPIO_PIN_WAKEUP                0x00001052L
-#define BA0_AC97_GPIO_PIN_STATUS                0x00001054L
-#define BA0_AC97_MISC_MODEM_AFE_STAT            0x00001056L
-#define BA0_AC97_RESERVED_58                    0x00001058L
-#define BA0_AC97_CRYSTAL_REV_N_FAB_ID           0x0000105AL
-#define BA0_AC97_TEST_AND_MISC_CTRL             0x0000105CL
-#define BA0_AC97_AC_MODE                        0x0000105EL
-#define BA0_AC97_MISC_CRYSTAL_CONTROL           0x00001060L
-#define BA0_AC97_LINE1_HYPRID_CTRL              0x00001062L
-#define BA0_AC97_VENDOR_RESERVED_64             0x00001064L
-#define BA0_AC97_VENDOR_RESERVED_66             0x00001066L
-#define BA0_AC97_SPDIF_CONTROL                  0x00001068L
-#define BA0_AC97_VENDOR_RESERVED_6A             0x0000106AL
-#define BA0_AC97_VENDOR_RESERVED_6C             0x0000106CL
-#define BA0_AC97_VENDOR_RESERVED_6E             0x0000106EL
-#define BA0_AC97_VENDOR_RESERVED_70             0x00001070L
-#define BA0_AC97_VENDOR_RESERVED_72             0x00001072L
-#define BA0_AC97_VENDOR_RESERVED_74             0x00001074L
-#define BA0_AC97_CAL_ADDRESS                    0x00001076L
-#define BA0_AC97_CAL_DATA                       0x00001078L
-#define BA0_AC97_VENDOR_RESERVED_7A             0x0000107AL
-#define BA0_AC97_VENDOR_ID1                     0x0000107CL
-#define BA0_AC97_VENDOR_ID2                     0x0000107EL
-#endif                         /* __CS461X_H */
diff --git a/sound/oss/cs461x_image.h b/sound/oss/cs461x_image.h
deleted file mode 100644 (file)
index b5c5a46..0000000
+++ /dev/null
@@ -1,322 +0,0 @@
-/****************************************************************************
- * "CWCIMAGE.H"-- For CS46XX. Ver 1.04
- *      Copyright 1998-2001 (c) Cirrus Logic Corp.
- *      Version 1.04
- ****************************************************************************
- */
-#ifndef __CS_IMAGE_H
-#define __CS_IMAGE_H
-
-#define CLEAR__COUNT     3
-#define FILL__COUNT      4
-#define BA1__DWORD_SIZE  13*1024+512
-
-static struct
-{
-        unsigned BA1__DestByteOffset;
-        unsigned BA1__SourceSize;
-} ClrStat[CLEAR__COUNT] ={ {0x00000000, 0x00003000 },
-                           {0x00010000, 0x00003800 },
-                           {0x00020000, 0x00007000 } };
-
-static u32 FillArray1[]={
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000163,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00200040,0x00008010,0x00000000,
-0x00000000,0x80000001,0x00000001,0x00060000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00900080,0x00000173,0x00000000,
-0x00000000,0x00000010,0x00800000,0x00900000,
-0xf2c0000f,0x00000200,0x00000000,0x00010600,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000163,0x330300c2,
-0x06000000,0x00000000,0x80008000,0x80008000,
-0x3fc0000f,0x00000301,0x00010400,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00b00000,0x00d0806d,0x330480c3,
-0x04800000,0x00000001,0x00800001,0x0000ffff,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x066a0600,0x06350070,0x0000929d,0x929d929d,
-0x00000000,0x0000735a,0x00000600,0x00000000,
-0x929d735a,0x00000000,0x00010000,0x735a735a,
-0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x0000804f,0x000000c3,
-0x05000000,0x00a00010,0x00000000,0x80008000,
-0x00000000,0x00000000,0x00000700,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000080,0x00a00000,0x0000809a,0x000000c2,
-0x07400000,0x00000000,0x80008000,0xffffffff,
-0x00c80028,0x00005555,0x00000000,0x000107a0,
-0x00c80028,0x000000c2,0x06800000,0x00000000,
-0x06e00080,0x00300000,0x000080bb,0x000000c9,
-0x07a00000,0x04000000,0x80008000,0xffffffff,
-0x00c80028,0x00005555,0x00000000,0x00000780,
-0x00c80028,0x000000c5,0xff800000,0x00000000,
-0x00640080,0x00c00000,0x00008197,0x000000c9,
-0x07800000,0x04000000,0x80008000,0xffffffff,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x0000805e,0x000000c1,
-0x00000000,0x00800000,0x80008000,0x80008000,
-0x00020000,0x0000ffff,0x00000000,0x00000000};
-
-static u32 FillArray2[]={
-0x929d0600,0x929d929d,0x929d929d,0x929d0000,
-0x929d929d,0x929d929d,0x929d929d,0x929d929d,
-0x929d929d,0x00100635,0x060b013f,0x00000004,
-0x00000001,0x007a0002,0x00000000,0x066e0610,
-0x0105929d,0x929d929d,0x929d929d,0x929d929d,
-0x929d929d,0xa431ac75,0x0001735a,0xa431ac75,
-0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
-0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
-0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
-0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
-0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
-0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
-0xa431ac75,0xa431ac75,0xa431ac75,0x735a0051,
-0x00000000,0x929d929d,0x929d929d,0x929d929d,
-0x929d929d,0x929d929d,0x929d929d,0x929d929d,
-0x929d929d,0x929d929d,0x00000000,0x06400136,
-0x0000270f,0x00010000,0x007a0000,0x00000000,
-0x068e0645,0x0105929d,0x929d929d,0x929d929d,
-0x929d929d,0x929d929d,0xa431ac75,0x0001735a,
-0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
-0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
-0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
-0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
-0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
-0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
-0xa431ac75,0xa431ac75,0xa431ac75,0xa431ac75,
-0x735a0100,0x00000000,0x00000000,0x00000000};
-
-static u32 FillArray3[]={
-0x00000000,0x00000000,0x00000000,0x00010004};
-
-static u32 FillArray4[]={
-0x00040730,0x00001002,0x000f619e,0x00001003,
-0x00001705,0x00001400,0x000a411e,0x00001003,
-0x00040730,0x00001002,0x000f619e,0x00001003,
-0x00009705,0x00001400,0x000a411e,0x00001003,
-0x00040730,0x00001002,0x000f619e,0x00001003,
-0x00011705,0x00001400,0x000a411e,0x00001003,
-0x00040730,0x00001002,0x000f619e,0x00001003,
-0x00019705,0x00001400,0x000a411e,0x00001003,
-0x00040730,0x00001002,0x000f619e,0x00001003,
-0x00021705,0x00001400,0x000a411e,0x00001003,
-0x00040730,0x00001002,0x000f619e,0x00001003,
-0x00029705,0x00001400,0x000a411e,0x00001003,
-0x00040730,0x00001002,0x000f619e,0x00001003,
-0x00031705,0x00001400,0x000a411e,0x00001003,
-0x00040730,0x00001002,0x000f619e,0x00001003,
-0x00039705,0x00001400,0x000a411e,0x00001003,
-0x000fe19e,0x00001003,0x0009c730,0x00001003,
-0x0008e19c,0x00001003,0x000083c1,0x00093040,
-0x00098730,0x00001002,0x000ee19e,0x00001003,
-0x00009705,0x00001400,0x000a211e,0x00001003,
-0x00098730,0x00001002,0x000ee19e,0x00001003,
-0x00011705,0x00001400,0x000a211e,0x00001003,
-0x00098730,0x00001002,0x000ee19e,0x00001003,
-0x00019705,0x00001400,0x000a211e,0x00001003,
-0x00098730,0x00001002,0x000ee19e,0x00001003,
-0x00021705,0x00001400,0x000a211e,0x00001003,
-0x00098730,0x00001002,0x000ee19e,0x00001003,
-0x00029705,0x00001400,0x000a211e,0x00001003,
-0x00098730,0x00001002,0x000ee19e,0x00001003,
-0x00031705,0x00001400,0x000a211e,0x00001003,
-0x00098730,0x00001002,0x000ee19e,0x00001003,
-0x00039705,0x00001400,0x000a211e,0x00001003,
-0x0000a730,0x00001008,0x000e2730,0x00001002,
-0x0000a731,0x00001002,0x0000a731,0x00001002,
-0x0000a731,0x00001002,0x0000a731,0x00001002,
-0x0000a731,0x00001002,0x0000a731,0x00001002,
-0x00000000,0x00000000,0x000f619c,0x00001003,
-0x0007f801,0x000c0000,0x00000037,0x00001000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x000c0000,0x00000000,0x00000000,
-0x0000373c,0x00001000,0x00000000,0x00000000,
-0x000ee19c,0x00001003,0x0007f801,0x000c0000,
-0x00000037,0x00001000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x0000273c,0x00001000,
-0x00000033,0x00001000,0x000e679e,0x00001003,
-0x00007705,0x00001400,0x000ac71e,0x00001003,
-0x00087fc1,0x000c3be0,0x0007f801,0x000c0000,
-0x00000037,0x00001000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x0000a730,0x00001003,
-0x00000033,0x00001000,0x0007f801,0x000c0000,
-0x00000037,0x00001000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x000c0000,
-0x00000032,0x00001000,0x0000273d,0x00001000,
-0x0004a730,0x00001003,0x00000f41,0x00097140,
-0x0000a841,0x0009b240,0x0000a0c1,0x0009f040,
-0x0001c641,0x00093540,0x0001cec1,0x0009b5c0,
-0x00000000,0x00000000,0x0001bf05,0x0003fc40,
-0x00002725,0x000aa400,0x00013705,0x00093a00,
-0x0000002e,0x0009d6c0,0x00038630,0x00001004,
-0x0004ef0a,0x000eb785,0x0003fc8a,0x00000000,
-0x00000000,0x000c70e0,0x0007d182,0x0002c640,
-0x00000630,0x00001004,0x000799b8,0x0002c6c0,
-0x00031705,0x00092240,0x00039f05,0x000932c0,
-0x0003520a,0x00000000,0x00040731,0x0000100b,
-0x00010705,0x000b20c0,0x00000000,0x000eba44,
-0x00032108,0x000c60c4,0x00065208,0x000c2917,
-0x000406b0,0x00001007,0x00012f05,0x00036880,
-0x0002818e,0x000c0000,0x0004410a,0x00000000,
-0x00040630,0x00001007,0x00029705,0x000c0000,
-0x00000000,0x00000000,0x00003fc1,0x0003fc40,
-0x000037c1,0x00091b40,0x00003fc1,0x000911c0,
-0x000037c1,0x000957c0,0x00003fc1,0x000951c0,
-0x000037c1,0x00000000,0x00003fc1,0x000991c0,
-0x000037c1,0x00000000,0x00003fc1,0x0009d1c0,
-0x000037c1,0x00000000,0x0001ccc1,0x000915c0,
-0x0001c441,0x0009d800,0x0009cdc1,0x00091240,
-0x0001c541,0x00091d00,0x0009cfc1,0x00095240,
-0x0001c741,0x00095c80,0x000e8ca9,0x00099240,
-0x000e85ad,0x00095640,0x00069ca9,0x00099d80,
-0x000e952d,0x00099640,0x000eaca9,0x0009d6c0,
-0x000ea5ad,0x00091a40,0x0006bca9,0x0009de80,
-0x000eb52d,0x00095a40,0x000ecca9,0x00099ac0,
-0x000ec5ad,0x0009da40,0x000edca9,0x0009d300,
-0x000a6e0a,0x00001000,0x000ed52d,0x00091e40,
-0x000eeca9,0x00095ec0,0x000ee5ad,0x00099e40,
-0x0006fca9,0x00002500,0x000fb208,0x000c59a0,
-0x000ef52d,0x0009de40,0x00068ca9,0x000912c1,
-0x000683ad,0x00095241,0x00020f05,0x000991c1,
-0x00000000,0x00000000,0x00086f88,0x00001000,
-0x0009cf81,0x000b5340,0x0009c701,0x000b92c0,
-0x0009de81,0x000bd300,0x0009d601,0x000b1700,
-0x0001fd81,0x000b9d80,0x0009f501,0x000b57c0,
-0x000a0f81,0x000bd740,0x00020701,0x000b5c80,
-0x000a1681,0x000b97c0,0x00021601,0x00002500,
-0x000a0701,0x000b9b40,0x000a0f81,0x000b1bc0,
-0x00021681,0x00002d00,0x00020f81,0x000bd800,
-0x000a0701,0x000b5bc0,0x00021601,0x00003500,
-0x000a0f81,0x000b5f40,0x000a0701,0x000bdbc0,
-0x00021681,0x00003d00,0x00020f81,0x000b1d00,
-0x000a0701,0x000b1fc0,0x00021601,0x00020500,
-0x00020f81,0x000b1341,0x000a0701,0x000b9fc0,
-0x00021681,0x00020d00,0x00020f81,0x000bde80,
-0x000a0701,0x000bdfc0,0x00021601,0x00021500,
-0x00020f81,0x000b9341,0x00020701,0x000b53c1,
-0x00021681,0x00021d00,0x000a0f81,0x000d0380,
-0x0000b601,0x000b15c0,0x00007b01,0x00000000,
-0x00007b81,0x000bd1c0,0x00007b01,0x00000000,
-0x00007b81,0x000b91c0,0x00007b01,0x000b57c0,
-0x00007b81,0x000b51c0,0x00007b01,0x000b1b40,
-0x00007b81,0x000b11c0,0x00087b01,0x000c3dc0,
-0x0007e488,0x000d7e45,0x00000000,0x000d7a44,
-0x0007e48a,0x00000000,0x00011f05,0x00084080,
-0x00000000,0x00000000,0x00001705,0x000b3540,
-0x00008a01,0x000bf040,0x00007081,0x000bb5c0,
-0x00055488,0x00000000,0x0000d482,0x0003fc40,
-0x0003fc88,0x00000000,0x0001e401,0x000b3a00,
-0x0001ec81,0x000bd6c0,0x0004ef08,0x000eb784,
-0x000c86b0,0x00001007,0x00008281,0x000bb240,
-0x0000b801,0x000b7140,0x00007888,0x00000000,
-0x0000073c,0x00001000,0x0007f188,0x000c0000,
-0x00000000,0x00000000,0x00055288,0x000c555c,
-0x0005528a,0x000c0000,0x0009fa88,0x000c5d00,
-0x0000fa88,0x00000000,0x00000032,0x00001000,
-0x0000073d,0x00001000,0x0007f188,0x000c0000,
-0x00000000,0x00000000,0x0008c01c,0x00001003,
-0x00002705,0x00001008,0x0008b201,0x000c1392,
-0x0000ba01,0x00000000,0x00008731,0x00001400,
-0x0004c108,0x000fe0c4,0x00057488,0x00000000,
-0x000a6388,0x00001001,0x0008b334,0x000bc141,
-0x0003020e,0x00000000,0x000886b0,0x00001008,
-0x00003625,0x000c5dfa,0x000a638a,0x00001001,
-0x0008020e,0x00001002,0x0008a6b0,0x00001008,
-0x0007f301,0x00000000,0x00000000,0x00000000,
-0x00002725,0x000a8c40,0x000000ae,0x00000000,
-0x000d8630,0x00001008,0x00000000,0x000c74e0,
-0x0007d182,0x0002d640,0x000a8630,0x00001008,
-0x000799b8,0x0002d6c0,0x0000748a,0x000c3ec5,
-0x0007420a,0x000c0000,0x00062208,0x000c4117,
-0x00070630,0x00001009,0x00000000,0x000c0000,
-0x0001022e,0x00000000,0x0003a630,0x00001009,
-0x00000000,0x000c0000,0x00000036,0x00001000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x0002a730,0x00001008,0x0007f801,0x000c0000,
-0x00000037,0x00001000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x00000000,0x00000000,
-0x00000000,0x00000000,0x0002a730,0x00001008,
-0x00000033,0x00001000,0x0002a705,0x00001008,
-0x00007a01,0x000c0000,0x000e6288,0x000d550a,
-0x0006428a,0x00000000,0x00060730,0x0000100a,
-0x00000000,0x000c0000,0x00000000,0x00000000,
-0x0007aab0,0x00034880,0x00078fb0,0x0000100b,
-0x00057488,0x00000000,0x00033b94,0x00081140,
-0x000183ae,0x00000000,0x000786b0,0x0000100b,
-0x00022f05,0x000c3545,0x0000eb8a,0x00000000,
-0x00042731,0x00001003,0x0007aab0,0x00034880,
-0x00048fb0,0x0000100a,0x00057488,0x00000000,
-0x00033b94,0x00081140,0x000183ae,0x00000000,
-0x000806b0,0x0000100b,0x00022f05,0x00000000,
-0x00007401,0x00091140,0x00048f05,0x000951c0,
-0x00042731,0x00001003,0x0000473d,0x00001000,
-0x000f19b0,0x000bbc47,0x00080000,0x000bffc7,
-0x000fe19e,0x00001003,0x00000000,0x00000000,
-0x0008e19c,0x00001003,0x000083c1,0x00093040,
-0x00000f41,0x00097140,0x0000a841,0x0009b240,
-0x0000a0c1,0x0009f040,0x0001c641,0x00093540,
-0x0001cec1,0x0009b5c0,0x00000000,0x000fdc44,
-0x00055208,0x00000000,0x00010705,0x000a2880,
-0x0000a23a,0x00093a00,0x0003fc8a,0x000df6c5,
-0x0004ef0a,0x000c0000,0x00012f05,0x00036880,
-0x00065308,0x000c2997,0x000d86b0,0x0000100a,
-0x0004410a,0x000d40c7,0x00000000,0x00000000,
-0x00080730,0x00001004,0x00056f0a,0x000ea105,
-0x00000000,0x00000000,0x0000473d,0x00001000,
-0x000f19b0,0x000bbc47,0x00080000,0x000bffc7,
-0x0000273d,0x00001000,0x00000000,0x000eba44,
-0x00048f05,0x0000f440,0x00007401,0x0000f7c0,
-0x00000734,0x00001000,0x00010705,0x000a6880,
-0x00006a88,0x000c75c4,0x00000000,0x000e5084,
-0x00000000,0x000eba44,0x00087401,0x000e4782,
-0x00000734,0x00001000,0x00010705,0x000a6880,
-0x00006a88,0x000c75c4,0x0007c108,0x000c0000,
-0x0007e721,0x000bed40,0x00005f25,0x000badc0,
-0x0003ba97,0x000beb80,0x00065590,0x000b2e00,
-0x00033217,0x00003ec0,0x00065590,0x000b8e40,
-0x0003ed80,0x000491c0,0x00073fb0,0x00074c80,
-0x000283a0,0x0000100c,0x000ee388,0x00042970,
-0x00008301,0x00021ef2,0x000b8f14,0x0000000f,
-0x000c4d8d,0x0000001b,0x000d6dc2,0x000e06c6,
-0x000032ac,0x000c3916,0x0004edc2,0x00074c80,
-0x00078898,0x00001000,0x00038894,0x00000032,
-0x000c4d8d,0x00092e1b,0x000d6dc2,0x000e06c6,
-0x0004edc2,0x000c1956,0x0000722c,0x00034a00,
-0x00041705,0x0009ed40,0x00058730,0x00001400,
-0x000d7488,0x000c3a00,0x00048f05,0x00000000};
-
-static struct
-{   u32 Offset;
-    u32 Size;
-    u32 *pFill;
-} FillStat[FILL__COUNT] = {
-                            {0x00000000, sizeof(FillArray1), FillArray1},
-                            {0x00001800, sizeof(FillArray2), FillArray2},
-                            {0x000137f0, sizeof(FillArray3), FillArray3},
-                            {0x00020000, sizeof(FillArray4), FillArray4}
-                          };
-
-
-#endif
diff --git a/sound/oss/cs46xx.c b/sound/oss/cs46xx.c
deleted file mode 100644 (file)
index 2a1f0d9..0000000
+++ /dev/null
@@ -1,5444 +0,0 @@
-/*
- *     Crystal SoundFusion CS46xx driver
- *
- *     Copyright 1998-2001 Cirrus Logic Corporation <pcaudio@crystal.cirrus.com>
- *                                             <twoller@crystal.cirrus.com>
- *     Copyright 1999-2000 Jaroslav Kysela <perex@suse.cz>
- *     Copyright 2000 Alan Cox <alan@redhat.com>
- *
- *     The core of this code is taken from the ALSA project driver by 
- *     Jaroslav. Please send Jaroslav the credit for the driver and 
- *     report bugs in this port to <alan@redhat.com>
- *
- *     This program is free software; you can redistribute it and/or modify
- *     it under the terms of the GNU General Public License as published by
- *     the Free Software Foundation; either version 2 of the License, or
- *     (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public License
- *     along with this program; if not, write to the Free Software
- *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *     Current maintainers:
- *             Cirrus Logic Corporation, Thomas Woller (tw)
- *                     <twoller@crystal.cirrus.com>
- *             Nils Faerber (nf)
- *                     <nils@kernelconcepts.de>
- *             Thanks to David Pollard for testing.
- *
- *     Changes:
- *     20000909-nf     Changed cs_read, cs_write and drain_dac
- *     20001025-tw     Separate Playback/Capture structs and buffers.
- *                     Added Scatter/Gather support for Playback.
- *                     Added Capture.
- *     20001027-nf     Port to kernel 2.4.0-test9, some clean-ups
- *                     Start of powermanagement support (CS46XX_PM).
- *     20001128-tw     Add module parm for default buffer order.
- *                     added DMA_GFP flag to kmalloc dma buffer allocs.
- *                     backfill silence to eliminate stuttering on
- *                     underruns.
- *     20001201-tw     add resyncing of swptr on underruns.
- *     20001205-tw-nf  fixed GETOSPACE ioctl() after open()
- *     20010113-tw     patch from Hans Grobler general cleanup.
- *     20010117-tw     2.4.0 pci cleanup, wrapper code for 2.2.16-2.4.0
- *     20010118-tw     basic PM support for 2.2.16+ and 2.4.0/2.4.2.
- *     20010228-dh     patch from David Huggins - cs_update_ptr recursion.
- *     20010409-tw     add hercules game theatre XP amp code.
- *     20010420-tw     cleanup powerdown/up code.
- *     20010521-tw     eliminate pops, and fixes for powerdown.
- *     20010525-tw     added fixes for thinkpads with powerdown logic.
- *     20010723-sh     patch from Horms (Simon Horman) -
- *                     SOUND_PCM_READ_BITS returns bits as set in driver
- *                     rather than a logical or of the possible values.
- *                     Various ioctls handle the case where the device
- *                     is open for reading or writing but not both better.
- *
- *     Status:
- *     Playback/Capture supported from 8k-48k.
- *     16Bit Signed LE & 8Bit Unsigned, with Mono or Stereo supported.
- *
- *     APM/PM - 2.2.x APM is enabled and functioning fine. APM can also
- *     be enabled for 2.4.x by modifying the CS46XX_ACPI_SUPPORT macro
- *     definition.
- *
- *      Hercules Game Theatre XP - the EGPIO2 pin controls the external Amp,
- *     so, use the drain/polarity to enable.  
- *     hercules_egpio_disable set to 1, will force a 0 to EGPIODR.
- *
- *     VTB Santa Cruz - the GPIO7/GPIO8 on the Secondary Codec control
- *     the external amplifier for the "back" speakers, since we do not
- *     support the secondary codec then this external amp is also not
- *     turned on.
- */
-#include <linux/interrupt.h>
-#include <linux/list.h>
-#include <linux/module.h>
-#include <linux/string.h>
-#include <linux/ioport.h>
-#include <linux/sched.h>
-#include <linux/delay.h>
-#include <linux/sound.h>
-#include <linux/slab.h>
-#include <linux/soundcard.h>
-#include <linux/pci.h>
-#include <linux/bitops.h>
-#include <linux/init.h>
-#include <linux/poll.h>
-#include <linux/ac97_codec.h>
-#include <linux/mutex.h>
-#include <linux/mm.h>
-
-#include <asm/io.h>
-#include <asm/dma.h>
-#include <asm/uaccess.h>
-
-#include "cs46xxpm.h"
-#include "cs46xx_wrapper-24.h"
-#include "cs461x.h"
-
-/* MIDI buffer sizes */
-#define CS_MIDIINBUF  500
-#define CS_MIDIOUTBUF 500
-
-#define ADC_RUNNING    1
-#define DAC_RUNNING    2
-
-#define CS_FMT_16BIT   1               /* These are fixed in fact */
-#define CS_FMT_STEREO  2
-#define CS_FMT_MASK    3
-
-#define CS_TYPE_ADC    1
-#define CS_TYPE_DAC    2
-
-#define CS_TRUE        1
-#define CS_FALSE       0
-
-#define CS_INC_USE_COUNT(m) (atomic_inc(m))
-#define CS_DEC_USE_COUNT(m) (atomic_dec(m))
-#define CS_DEC_AND_TEST(m) (atomic_dec_and_test(m))
-#define CS_IN_USE(m) (atomic_read(m) != 0)
-
-#define CS_DBGBREAKPOINT {__asm__("INT $3");}
-/*
- *     CS461x definitions
- */
-#define CS461X_BA0_SIZE                0x2000
-#define CS461X_BA1_DATA0_SIZE  0x3000
-#define CS461X_BA1_DATA1_SIZE  0x3800
-#define CS461X_BA1_PRG_SIZE    0x7000
-#define CS461X_BA1_REG_SIZE    0x0100
-
-#define GOF_PER_SEC    200
-
-#define CSDEBUG_INTERFACE 1
-#define CSDEBUG 1
-/*
- * Turn on/off debugging compilation by using 1/0 respectively for CSDEBUG
- *
- *
- * CSDEBUG is usual mode is set to 1, then use the
- * cs_debuglevel and cs_debugmask to turn on or off debugging.
- * Debug level of 1 has been defined to be kernel errors and info
- * that should be printed on any released driver.
- */
-#if CSDEBUG
-#define CS_DBGOUT(mask,level,x) if ((cs_debuglevel >= (level)) && ((mask) & cs_debugmask)) {x;}
-#else
-#define CS_DBGOUT(mask,level,x) 
-#endif
-/*
- * cs_debugmask areas
- */
-#define CS_INIT                0x00000001              /* initialization and probe functions */
-#define CS_ERROR       0x00000002              /* tmp debugging bit placeholder */
-#define CS_INTERRUPT   0x00000004              /* interrupt handler (separate from all other) */
-#define CS_FUNCTION    0x00000008              /* enter/leave functions */
-#define CS_WAVE_WRITE  0x00000010              /* write information for wave */
-#define CS_WAVE_READ   0x00000020              /* read information for wave */
-#define CS_MIDI_WRITE  0x00000040              /* write information for midi */
-#define CS_MIDI_READ   0x00000080              /* read information for midi */
-#define CS_MPU401_WRITE 0x00000100             /* write information for mpu401 */
-#define CS_MPU401_READ         0x00000200              /* read information for mpu401 */
-#define CS_OPEN                0x00000400              /* all open functions in the driver */
-#define CS_RELEASE     0x00000800              /* all release functions in the driver */
-#define CS_PARMS       0x00001000              /* functional and operational parameters */
-#define CS_IOCTL       0x00002000              /* ioctl (non-mixer) */
-#define CS_PM          0x00004000              /* PM */
-#define CS_TMP         0x10000000              /* tmp debug mask bit */
-
-#define CS_IOCTL_CMD_SUSPEND   0x1     // suspend
-#define CS_IOCTL_CMD_RESUME    0x2     // resume
-
-#if CSDEBUG
-static unsigned long cs_debuglevel = 1;                        /* levels range from 1-9 */
-module_param(cs_debuglevel, ulong, 0644);
-static unsigned long cs_debugmask = CS_INIT | CS_ERROR;        /* use CS_DBGOUT with various mask values */
-module_param(cs_debugmask, ulong, 0644);
-#endif
-static unsigned long hercules_egpio_disable;  /* if non-zero set all EGPIO to 0 */
-module_param(hercules_egpio_disable, ulong, 0);
-static unsigned long initdelay = 700;  /* PM delay in millisecs */
-module_param(initdelay, ulong, 0);
-static unsigned long powerdown = -1;  /* turn on/off powerdown processing in driver */
-module_param(powerdown, ulong, 0);
-#define DMABUF_DEFAULTORDER 3
-static unsigned long defaultorder = DMABUF_DEFAULTORDER;
-module_param(defaultorder, ulong, 0);
-
-static int external_amp;
-module_param(external_amp, bool, 0);
-static int thinkpad;
-module_param(thinkpad, bool, 0);
-
-/*
-* set the powerdown module parm to 0 to disable all 
-* powerdown. also set thinkpad to 1 to disable powerdown, 
-* but also to enable the clkrun functionality.
-*/
-static unsigned cs_powerdown = 1;
-static unsigned cs_laptop_wait = 1;
-
-/* An instance of the 4610 channel */
-struct cs_channel 
-{
-       int used;
-       int num;
-       void *state;
-};
-
-#define CS46XX_MAJOR_VERSION "1"
-#define CS46XX_MINOR_VERSION "28"
-
-#ifdef __ia64__
-#define CS46XX_ARCH            "64"    //architecture key
-#else
-#define CS46XX_ARCH            "32"    //architecture key
-#endif
-
-static struct list_head cs46xx_devs = { &cs46xx_devs, &cs46xx_devs };
-
-/* magic numbers to protect our data structures */
-#define CS_CARD_MAGIC          0x43525553 /* "CRUS" */
-#define CS_STATE_MAGIC         0x4c4f4749 /* "LOGI" */
-#define NR_HW_CH               3
-
-/* maxinum number of AC97 codecs connected, AC97 2.0 defined 4 */
-#define NR_AC97                2
-
-static const unsigned sample_size[] = { 1, 2, 2, 4 };
-static const unsigned sample_shift[] = { 0, 1, 1, 2 };
-
-/* "software" or virtual channel, an instance of opened /dev/dsp */
-struct cs_state {
-       unsigned int magic;
-       struct cs_card *card;   /* Card info */
-
-       /* single open lock mechanism, only used for recording */
-       struct mutex open_mutex;
-       wait_queue_head_t open_wait;
-
-       /* file mode */
-       mode_t open_mode;
-
-       /* virtual channel number */
-       int virt;
-       
-       struct dmabuf {
-               /* wave sample stuff */
-               unsigned int rate;
-               unsigned char fmt, enable;
-
-               /* hardware channel */
-               struct cs_channel *channel;
-               int pringbuf;           /* Software ring slot */
-               void *pbuf;             /* 4K hardware DMA buffer */
-
-               /* OSS buffer management stuff */
-               void *rawbuf;
-               dma_addr_t dma_handle;
-               unsigned buforder;
-               unsigned numfrag;
-               unsigned fragshift;
-               unsigned divisor;
-               unsigned type;
-               void *tmpbuff;                  /* tmp buffer for sample conversions */
-               dma_addr_t dmaaddr;
-               dma_addr_t dmaaddr_tmpbuff;
-               unsigned buforder_tmpbuff;      /* Log base 2 of size in bytes.. */
-
-               /* our buffer acts like a circular ring */
-               unsigned hwptr;         /* where dma last started, updated by update_ptr */
-               unsigned swptr;         /* where driver last clear/filled, updated by read/write */
-               int count;              /* bytes to be comsumed or been generated by dma machine */
-               unsigned total_bytes;   /* total bytes dmaed by hardware */
-               unsigned blocks;        /* total blocks */
-
-               unsigned error;         /* number of over/underruns */
-               unsigned underrun;      /* underrun pending before next write has occurred */
-               wait_queue_head_t wait; /* put process on wait queue when no more space in buffer */
-
-               /* redundant, but makes calculations easier */
-               unsigned fragsize;
-               unsigned dmasize;
-               unsigned fragsamples;
-
-               /* OSS stuff */
-               unsigned mapped:1;
-               unsigned ready:1;
-               unsigned endcleared:1;
-               unsigned SGok:1;
-               unsigned update_flag;
-               unsigned ossfragshift;
-               int ossmaxfrags;
-               unsigned subdivision;
-       } dmabuf;
-       /* Guard against mmap/write/read races */
-       struct mutex sem;
-};
-
-struct cs_card {
-       struct cs_channel channel[2];
-       unsigned int magic;
-
-       /* We keep cs461x cards in a linked list */
-       struct cs_card *next;
-
-       /* The cs461x has a certain amount of cross channel interaction
-          so we use a single per card lock */
-       spinlock_t lock;
-       
-       /* Keep AC97 sane */
-       spinlock_t ac97_lock;
-
-       /* mixer use count */
-       atomic_t mixer_use_cnt;
-
-       /* PCI device stuff */
-       struct pci_dev *pci_dev;
-       struct list_head list;
-
-       unsigned int pctl, cctl;        /* Hardware DMA flag sets */
-
-       /* soundcore stuff */
-       int dev_audio;
-       int dev_midi;
-
-       /* structures for abstraction of hardware facilities, codecs, banks and channels*/
-       struct ac97_codec *ac97_codec[NR_AC97];
-       struct cs_state *states[2];
-
-       u16 ac97_features;
-       
-       int amplifier;                  /* Amplifier control */
-       void (*amplifier_ctrl)(struct cs_card *, int);
-       void (*amp_init)(struct cs_card *);
-       
-       int active;                     /* Active clocking */
-       void (*active_ctrl)(struct cs_card *, int);
-       
-       /* hardware resources */
-       unsigned long ba0_addr;
-       unsigned long ba1_addr;
-       u32 irq;
-       
-       /* mappings */
-       void __iomem *ba0;
-       union
-       {
-               struct
-               {
-                       u8 __iomem *data0;
-                       u8 __iomem *data1;
-                       u8 __iomem *pmem;
-                       u8 __iomem *reg;
-               } name;
-               u8 __iomem *idx[4];
-       } ba1;
-       
-       /* Function support */
-       struct cs_channel *(*alloc_pcm_channel)(struct cs_card *);
-       struct cs_channel *(*alloc_rec_pcm_channel)(struct cs_card *);
-       void (*free_pcm_channel)(struct cs_card *, int chan);
-
-       /* /dev/midi stuff */
-       struct {
-               unsigned ird, iwr, icnt;
-               unsigned ord, owr, ocnt;
-               wait_queue_head_t open_wait;
-               wait_queue_head_t iwait;
-               wait_queue_head_t owait;
-               spinlock_t lock;
-               unsigned char ibuf[CS_MIDIINBUF];
-               unsigned char obuf[CS_MIDIOUTBUF];
-               mode_t open_mode;
-               struct mutex open_mutex;
-       } midi;
-       struct cs46xx_pm pm;
-};
-
-static int cs_open_mixdev(struct inode *inode, struct file *file);
-static int cs_release_mixdev(struct inode *inode, struct file *file);
-static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
-                       unsigned long arg);
-static int cs_hardware_init(struct cs_card *card);
-static int cs46xx_powerup(struct cs_card *card, unsigned int type);
-static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspendflag);
-static void cs461x_clear_serial_FIFOs(struct cs_card *card, int type);
-#ifdef CONFIG_PM
-static int cs46xx_suspend_tbl(struct pci_dev *pcidev, pm_message_t state);
-static int cs46xx_resume_tbl(struct pci_dev *pcidev);
-#endif
-
-#if CSDEBUG
-
-/* DEBUG ROUTINES */
-
-#define SOUND_MIXER_CS_GETDBGLEVEL     _SIOWR('M',120, int)
-#define SOUND_MIXER_CS_SETDBGLEVEL     _SIOWR('M',121, int)
-#define SOUND_MIXER_CS_GETDBGMASK      _SIOWR('M',122, int)
-#define SOUND_MIXER_CS_SETDBGMASK      _SIOWR('M',123, int)
-#define SOUND_MIXER_CS_APM             _SIOWR('M',124, int)
-
-static void printioctl(unsigned int x)
-{
-    unsigned int i;
-    unsigned char vidx;
-       /* these values are incorrect for the ac97 driver, fix.
-         * Index of mixtable1[] member is Device ID 
-         * and must be <= SOUND_MIXER_NRDEVICES.
-         * Value of array member is index into s->mix.vol[]
-         */
-        static const unsigned char mixtable1[SOUND_MIXER_NRDEVICES] = {
-                [SOUND_MIXER_PCM]     = 1,   /* voice */
-                [SOUND_MIXER_LINE1]   = 2,   /* AUX */
-                [SOUND_MIXER_CD]      = 3,   /* CD */
-                [SOUND_MIXER_LINE]    = 4,   /* Line */
-                [SOUND_MIXER_SYNTH]   = 5,   /* FM */
-                [SOUND_MIXER_MIC]     = 6,   /* Mic */
-                [SOUND_MIXER_SPEAKER] = 7,   /* Speaker */
-                [SOUND_MIXER_RECLEV]  = 8,   /* Recording level */
-                [SOUND_MIXER_VOLUME]  = 9    /* Master Volume */
-        };
-        
-    switch (x) {
-       case SOUND_MIXER_CS_GETDBGMASK:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_GETDBGMASK: ") );
-               break;
-       case SOUND_MIXER_CS_GETDBGLEVEL:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_GETDBGLEVEL: ") );
-               break;
-       case SOUND_MIXER_CS_SETDBGMASK:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_SETDBGMASK: ") );
-               break;
-       case SOUND_MIXER_CS_SETDBGLEVEL:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CS_SETDBGLEVEL: ") );
-               break;
-        case OSS_GETVERSION:
-               CS_DBGOUT(CS_IOCTL, 4, printk("OSS_GETVERSION: ") );
-               break;
-        case SNDCTL_DSP_SYNC:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SYNC: ") );
-               break;
-        case SNDCTL_DSP_SETDUPLEX:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETDUPLEX: ") );
-               break;
-        case SNDCTL_DSP_GETCAPS:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETCAPS: ") );
-               break;
-        case SNDCTL_DSP_RESET:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_RESET: ") );
-               break;
-        case SNDCTL_DSP_SPEED:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SPEED: ") );
-               break;
-        case SNDCTL_DSP_STEREO:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_STEREO: ") );
-               break;
-        case SNDCTL_DSP_CHANNELS:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_CHANNELS: ") );
-               break;
-        case SNDCTL_DSP_GETFMTS: 
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETFMTS: ") );
-               break;
-        case SNDCTL_DSP_SETFMT: 
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETFMT: ") );
-               break;
-        case SNDCTL_DSP_POST:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_POST: ") );
-               break;
-        case SNDCTL_DSP_GETTRIGGER:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETTRIGGER: ") );
-               break;
-        case SNDCTL_DSP_SETTRIGGER:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETTRIGGER: ") );
-               break;
-        case SNDCTL_DSP_GETOSPACE:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOSPACE: ") );
-               break;
-        case SNDCTL_DSP_GETISPACE:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETISPACE: ") );
-               break;
-        case SNDCTL_DSP_NONBLOCK:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_NONBLOCK: ") );
-               break;
-        case SNDCTL_DSP_GETODELAY:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETODELAY: ") );
-               break;
-        case SNDCTL_DSP_GETIPTR:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETIPTR: ") );
-               break;
-        case SNDCTL_DSP_GETOPTR:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETOPTR: ") );
-               break;
-        case SNDCTL_DSP_GETBLKSIZE:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_GETBLKSIZE: ") );
-               break;
-        case SNDCTL_DSP_SETFRAGMENT:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETFRAGMENT: ") );
-               break;
-        case SNDCTL_DSP_SUBDIVIDE:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SUBDIVIDE: ") );
-               break;
-        case SOUND_PCM_READ_RATE:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_RATE: ") );
-               break;
-        case SOUND_PCM_READ_CHANNELS:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_CHANNELS: ") );
-               break;
-        case SOUND_PCM_READ_BITS:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_BITS: ") );
-               break;
-        case SOUND_PCM_WRITE_FILTER:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_WRITE_FILTER: ") );
-               break;
-        case SNDCTL_DSP_SETSYNCRO:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SNDCTL_DSP_SETSYNCRO: ") );
-               break;
-        case SOUND_PCM_READ_FILTER:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_PCM_READ_FILTER: ") );
-               break;
-        case SOUND_MIXER_PRIVATE1:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE1: ") );
-               break;
-        case SOUND_MIXER_PRIVATE2:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE2: ") );
-               break;
-        case SOUND_MIXER_PRIVATE3:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE3: ") );
-               break;
-        case SOUND_MIXER_PRIVATE4:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE4: ") );
-               break;
-        case SOUND_MIXER_PRIVATE5:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_PRIVATE5: ") );
-               break;
-        case SOUND_MIXER_INFO:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_INFO: ") );
-               break;
-        case SOUND_OLD_MIXER_INFO:
-               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_OLD_MIXER_INFO: ") );
-               break;
-       default:
-               switch (_IOC_NR(x)) {
-                       case SOUND_MIXER_VOLUME:
-                               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_VOLUME: ") );
-                               break;
-                       case SOUND_MIXER_SPEAKER:
-                               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_SPEAKER: ") );
-                               break;
-                       case SOUND_MIXER_RECLEV:
-                               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECLEV: ") );
-                               break;
-                       case SOUND_MIXER_MIC:
-                               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_MIC: ") );
-                               break;
-                       case SOUND_MIXER_SYNTH:
-                               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_SYNTH: ") );
-                               break;
-                       case SOUND_MIXER_RECSRC: 
-                               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECSRC: ") );
-                               break;
-                       case SOUND_MIXER_DEVMASK:
-                               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_DEVMASK: ") );
-                               break;
-                       case SOUND_MIXER_RECMASK:
-                               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_RECMASK: ") );
-                               break;
-                       case SOUND_MIXER_STEREODEVS: 
-                               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_STEREODEVS: ") );
-                               break;
-                       case SOUND_MIXER_CAPS:
-                               CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_CAPS:") );
-                               break;
-                       default:
-                               i = _IOC_NR(x);
-                               if (i >= SOUND_MIXER_NRDEVICES || !(vidx = mixtable1[i])) {
-                                       CS_DBGOUT(CS_IOCTL, 4, printk("UNKNOWN IOCTL: 0x%.8x NR=%d ",x,i) );
-                               } else {
-                                       CS_DBGOUT(CS_IOCTL, 4, printk("SOUND_MIXER_IOCTL AC9x: 0x%.8x NR=%d ",
-                                                       x,i));
-                               }
-                               break;
-               }
-    }
-    CS_DBGOUT(CS_IOCTL, 4, printk("command = 0x%x IOC_NR=%d\n",x, _IOC_NR(x)) );
-}
-#endif
-
-/*
- *  common I/O routines
- */
-
-static void cs461x_poke(struct cs_card *codec, unsigned long reg, unsigned int val)
-{
-       writel(val, codec->ba1.idx[(reg >> 16) & 3] + (reg & 0xffff));
-}
-
-static unsigned int cs461x_peek(struct cs_card *codec, unsigned long reg)
-{
-       return readl(codec->ba1.idx[(reg >> 16) & 3] + (reg & 0xffff));
-}
-
-static void cs461x_pokeBA0(struct cs_card *codec, unsigned long reg, unsigned int val)
-{
-       writel(val, codec->ba0 + reg);
-}
-
-static unsigned int cs461x_peekBA0(struct cs_card *codec, unsigned long reg)
-{
-       return readl(codec->ba0 + reg);
-}
-
-
-static u16 cs_ac97_get(struct ac97_codec *dev, u8 reg);
-static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 data);
-
-static struct cs_channel *cs_alloc_pcm_channel(struct cs_card *card)
-{
-       if (card->channel[1].used == 1)
-               return NULL;
-       card->channel[1].used = 1;
-       card->channel[1].num = 1;
-       return &card->channel[1];
-}
-
-static struct cs_channel *cs_alloc_rec_pcm_channel(struct cs_card *card)
-{
-       if (card->channel[0].used == 1)
-               return NULL;
-       card->channel[0].used = 1;
-       card->channel[0].num = 0;
-       return &card->channel[0];
-}
-
-static void cs_free_pcm_channel(struct cs_card *card, int channel)
-{
-       card->channel[channel].state = NULL;
-       card->channel[channel].used = 0;
-}
-
-/*
- * setup a divisor value to help with conversion from
- * 16bit Stereo, down to 8bit stereo/mono or 16bit mono.
- * assign a divisor of 1 if using 16bit Stereo as that is
- * the only format that the static image will capture.
- */
-static void cs_set_divisor(struct dmabuf *dmabuf)
-{
-       if (dmabuf->type == CS_TYPE_DAC)
-               dmabuf->divisor = 1;
-       else if (!(dmabuf->fmt & CS_FMT_STEREO) &&
-           (dmabuf->fmt & CS_FMT_16BIT))
-               dmabuf->divisor = 2;
-       else if ((dmabuf->fmt & CS_FMT_STEREO) &&
-           !(dmabuf->fmt & CS_FMT_16BIT))
-               dmabuf->divisor = 2;
-       else if (!(dmabuf->fmt & CS_FMT_STEREO) &&
-           !(dmabuf->fmt & CS_FMT_16BIT))
-               dmabuf->divisor = 4;
-       else
-               dmabuf->divisor = 1;
-
-       CS_DBGOUT(CS_PARMS | CS_FUNCTION, 8, printk(
-               "cs46xx: cs_set_divisor()- %s %d\n",
-                       (dmabuf->type == CS_TYPE_ADC) ? "ADC" : "DAC", 
-                       dmabuf->divisor) );
-}
-
-/*
-* mute some of the more prevalent registers to avoid popping.
-*/
-static void cs_mute(struct cs_card *card, int state) 
-{
-       struct ac97_codec *dev = card->ac97_codec[0];
-
-       CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: cs_mute()+ %s\n",
-               (state == CS_TRUE) ? "Muting" : "UnMuting"));
-
-       if (state == CS_TRUE) {
-       /*
-       * fix pops when powering up on thinkpads
-       */
-               card->pm.u32AC97_master_volume = (u32)cs_ac97_get( dev, 
-                               (u8)BA0_AC97_MASTER_VOLUME); 
-               card->pm.u32AC97_headphone_volume = (u32)cs_ac97_get(dev, 
-                               (u8)BA0_AC97_HEADPHONE_VOLUME); 
-               card->pm.u32AC97_master_volume_mono = (u32)cs_ac97_get(dev, 
-                               (u8)BA0_AC97_MASTER_VOLUME_MONO); 
-               card->pm.u32AC97_pcm_out_volume = (u32)cs_ac97_get(dev, 
-                               (u8)BA0_AC97_PCM_OUT_VOLUME);
-                       
-               cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, 0x8000);
-               cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, 0x8000);
-               cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, 0x8000);
-               cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, 0x8000);
-       } else {
-               cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, card->pm.u32AC97_master_volume);
-               cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, card->pm.u32AC97_headphone_volume);
-               cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, card->pm.u32AC97_master_volume_mono);
-               cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, card->pm.u32AC97_pcm_out_volume);
-       }
-       CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: cs_mute()-\n"));
-}
-
-/* set playback sample rate */
-static unsigned int cs_set_dac_rate(struct cs_state * state, unsigned int rate)
-{      
-       struct dmabuf *dmabuf = &state->dmabuf;
-       unsigned int tmp1, tmp2;
-       unsigned int phiIncr;
-       unsigned int correctionPerGOF, correctionPerSec;
-       unsigned long flags;
-
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_dac_rate()+ %d\n",rate) );
-
-       /*
-        *  Compute the values used to drive the actual sample rate conversion.
-        *  The following formulas are being computed, using inline assembly
-        *  since we need to use 64 bit arithmetic to compute the values:
-        *
-        *  phiIncr = floor((Fs,in * 2^26) / Fs,out)
-        *  correctionPerGOF = floor((Fs,in * 2^26 - Fs,out * phiIncr) /
-         *                                   GOF_PER_SEC)
-         *  ulCorrectionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -M
-         *                       GOF_PER_SEC * correctionPerGOF
-        *
-        *  i.e.
-        *
-        *  phiIncr:other = dividend:remainder((Fs,in * 2^26) / Fs,out)
-        *  correctionPerGOF:correctionPerSec =
-        *      dividend:remainder(ulOther / GOF_PER_SEC)
-        */
-       tmp1 = rate << 16;
-       phiIncr = tmp1 / 48000;
-       tmp1 -= phiIncr * 48000;
-       tmp1 <<= 10;
-       phiIncr <<= 10;
-       tmp2 = tmp1 / 48000;
-       phiIncr += tmp2;
-       tmp1 -= tmp2 * 48000;
-       correctionPerGOF = tmp1 / GOF_PER_SEC;
-       tmp1 -= correctionPerGOF * GOF_PER_SEC;
-       correctionPerSec = tmp1;
-
-       /*
-        *  Fill in the SampleRateConverter control block.
-        */
-       spin_lock_irqsave(&state->card->lock, flags);
-       cs461x_poke(state->card, BA1_PSRC,
-         ((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
-       cs461x_poke(state->card, BA1_PPI, phiIncr);
-       spin_unlock_irqrestore(&state->card->lock, flags);
-       dmabuf->rate = rate;
-       
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_dac_rate()- %d\n",rate) );
-       return rate;
-}
-
-/* set recording sample rate */
-static unsigned int cs_set_adc_rate(struct cs_state *state, unsigned int rate)
-{
-       struct dmabuf *dmabuf = &state->dmabuf;
-       struct cs_card *card = state->card;
-       unsigned int phiIncr, coeffIncr, tmp1, tmp2;
-       unsigned int correctionPerGOF, correctionPerSec, initialDelay;
-       unsigned int frameGroupLength, cnt;
-       unsigned long flags;
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_adc_rate()+ %d\n",rate) );
-
-       /*
-        *  We can only decimate by up to a factor of 1/9th the hardware rate.
-        *  Correct the value if an attempt is made to stray outside that limit.
-        */
-       if ((rate * 9) < 48000)
-               rate = 48000 / 9;
-
-       /*
-        *  We cannot capture at at rate greater than the Input Rate (48000).
-        *  Return an error if an attempt is made to stray outside that limit.
-        */
-       if (rate > 48000)
-               rate = 48000;
-
-       /*
-        *  Compute the values used to drive the actual sample rate conversion.
-        *  The following formulas are being computed, using inline assembly
-        *  since we need to use 64 bit arithmetic to compute the values:
-        *
-        *     coeffIncr = -floor((Fs,out * 2^23) / Fs,in)
-        *     phiIncr = floor((Fs,in * 2^26) / Fs,out)
-        *     correctionPerGOF = floor((Fs,in * 2^26 - Fs,out * phiIncr) /
-        *                                GOF_PER_SEC)
-        *     correctionPerSec = Fs,in * 2^26 - Fs,out * phiIncr -
-        *                          GOF_PER_SEC * correctionPerGOF
-        *     initialDelay = ceil((24 * Fs,in) / Fs,out)
-        *
-        * i.e.
-        *
-        *     coeffIncr = neg(dividend((Fs,out * 2^23) / Fs,in))
-        *     phiIncr:ulOther = dividend:remainder((Fs,in * 2^26) / Fs,out)
-        *     correctionPerGOF:correctionPerSec =
-        *          dividend:remainder(ulOther / GOF_PER_SEC)
-        *     initialDelay = dividend(((24 * Fs,in) + Fs,out - 1) / Fs,out)
-        */
-       tmp1 = rate << 16;
-       coeffIncr = tmp1 / 48000;
-       tmp1 -= coeffIncr * 48000;
-       tmp1 <<= 7;
-       coeffIncr <<= 7;
-       coeffIncr += tmp1 / 48000;
-       coeffIncr ^= 0xFFFFFFFF;
-       coeffIncr++;
-       tmp1 = 48000 << 16;
-       phiIncr = tmp1 / rate;
-       tmp1 -= phiIncr * rate;
-       tmp1 <<= 10;
-       phiIncr <<= 10;
-       tmp2 = tmp1 / rate;
-       phiIncr += tmp2;
-       tmp1 -= tmp2 * rate;
-       correctionPerGOF = tmp1 / GOF_PER_SEC;
-       tmp1 -= correctionPerGOF * GOF_PER_SEC;
-       correctionPerSec = tmp1;
-       initialDelay = ((48000 * 24) + rate - 1) / rate;
-
-       /*
-        *  Fill in the VariDecimate control block.
-        */
-       spin_lock_irqsave(&card->lock, flags);
-       cs461x_poke(card, BA1_CSRC,
-               ((correctionPerSec << 16) & 0xFFFF0000) | (correctionPerGOF & 0xFFFF));
-       cs461x_poke(card, BA1_CCI, coeffIncr);
-       cs461x_poke(card, BA1_CD,
-               (((BA1_VARIDEC_BUF_1 + (initialDelay << 2)) << 16) & 0xFFFF0000) | 0x80);
-       cs461x_poke(card, BA1_CPI, phiIncr);
-       spin_unlock_irqrestore(&card->lock, flags);
-
-       /*
-        *  Figure out the frame group length for the write back task.  Basically,
-        *  this is just the factors of 24000 (2^6*3*5^3) that are not present in
-        *  the output sample rate.
-        */
-       frameGroupLength = 1;
-       for (cnt = 2; cnt <= 64; cnt *= 2) {
-               if (((rate / cnt) * cnt) != rate)
-                       frameGroupLength *= 2;
-       }
-       if (((rate / 3) * 3) != rate) {
-               frameGroupLength *= 3;
-       }
-       for (cnt = 5; cnt <= 125; cnt *= 5) {
-               if (((rate / cnt) * cnt) != rate) 
-                       frameGroupLength *= 5;
-        }
-
-       /*
-        * Fill in the WriteBack control block.
-        */
-       spin_lock_irqsave(&card->lock, flags);
-       cs461x_poke(card, BA1_CFG1, frameGroupLength);
-       cs461x_poke(card, BA1_CFG2, (0x00800000 | frameGroupLength));
-       cs461x_poke(card, BA1_CCST, 0x0000FFFF);
-       cs461x_poke(card, BA1_CSPB, ((65536 * rate) / 24000));
-       cs461x_poke(card, (BA1_CSPB + 4), 0x0000FFFF);
-       spin_unlock_irqrestore(&card->lock, flags);
-       dmabuf->rate = rate;
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_set_adc_rate()- %d\n",rate) );
-       return rate;
-}
-
-/* prepare channel attributes for playback */ 
-static void cs_play_setup(struct cs_state *state)
-{
-       struct dmabuf *dmabuf = &state->dmabuf;
-       struct cs_card *card = state->card;
-        unsigned int tmp, Count, playFormat;
-
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_play_setup()+\n") );
-        cs461x_poke(card, BA1_PVOL, 0x80008000);
-        if (!dmabuf->SGok)
-               cs461x_poke(card, BA1_PBA, virt_to_bus(dmabuf->pbuf));
-    
-        Count = 4;                                                          
-        playFormat=cs461x_peek(card, BA1_PFIE);                             
-        if ((dmabuf->fmt & CS_FMT_STEREO)) {                                
-                playFormat &= ~DMA_RQ_C2_AC_MONO_TO_STEREO;                 
-                Count *= 2;                                                 
-        } else
-                playFormat |= DMA_RQ_C2_AC_MONO_TO_STEREO;                  
-                                                                            
-        if ((dmabuf->fmt & CS_FMT_16BIT)) {                                 
-                playFormat &= ~(DMA_RQ_C2_AC_8_TO_16_BIT                    
-                           | DMA_RQ_C2_AC_SIGNED_CONVERT);                  
-                Count *= 2;                                                 
-        } else
-                playFormat |= (DMA_RQ_C2_AC_8_TO_16_BIT                     
-                           | DMA_RQ_C2_AC_SIGNED_CONVERT);                  
-                                                                            
-        cs461x_poke(card, BA1_PFIE, playFormat);                            
-                                                                            
-        tmp = cs461x_peek(card, BA1_PDTC);                                  
-        tmp &= 0xfffffe00;                                                  
-        cs461x_poke(card, BA1_PDTC, tmp | --Count);                         
-
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_play_setup()-\n") );
-}
-
-static struct InitStruct
-{
-    u32 off;
-    u32 val;
-} InitArray[] = { {0x00000040, 0x3fc0000f},
-                  {0x0000004c, 0x04800000},
-
-                  {0x000000b3, 0x00000780},
-                  {0x000000b7, 0x00000000},
-                  {0x000000bc, 0x07800000},
-
-                  {0x000000cd, 0x00800000},
-                };
-
-/*
- * "SetCaptureSPValues()" -- Initialize record task values before each
- *     capture startup.  
- */
-static void SetCaptureSPValues(struct cs_card *card)
-{
-       unsigned i, offset;
-       CS_DBGOUT(CS_FUNCTION, 8, printk("cs46xx: SetCaptureSPValues()+\n") );
-       for (i = 0; i < sizeof(InitArray) / sizeof(struct InitStruct); i++) {
-               offset = InitArray[i].off*4; /* 8bit to 32bit offset value */
-               cs461x_poke(card, offset, InitArray[i].val );
-       }
-       CS_DBGOUT(CS_FUNCTION, 8, printk("cs46xx: SetCaptureSPValues()-\n") );
-}
-
-/* prepare channel attributes for recording */
-static void cs_rec_setup(struct cs_state *state)
-{
-       struct cs_card *card = state->card;
-       struct dmabuf *dmabuf = &state->dmabuf;
-
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_rec_setup()+\n"));
-       SetCaptureSPValues(card);
-
-       /*
-        * set the attenuation to 0dB 
-        */
-       cs461x_poke(card, BA1_CVOL, 0x80008000);
-
-       /*
-        * set the physical address of the capture buffer into the SP
-        */
-       cs461x_poke(card, BA1_CBA, virt_to_bus(dmabuf->rawbuf));
-
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_rec_setup()-\n") );
-}
-
-
-/* get current playback/recording dma buffer pointer (byte offset from LBA),
-   called with spinlock held! */
-   
-static inline unsigned cs_get_dma_addr(struct cs_state *state)
-{
-       struct dmabuf *dmabuf = &state->dmabuf;
-       u32 offset;
-       
-       if ( (!(dmabuf->enable & DAC_RUNNING)) &&
-            (!(dmabuf->enable & ADC_RUNNING) ) )
-       {
-               CS_DBGOUT(CS_ERROR, 2, printk(
-                       "cs46xx: ERROR cs_get_dma_addr(): not enabled \n") );
-               return 0;
-       }
-               
-       /*
-        * granularity is byte boundary, good part.
-        */
-       if (dmabuf->enable & DAC_RUNNING)
-               offset = cs461x_peek(state->card, BA1_PBA);                                  
-       else /* ADC_RUNNING must be set */
-               offset = cs461x_peek(state->card, BA1_CBA);                                  
-
-       CS_DBGOUT(CS_PARMS | CS_FUNCTION, 9, 
-               printk("cs46xx: cs_get_dma_addr() %d\n",offset) );
-       offset = (u32)bus_to_virt((unsigned long)offset) - (u32)dmabuf->rawbuf;
-       CS_DBGOUT(CS_PARMS | CS_FUNCTION, 8, 
-               printk("cs46xx: cs_get_dma_addr()- %d\n",offset) );
-       return offset;
-}
-
-static void resync_dma_ptrs(struct cs_state *state)
-{
-       struct dmabuf *dmabuf;
-       
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: resync_dma_ptrs()+ \n") );
-       if (state) {
-               dmabuf = &state->dmabuf;
-               dmabuf->hwptr=dmabuf->swptr = 0;
-               dmabuf->pringbuf = 0;
-       }
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: resync_dma_ptrs()- \n") );
-}
-       
-/* Stop recording (lock held) */
-static inline void __stop_adc(struct cs_state *state)
-{
-       struct dmabuf *dmabuf = &state->dmabuf;
-       struct cs_card *card = state->card;
-       unsigned int tmp;
-       
-       dmabuf->enable &= ~ADC_RUNNING;
-       
-       tmp = cs461x_peek(card, BA1_CCTL);
-       tmp &= 0xFFFF0000;
-       cs461x_poke(card, BA1_CCTL, tmp );
-}
-
-static void stop_adc(struct cs_state *state)
-{
-       unsigned long flags;
-
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_adc()+ \n") );
-       spin_lock_irqsave(&state->card->lock, flags);
-       __stop_adc(state);
-       spin_unlock_irqrestore(&state->card->lock, flags);
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_adc()- \n") );
-}
-
-static void start_adc(struct cs_state *state)
-{
-       struct dmabuf *dmabuf = &state->dmabuf;
-       struct cs_card *card = state->card;
-       unsigned long flags;
-       unsigned int tmp;
-
-       spin_lock_irqsave(&card->lock, flags);
-       if (!(dmabuf->enable & ADC_RUNNING) && 
-            ((dmabuf->mapped || dmabuf->count < (signed)dmabuf->dmasize) 
-              && dmabuf->ready) && 
-              ((card->pm.flags & CS46XX_PM_IDLE) || 
-               (card->pm.flags & CS46XX_PM_RESUMED)) )
-       {
-               dmabuf->enable |= ADC_RUNNING;
-               cs_set_divisor(dmabuf);
-               tmp = cs461x_peek(card, BA1_CCTL);
-               tmp &= 0xFFFF0000;
-               tmp |= card->cctl;
-               CS_DBGOUT(CS_FUNCTION, 2, printk(
-                       "cs46xx: start_adc() poke 0x%x \n",tmp) );
-               cs461x_poke(card, BA1_CCTL, tmp);
-       }
-       spin_unlock_irqrestore(&card->lock, flags);
-}
-
-/* stop playback (lock held) */
-static inline void __stop_dac(struct cs_state *state)
-{
-       struct dmabuf *dmabuf = &state->dmabuf;
-       struct cs_card *card = state->card;
-       unsigned int tmp;
-
-       dmabuf->enable &= ~DAC_RUNNING;
-       
-       tmp=cs461x_peek(card, BA1_PCTL);
-       tmp&=0xFFFF;
-       cs461x_poke(card, BA1_PCTL, tmp);
-}
-
-static void stop_dac(struct cs_state *state)
-{
-       unsigned long flags;
-
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_dac()+ \n") );
-       spin_lock_irqsave(&state->card->lock, flags);
-       __stop_dac(state);
-       spin_unlock_irqrestore(&state->card->lock, flags);
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: stop_dac()- \n") );
-}      
-
-static void start_dac(struct cs_state *state)
-{
-       struct dmabuf *dmabuf = &state->dmabuf;
-       struct cs_card *card = state->card;
-       unsigned long flags;
-       int tmp;
-
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: start_dac()+ \n") );
-       spin_lock_irqsave(&card->lock, flags);
-       if (!(dmabuf->enable & DAC_RUNNING) && 
-           ((dmabuf->mapped || dmabuf->count > 0) && dmabuf->ready) &&
-              ((card->pm.flags & CS46XX_PM_IDLE) || 
-               (card->pm.flags & CS46XX_PM_RESUMED)) )
-       {
-               dmabuf->enable |= DAC_RUNNING;
-               tmp = cs461x_peek(card, BA1_PCTL);
-               tmp &= 0xFFFF;
-               tmp |= card->pctl;
-               CS_DBGOUT(CS_PARMS, 6, printk(
-                   "cs46xx: start_dac() poke card=%p tmp=0x%.08x addr=%p \n",
-                   card, (unsigned)tmp, 
-                   card->ba1.idx[(BA1_PCTL >> 16) & 3]+(BA1_PCTL&0xffff) ) );
-               cs461x_poke(card, BA1_PCTL, tmp);
-       }
-       spin_unlock_irqrestore(&card->lock, flags);
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: start_dac()- \n") );
-}
-
-#define DMABUF_MINORDER 1
-
-/*
- * allocate DMA buffer, playback and recording buffers are separate.
- */
-static int alloc_dmabuf(struct cs_state *state)
-{
-
-       struct cs_card *card=state->card;
-       struct dmabuf *dmabuf = &state->dmabuf;
-       void *rawbuf = NULL;
-       void *tmpbuff = NULL;
-       int order;
-       struct page *map, *mapend;
-       unsigned long df;
-       
-       dmabuf->ready  = dmabuf->mapped = 0;
-       dmabuf->SGok = 0;
-/*
-* check for order within limits, but do not overwrite value.
-*/
-       if ((defaultorder > 1) && (defaultorder < 12))
-               df = defaultorder;
-       else
-               df = 2; 
-
-       for (order = df; order >= DMABUF_MINORDER; order--)
-               if ((rawbuf = (void *)pci_alloc_consistent(
-                       card->pci_dev, PAGE_SIZE << order, &dmabuf->dmaaddr)))
-                           break;
-       if (!rawbuf) {
-               CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
-                       "cs46xx: alloc_dmabuf(): unable to allocate rawbuf\n"));
-               return -ENOMEM;
-       }
-       dmabuf->buforder = order;
-       dmabuf->rawbuf = rawbuf;
-       // Now mark the pages as reserved; otherwise the 
-       // remap_pfn_range() in cs46xx_mmap doesn't work.
-       // 1. get index to last page in mem_map array for rawbuf.
-       mapend = virt_to_page(dmabuf->rawbuf + 
-               (PAGE_SIZE << dmabuf->buforder) - 1);
-
-       // 2. mark each physical page in range as 'reserved'.
-       for (map = virt_to_page(dmabuf->rawbuf); map <= mapend; map++)
-               cs4x_mem_map_reserve(map);
-
-       CS_DBGOUT(CS_PARMS, 9, printk("cs46xx: alloc_dmabuf(): allocated %ld (order = %d) bytes at %p\n",
-              PAGE_SIZE << order, order, rawbuf) );
-
-/*
-*  only allocate the conversion buffer for the ADC
-*/
-       if (dmabuf->type == CS_TYPE_DAC) {
-               dmabuf->tmpbuff = NULL;
-               dmabuf->buforder_tmpbuff = 0;
-               return 0;
-       }
-/*
- * now the temp buffer for 16/8 conversions
- */
-
-       tmpbuff = (void *) pci_alloc_consistent(
-               card->pci_dev, PAGE_SIZE << order, &dmabuf->dmaaddr_tmpbuff);
-
-       if (!tmpbuff)
-               return -ENOMEM;
-       CS_DBGOUT(CS_PARMS, 9, printk("cs46xx: allocated %ld (order = %d) bytes at %p\n",
-              PAGE_SIZE << order, order, tmpbuff) );
-
-       dmabuf->tmpbuff = tmpbuff;
-       dmabuf->buforder_tmpbuff = order;
-       
-       // Now mark the pages as reserved; otherwise the 
-       // remap_pfn_range() in cs46xx_mmap doesn't work.
-       // 1. get index to last page in mem_map array for rawbuf.
-       mapend = virt_to_page(dmabuf->tmpbuff + 
-               (PAGE_SIZE << dmabuf->buforder_tmpbuff) - 1);
-
-       // 2. mark each physical page in range as 'reserved'.
-       for (map = virt_to_page(dmabuf->tmpbuff); map <= mapend; map++)
-               cs4x_mem_map_reserve(map);
-       return 0;
-}
-
-/* free DMA buffer */
-static void dealloc_dmabuf(struct cs_state *state)
-{
-       struct dmabuf *dmabuf = &state->dmabuf;
-       struct page *map, *mapend;
-
-       if (dmabuf->rawbuf) {
-               // Undo prog_dmabuf()'s marking the pages as reserved 
-               mapend = virt_to_page(dmabuf->rawbuf + 
-                               (PAGE_SIZE << dmabuf->buforder) - 1);
-               for (map = virt_to_page(dmabuf->rawbuf); map <= mapend; map++)
-                       cs4x_mem_map_unreserve(map);
-               free_dmabuf(state->card, dmabuf);
-       }
-
-       if (dmabuf->tmpbuff) {
-               // Undo prog_dmabuf()'s marking the pages as reserved 
-               mapend = virt_to_page(dmabuf->tmpbuff +
-                               (PAGE_SIZE << dmabuf->buforder_tmpbuff) - 1);
-               for (map = virt_to_page(dmabuf->tmpbuff); map <= mapend; map++)
-                       cs4x_mem_map_unreserve(map);
-               free_dmabuf2(state->card, dmabuf);
-       }
-
-       dmabuf->rawbuf = NULL;
-       dmabuf->tmpbuff = NULL;
-       dmabuf->mapped = dmabuf->ready = 0;
-       dmabuf->SGok = 0;
-}
-
-static int __prog_dmabuf(struct cs_state *state)
-{
-        struct dmabuf *dmabuf = &state->dmabuf;
-        unsigned long flags;
-        unsigned long allocated_pages, allocated_bytes;                     
-        unsigned long tmp1, tmp2, fmt=0;                                           
-        unsigned long *ptmp = (unsigned long *) dmabuf->pbuf;               
-        unsigned long SGarray[9], nSGpages=0;                               
-        int ret;
-
-       CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()+ \n"));
-/*
- * check for CAPTURE and use only non-sg for initial release
- */
-       if (dmabuf->type == CS_TYPE_ADC) {
-               CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf() ADC\n"));
-               /* 
-                * add in non-sg support for capture.
-                */
-               spin_lock_irqsave(&state->card->lock, flags);
-       /* add code to reset the rawbuf memory. TRW */
-               resync_dma_ptrs(state);
-               dmabuf->total_bytes = dmabuf->blocks = 0;
-               dmabuf->count = dmabuf->error = dmabuf->underrun = 0;
-
-               dmabuf->SGok = 0;                                                   
-
-               spin_unlock_irqrestore(&state->card->lock, flags);
-
-               /* allocate DMA buffer if not allocated yet */
-               if (!dmabuf->rawbuf || !dmabuf->tmpbuff)
-                       if ((ret = alloc_dmabuf(state)))
-                               return ret; 
-       /*
-        * static image only supports 16Bit signed, stereo - hard code fmt
-        */
-               fmt = CS_FMT_16BIT | CS_FMT_STEREO;
-
-               dmabuf->numfrag = 2;                                        
-               dmabuf->fragsize = 2048;                                    
-               dmabuf->fragsamples = 2048 >> sample_shift[fmt];    
-               dmabuf->dmasize = 4096;                                     
-               dmabuf->fragshift = 11;                                     
-
-               memset(dmabuf->rawbuf, (fmt & CS_FMT_16BIT) ? 0 : 0x80,
-                      dmabuf->dmasize);
-               memset(dmabuf->tmpbuff, (fmt & CS_FMT_16BIT) ? 0 : 0x80, 
-                       PAGE_SIZE<<dmabuf->buforder_tmpbuff);      
-
-               /*
-                *      Now set up the ring
-                */
-
-               spin_lock_irqsave(&state->card->lock, flags);
-               cs_rec_setup(state);
-               spin_unlock_irqrestore(&state->card->lock, flags);
-
-               /* set the ready flag for the dma buffer */
-               dmabuf->ready = 1;
-
-               CS_DBGOUT(CS_PARMS, 4, printk(
-                       "cs46xx: prog_dmabuf(): CAPTURE rate=%d fmt=0x%x numfrag=%d "
-                       "fragsize=%d dmasize=%d\n",
-                           dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
-                           dmabuf->fragsize, dmabuf->dmasize) );
-
-               CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- 0 \n"));
-               return 0;
-       } else if (dmabuf->type == CS_TYPE_DAC) {
-       /*
-        * Must be DAC
-        */
-               CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf() DAC\n"));
-               spin_lock_irqsave(&state->card->lock, flags);
-               resync_dma_ptrs(state);
-               dmabuf->total_bytes = dmabuf->blocks = 0;
-               dmabuf->count = dmabuf->error = dmabuf->underrun = 0;
-
-               dmabuf->SGok = 0;                                                   
-
-               spin_unlock_irqrestore(&state->card->lock, flags);
-
-               /* allocate DMA buffer if not allocated yet */
-               if (!dmabuf->rawbuf)
-                       if ((ret = alloc_dmabuf(state)))
-                               return ret;
-
-               allocated_pages = 1 << dmabuf->buforder;                            
-               allocated_bytes = allocated_pages*PAGE_SIZE;                        
-                                                                                   
-               if (allocated_pages < 2) {
-                       CS_DBGOUT(CS_FUNCTION, 4, printk(
-                           "cs46xx: prog_dmabuf() Error: allocated_pages too small (%d)\n",
-                               (unsigned)allocated_pages));
-                       return -ENOMEM;
-               }
-                                                                                   
-               /* Use all the pages allocated, fragsize 4k. */
-               /* Use 'pbuf' for S/G page map table. */
-               dmabuf->SGok = 1;           /* Use S/G. */
-
-               nSGpages = allocated_bytes/4096;    /* S/G pages always 4k. */
-                                                                                   
-                    /* Set up S/G variables. */
-               *ptmp = virt_to_bus(dmabuf->rawbuf);                                
-               *(ptmp + 1) = 0x00000008;
-               for (tmp1 = 1; tmp1 < nSGpages; tmp1++) {
-                       *(ptmp + 2 * tmp1) = virt_to_bus((dmabuf->rawbuf) + 4096 * tmp1);
-                       if (tmp1 == nSGpages - 1)
-                               tmp2 = 0xbfff0000;
-                       else                                                        
-                               tmp2 = 0x80000000 + 8 * (tmp1 + 1);
-                       *(ptmp + 2 * tmp1 + 1) = tmp2;
-               }                                                                   
-               SGarray[0] = 0x82c0200d;                                            
-               SGarray[1] = 0xffff0000;                                            
-               SGarray[2] = *ptmp;                                                 
-               SGarray[3] = 0x00010600;                                            
-               SGarray[4] = *(ptmp+2);                                             
-               SGarray[5] = 0x80000010;                                            
-               SGarray[6] = *ptmp;
-               SGarray[7] = *(ptmp+2);
-               SGarray[8] = (virt_to_bus(dmabuf->pbuf) & 0xffff000) | 0x10;
-
-               if (dmabuf->SGok) {
-                       dmabuf->numfrag = nSGpages;
-                       dmabuf->fragsize = 4096;
-                       dmabuf->fragsamples = 4096 >> sample_shift[dmabuf->fmt];
-                       dmabuf->fragshift = 12;
-                       dmabuf->dmasize = dmabuf->numfrag * 4096;
-               } else {
-                       SGarray[0] = 0xf2c0000f;                                    
-                       SGarray[1] = 0x00000200;                                    
-                       SGarray[2] = 0;                                             
-                       SGarray[3] = 0x00010600;                                    
-                       SGarray[4]=SGarray[5]=SGarray[6]=SGarray[7]=SGarray[8] = 0; 
-                       dmabuf->numfrag = 2;                                        
-                       dmabuf->fragsize = 2048;                                    
-                       dmabuf->fragsamples = 2048 >> sample_shift[dmabuf->fmt];    
-                       dmabuf->dmasize = 4096;                                     
-                       dmabuf->fragshift = 11;                                     
-               }
-               for (tmp1 = 0; tmp1 < sizeof(SGarray) / 4; tmp1++)
-                       cs461x_poke(state->card, BA1_PDTC+tmp1 * 4, SGarray[tmp1]);
-
-               memset(dmabuf->rawbuf, (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
-                      dmabuf->dmasize);
-
-               /*
-                *      Now set up the ring
-                */
-
-               spin_lock_irqsave(&state->card->lock, flags);
-               cs_play_setup(state);
-               spin_unlock_irqrestore(&state->card->lock, flags);
-
-               /* set the ready flag for the dma buffer */
-               dmabuf->ready = 1;
-
-               CS_DBGOUT(CS_PARMS, 4, printk(
-                       "cs46xx: prog_dmabuf(): PLAYBACK rate=%d fmt=0x%x numfrag=%d "
-                       "fragsize=%d dmasize=%d\n",
-                           dmabuf->rate, dmabuf->fmt, dmabuf->numfrag,
-                           dmabuf->fragsize, dmabuf->dmasize) );
-
-               CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- \n"));
-               return 0;
-       } else {
-               CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: prog_dmabuf()- Invalid Type %d\n",
-                       dmabuf->type));
-       }
-       return 1;
-}
-
-static int prog_dmabuf(struct cs_state *state)
-{
-       int ret;
-       
-       mutex_lock(&state->sem);
-       ret = __prog_dmabuf(state);
-       mutex_unlock(&state->sem);
-       
-       return ret;
-}
-
-static void cs_clear_tail(struct cs_state *state)
-{
-}
-
-static int drain_dac(struct cs_state *state, int nonblock)
-{
-       DECLARE_WAITQUEUE(wait, current);
-       struct dmabuf *dmabuf = &state->dmabuf;
-       struct cs_card *card=state->card;
-       unsigned long flags;
-       unsigned long tmo;
-       int count;
-
-       CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()+ \n"));
-       if (dmabuf->mapped || !dmabuf->ready)
-       {
-               CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- 0, not ready\n"));
-               return 0;
-       }
-
-       add_wait_queue(&dmabuf->wait, &wait);
-       for (;;) {
-               /* It seems that we have to set the current state to TASK_INTERRUPTIBLE
-                  every time to make the process really go to sleep */
-               current->state = TASK_INTERRUPTIBLE;
-
-               spin_lock_irqsave(&state->card->lock, flags);
-               count = dmabuf->count;
-               spin_unlock_irqrestore(&state->card->lock, flags);
-
-               if (count <= 0)
-                       break;
-
-               if (signal_pending(current))
-                       break;
-
-               if (nonblock) {
-                       remove_wait_queue(&dmabuf->wait, &wait);
-                       current->state = TASK_RUNNING;
-                       return -EBUSY;
-               }
-
-               tmo = (dmabuf->dmasize * HZ) / dmabuf->rate;
-               tmo >>= sample_shift[dmabuf->fmt];
-               tmo += (2048*HZ)/dmabuf->rate;
-               
-               if (!schedule_timeout(tmo ? tmo : 1) && tmo){
-                       printk(KERN_ERR "cs46xx: drain_dac, dma timeout? %d\n", count);
-                       break;
-               }
-       }
-       remove_wait_queue(&dmabuf->wait, &wait);
-       current->state = TASK_RUNNING;
-       if (signal_pending(current)) {
-               CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- -ERESTARTSYS\n"));
-               /*
-               * set to silence and let that clear the fifos.
-               */
-               cs461x_clear_serial_FIFOs(card, CS_TYPE_DAC);
-               return -ERESTARTSYS;
-       }
-
-       CS_DBGOUT(CS_FUNCTION, 4, printk("cs46xx: drain_dac()- 0\n"));
-       return 0;
-}
-
-
-/* update buffer manangement pointers, especially, dmabuf->count and dmabuf->hwptr */
-static void cs_update_ptr(struct cs_card *card, int wake)
-{
-       struct cs_state *state;
-       struct dmabuf *dmabuf;
-       unsigned hwptr;
-       int diff;
-
-       /* error handling and process wake up for ADC */
-       state = card->states[0];
-       if (state) {
-               dmabuf = &state->dmabuf;
-               if (dmabuf->enable & ADC_RUNNING) {
-                       /* update hardware pointer */
-                       hwptr = cs_get_dma_addr(state);
-
-                       diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
-                       CS_DBGOUT(CS_PARMS, 9, printk(
-                               "cs46xx: cs_update_ptr()+ ADC hwptr=%d diff=%d\n", 
-                               hwptr,diff) );
-                       dmabuf->hwptr = hwptr;
-                       dmabuf->total_bytes += diff;
-                       dmabuf->count += diff;
-                       if (dmabuf->count > dmabuf->dmasize)
-                               dmabuf->count = dmabuf->dmasize;
-
-                       if (dmabuf->mapped) {
-                               if (wake && dmabuf->count >= (signed)dmabuf->fragsize)
-                                       wake_up(&dmabuf->wait);
-                       } else {
-                               if (wake && dmabuf->count > 0)
-                                       wake_up(&dmabuf->wait);
-                       }
-               }
-       }
-
-/*
- * Now the DAC
- */
-       state = card->states[1];
-       if (state) {
-               dmabuf = &state->dmabuf;
-               /* error handling and process wake up for DAC */
-               if (dmabuf->enable & DAC_RUNNING) {
-                       /* update hardware pointer */
-                       hwptr = cs_get_dma_addr(state);
-
-                       diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
-                       CS_DBGOUT(CS_PARMS, 9, printk(
-                               "cs46xx: cs_update_ptr()+ DAC hwptr=%d diff=%d\n", 
-                               hwptr,diff) );
-                       dmabuf->hwptr = hwptr;
-                       dmabuf->total_bytes += diff;
-                       if (dmabuf->mapped) {
-                               dmabuf->count += diff;
-                               if (wake && dmabuf->count >= (signed)dmabuf->fragsize)
-                                       wake_up(&dmabuf->wait);
-                               /*
-                                * other drivers use fragsize, but don't see any sense
-                                * in that, since dmasize is the buffer asked for
-                                * via mmap.
-                                */
-                               if (dmabuf->count > dmabuf->dmasize)
-                                       dmabuf->count &= dmabuf->dmasize-1;
-                       } else {
-                               dmabuf->count -= diff;
-                               /*
-                                * backfill with silence and clear out the last 
-                                * "diff" number of bytes.
-                                */
-                               if (hwptr >= diff) {
-                                       memset(dmabuf->rawbuf + hwptr - diff, 
-                                               (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80, diff);
-                               } else {
-                                       memset(dmabuf->rawbuf, 
-                                               (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80,
-                                               (unsigned)hwptr);
-                                       memset((char *)dmabuf->rawbuf + 
-                                                       dmabuf->dmasize + hwptr - diff,
-                                               (dmabuf->fmt & CS_FMT_16BIT) ? 0 : 0x80, 
-                                               diff - hwptr); 
-                               }
-
-                               if (dmabuf->count < 0 || dmabuf->count > dmabuf->dmasize) {
-                                       CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO
-                                         "cs46xx: ERROR DAC count<0 or count > dmasize (%d)\n",
-                                               dmabuf->count));
-                                       /* 
-                                       * buffer underrun or buffer overrun, reset the
-                                       * count of bytes written back to 0.
-                                       */
-                                       if (dmabuf->count < 0)
-                                               dmabuf->underrun = 1;
-                                       dmabuf->count = 0;
-                                       dmabuf->error++;
-                               }
-                               if (wake && dmabuf->count < (signed)dmabuf->dmasize / 2)
-                                       wake_up(&dmabuf->wait);
-                       }
-               }
-       }
-}
-
-
-/* hold spinlock for the following! */
-static void cs_handle_midi(struct cs_card *card)
-{
-        unsigned char ch;
-        int wake;
-        unsigned temp1;
-
-        wake = 0;
-        while (!(cs461x_peekBA0(card,  BA0_MIDSR) & MIDSR_RBE)) {
-                ch = cs461x_peekBA0(card, BA0_MIDRP);
-                if (card->midi.icnt < CS_MIDIINBUF) {
-                        card->midi.ibuf[card->midi.iwr] = ch;
-                        card->midi.iwr = (card->midi.iwr + 1) % CS_MIDIINBUF;
-                        card->midi.icnt++;
-                }
-                wake = 1;
-        }
-        if (wake)
-                wake_up(&card->midi.iwait);
-        wake = 0;
-        while (!(cs461x_peekBA0(card,  BA0_MIDSR) & MIDSR_TBF) && card->midi.ocnt > 0) {
-                temp1 = ( card->midi.obuf[card->midi.ord] ) & 0x000000ff;
-                cs461x_pokeBA0(card, BA0_MIDWP,temp1);
-                card->midi.ord = (card->midi.ord + 1) % CS_MIDIOUTBUF;
-                card->midi.ocnt--;
-                if (card->midi.ocnt < CS_MIDIOUTBUF-16)
-                        wake = 1;
-        }
-        if (wake)
-                wake_up(&card->midi.owait);
-}
-
-static irqreturn_t cs_interrupt(int irq, void *dev_id)
-{
-       struct cs_card *card = (struct cs_card *)dev_id;
-       /* Single channel card */
-       struct cs_state *recstate = card->channel[0].state;
-       struct cs_state *playstate = card->channel[1].state;
-       u32 status;
-
-       CS_DBGOUT(CS_INTERRUPT, 9, printk("cs46xx: cs_interrupt()+ \n"));
-
-       spin_lock(&card->lock);
-
-       status = cs461x_peekBA0(card, BA0_HISR);
-       
-       if ((status & 0x7fffffff) == 0) {
-               cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV);
-               spin_unlock(&card->lock);
-               return IRQ_HANDLED;     /* Might be IRQ_NONE.. */
-       }
-       
-       /*
-        * check for playback or capture interrupt only
-        */
-       if (((status & HISR_VC0) && playstate && playstate->dmabuf.ready) ||
-           (((status & HISR_VC1) && recstate && recstate->dmabuf.ready))) {
-               CS_DBGOUT(CS_INTERRUPT, 8, printk(
-                       "cs46xx: cs_interrupt() interrupt bit(s) set (0x%x)\n",status));
-               cs_update_ptr(card, CS_TRUE);
-       }
-
-        if (status & HISR_MIDI)
-                cs_handle_midi(card);
-       
-       /* clear 'em */
-       cs461x_pokeBA0(card, BA0_HICR, HICR_CHGM|HICR_IEV);
-       spin_unlock(&card->lock);
-       CS_DBGOUT(CS_INTERRUPT, 9, printk("cs46xx: cs_interrupt()- \n"));
-       return IRQ_HANDLED;
-}
-
-
-/**********************************************************************/
-
-static ssize_t cs_midi_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
-{
-        struct cs_card *card = file->private_data;
-        ssize_t ret;
-        unsigned long flags;
-        unsigned ptr;
-        int cnt;
-
-        if (!access_ok(VERIFY_WRITE, buffer, count))
-                return -EFAULT;
-        ret = 0;
-        while (count > 0) {
-                spin_lock_irqsave(&card->lock, flags);
-                ptr = card->midi.ird;
-                cnt = CS_MIDIINBUF - ptr;
-                if (card->midi.icnt < cnt)
-                        cnt = card->midi.icnt;
-                spin_unlock_irqrestore(&card->lock, flags);
-                if (cnt > count)
-                        cnt = count;
-                if (cnt <= 0) {
-                        if (file->f_flags & O_NONBLOCK)
-                                return ret ? ret : -EAGAIN;
-                        interruptible_sleep_on(&card->midi.iwait);
-                        if (signal_pending(current))
-                                return ret ? ret : -ERESTARTSYS;
-                        continue;
-                }
-                if (copy_to_user(buffer, card->midi.ibuf + ptr, cnt))
-                        return ret ? ret : -EFAULT;
-                ptr = (ptr + cnt) % CS_MIDIINBUF;
-                spin_lock_irqsave(&card->lock, flags);
-                card->midi.ird = ptr;
-                card->midi.icnt -= cnt;
-                spin_unlock_irqrestore(&card->lock, flags);
-                count -= cnt;
-                buffer += cnt;
-                ret += cnt;
-        }
-        return ret;
-}
-
-
-static ssize_t cs_midi_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
-{
-        struct cs_card *card = file->private_data;
-        ssize_t ret;
-        unsigned long flags;
-        unsigned ptr;
-        int cnt;
-
-        if (!access_ok(VERIFY_READ, buffer, count))
-                return -EFAULT;
-        ret = 0;
-        while (count > 0) {
-                spin_lock_irqsave(&card->lock, flags);
-                ptr = card->midi.owr;
-                cnt = CS_MIDIOUTBUF - ptr;
-                if (card->midi.ocnt + cnt > CS_MIDIOUTBUF)
-                        cnt = CS_MIDIOUTBUF - card->midi.ocnt;
-                if (cnt <= 0)
-                        cs_handle_midi(card);
-                spin_unlock_irqrestore(&card->lock, flags);
-                if (cnt > count)
-                        cnt = count;
-                if (cnt <= 0) {
-                        if (file->f_flags & O_NONBLOCK)
-                                return ret ? ret : -EAGAIN;
-                        interruptible_sleep_on(&card->midi.owait);
-                        if (signal_pending(current))
-                                return ret ? ret : -ERESTARTSYS;
-                        continue;
-                }
-                if (copy_from_user(card->midi.obuf + ptr, buffer, cnt))
-                        return ret ? ret : -EFAULT;
-                ptr = (ptr + cnt) % CS_MIDIOUTBUF;
-                spin_lock_irqsave(&card->lock, flags);
-                card->midi.owr = ptr;
-                card->midi.ocnt += cnt;
-                spin_unlock_irqrestore(&card->lock, flags);
-                count -= cnt;
-                buffer += cnt;
-                ret += cnt;
-                spin_lock_irqsave(&card->lock, flags);
-                cs_handle_midi(card);
-                spin_unlock_irqrestore(&card->lock, flags);
-        }
-        return ret;
-}
-
-
-static unsigned int cs_midi_poll(struct file *file, struct poll_table_struct *wait)
-{
-        struct cs_card *card = file->private_data;
-        unsigned long flags;
-        unsigned int mask = 0;
-
-        if (file->f_flags & FMODE_WRITE)
-                poll_wait(file, &card->midi.owait, wait);
-        if (file->f_flags & FMODE_READ)
-                poll_wait(file, &card->midi.iwait, wait);
-        spin_lock_irqsave(&card->lock, flags);
-        if (file->f_flags & FMODE_READ) {
-                if (card->midi.icnt > 0)
-                        mask |= POLLIN | POLLRDNORM;
-        }
-        if (file->f_flags & FMODE_WRITE) {
-                if (card->midi.ocnt < CS_MIDIOUTBUF)
-                        mask |= POLLOUT | POLLWRNORM;
-        }
-        spin_unlock_irqrestore(&card->lock, flags);
-        return mask;
-}
-
-
-static int cs_midi_open(struct inode *inode, struct file *file)
-{
-        unsigned int minor = iminor(inode);
-        struct cs_card *card = NULL;
-        unsigned long flags;
-       struct list_head *entry;
-
-       list_for_each(entry, &cs46xx_devs) {
-               card = list_entry(entry, struct cs_card, list);
-               if (card->dev_midi == minor)
-                       break;
-       }
-
-       if (entry == &cs46xx_devs)
-               return -ENODEV;
-       if (!card) {
-               CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
-                       "cs46xx: cs46xx_midi_open(): Error - unable to find card struct\n"));
-               return -ENODEV;
-       }
-
-        file->private_data = card;
-        /* wait for device to become free */
-        mutex_lock(&card->midi.open_mutex);
-        while (card->midi.open_mode & file->f_mode) {
-                if (file->f_flags & O_NONBLOCK) {
-                        mutex_unlock(&card->midi.open_mutex);
-                        return -EBUSY;
-                }
-                mutex_unlock(&card->midi.open_mutex);
-                interruptible_sleep_on(&card->midi.open_wait);
-                if (signal_pending(current))
-                        return -ERESTARTSYS;
-                mutex_lock(&card->midi.open_mutex);
-        }
-        spin_lock_irqsave(&card->midi.lock, flags);
-        if (!(card->midi.open_mode & (FMODE_READ | FMODE_WRITE))) {
-                card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
-                card->midi.ord = card->midi.owr = card->midi.ocnt = 0;
-                card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
-                cs461x_pokeBA0(card, BA0_MIDCR, 0x0000000f);            /* Enable xmit, rcv. */
-                cs461x_pokeBA0(card, BA0_HICR, HICR_IEV | HICR_CHGM);   /* Enable interrupts */
-        }
-        if (file->f_mode & FMODE_READ)
-                card->midi.ird = card->midi.iwr = card->midi.icnt = 0;
-        if (file->f_mode & FMODE_WRITE)
-                card->midi.ord = card->midi.owr = card->midi.ocnt = 0;
-        spin_unlock_irqrestore(&card->midi.lock, flags);
-        card->midi.open_mode |= (file->f_mode & (FMODE_READ | FMODE_WRITE));
-        mutex_unlock(&card->midi.open_mutex);
-        return 0;
-}
-
-
-static int cs_midi_release(struct inode *inode, struct file *file)
-{
-        struct cs_card *card = file->private_data;
-        DECLARE_WAITQUEUE(wait, current);
-        unsigned long flags;
-        unsigned count, tmo;
-
-        if (file->f_mode & FMODE_WRITE) {
-                current->state = TASK_INTERRUPTIBLE;
-                add_wait_queue(&card->midi.owait, &wait);
-                for (;;) {
-                        spin_lock_irqsave(&card->midi.lock, flags);
-                        count = card->midi.ocnt;
-                        spin_unlock_irqrestore(&card->midi.lock, flags);
-                        if (count <= 0)
-                                break;
-                        if (signal_pending(current))
-                                break;
-                        if (file->f_flags & O_NONBLOCK)
-                               break;
-                        tmo = (count * HZ) / 3100;
-                        if (!schedule_timeout(tmo ? : 1) && tmo)
-                                printk(KERN_DEBUG "cs46xx: midi timed out??\n");
-                }
-                remove_wait_queue(&card->midi.owait, &wait);
-                current->state = TASK_RUNNING;
-        }
-        mutex_lock(&card->midi.open_mutex);
-        card->midi.open_mode &= (~(file->f_mode & (FMODE_READ | FMODE_WRITE)));
-        mutex_unlock(&card->midi.open_mutex);
-        wake_up(&card->midi.open_wait);
-        return 0;
-}
-
-/*
- *   Midi file operations struct.
- */
-static /*const*/ struct file_operations cs_midi_fops = {
-       CS_OWNER        CS_THIS_MODULE
-       .llseek         = no_llseek,
-       .read           = cs_midi_read,
-       .write          = cs_midi_write,
-       .poll           = cs_midi_poll,
-       .open           = cs_midi_open,
-       .release        = cs_midi_release,
-};
-
-/*
- *
- * CopySamples copies 16-bit stereo signed samples from the source to the
- * destination, possibly converting down to unsigned 8-bit and/or mono.
- * count specifies the number of output bytes to write.
- *
- *  Arguments:
- *
- *  dst             - Pointer to a destination buffer.
- *  src             - Pointer to a source buffer
- *  count           - The number of bytes to copy into the destination buffer.
- *  fmt             - CS_FMT_16BIT and/or CS_FMT_STEREO bits
- *  dmabuf          - pointer to the dma buffer structure
- *
- * NOTES: only call this routine if the output desired is not 16 Signed Stereo
- *     
- *
- */
-static void CopySamples(char *dst, char *src, int count, unsigned fmt, 
-               struct dmabuf *dmabuf)
-{
-    s32 s32AudioSample;
-    s16 *psSrc = (s16 *)src;
-    s16 *psDst = (s16 *)dst;
-    u8 *pucDst = (u8 *)dst;
-
-    CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO "cs46xx: CopySamples()+ ") );
-    CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO
-       " dst=%p src=%p count=%d fmt=0x%x\n",
-       dst,src,count,fmt) );
-
-    /*
-     * See if the data should be output as 8-bit unsigned stereo.
-     */
-    if ((fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT)) {
-        /*
-         * Convert each 16-bit signed stereo sample to 8-bit unsigned 
-        * stereo using rounding.
-         */
-        psSrc = (s16 *)src;
-       count = count / 2;
-        while (count--)
-            *(pucDst++) = (u8)(((s16)(*psSrc++) + (s16)0x8000) >> 8);
-    }
-    /*
-     * See if the data should be output at 8-bit unsigned mono.
-     */
-    else if (!(fmt & CS_FMT_STEREO) && !(fmt & CS_FMT_16BIT)) {
-        /*
-         * Convert each 16-bit signed stereo sample to 8-bit unsigned 
-        * mono using averaging and rounding.
-         */
-        psSrc = (s16 *)src;
-       count = count / 2;
-        while (count--) {
-           s32AudioSample = ((*psSrc) + (*(psSrc + 1))) / 2 + (s32)0x80;
-           if (s32AudioSample > 0x7fff)
-               s32AudioSample = 0x7fff;
-            *(pucDst++) = (u8)(((s16)s32AudioSample + (s16)0x8000) >> 8);
-           psSrc += 2;
-        }
-    }
-    /*
-     * See if the data should be output at 16-bit signed mono.
-     */
-    else if (!(fmt & CS_FMT_STEREO) && (fmt & CS_FMT_16BIT)) {
-        /*
-         * Convert each 16-bit signed stereo sample to 16-bit signed 
-        * mono using averaging.
-         */
-        psSrc = (s16 *)src;
-       count = count / 2;
-        while (count--) {
-            *(psDst++) = (s16)((*psSrc) + (*(psSrc + 1))) / 2;
-           psSrc += 2;
-        }
-    }
-}
-
-/*
- * cs_copy_to_user()
- * replacement for the standard copy_to_user, to allow for a conversion from
- * 16 bit to 8 bit and from stereo to mono, if the record conversion is active.  
- * The current CS46xx/CS4280 static image only records in 16bit unsigned Stereo, 
- * so we convert from any of the other format combinations.
- */
-static unsigned cs_copy_to_user(
-       struct cs_state *s, 
-       void __user *dest, 
-       void *hwsrc, 
-       unsigned cnt, 
-       unsigned *copied)
-{
-       struct dmabuf *dmabuf = &s->dmabuf;
-       void *src = hwsrc;  /* default to the standard destination buffer addr */
-
-       CS_DBGOUT(CS_FUNCTION, 6, printk(KERN_INFO 
-               "cs_copy_to_user()+ fmt=0x%x cnt=%d dest=%p\n",
-               dmabuf->fmt,(unsigned)cnt,dest) );
-
-       if (cnt > dmabuf->dmasize)
-               cnt = dmabuf->dmasize;
-       if (!cnt) {
-               *copied = 0;
-               return 0;
-       }
-       if (dmabuf->divisor != 1) {
-               if (!dmabuf->tmpbuff) {
-                       *copied = cnt / dmabuf->divisor;
-                       return 0;
-               }
-
-               CopySamples((char *)dmabuf->tmpbuff, (char *)hwsrc, cnt, 
-                       dmabuf->fmt, dmabuf);
-               src = dmabuf->tmpbuff;
-               cnt = cnt/dmabuf->divisor;
-       }
-        if (copy_to_user(dest, src, cnt)) {
-               CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_ERR 
-                       "cs46xx: cs_copy_to_user()- fault dest=%p src=%p cnt=%d\n",
-                               dest,src,cnt));
-               *copied = 0;
-               return -EFAULT;
-       }
-       *copied = cnt;
-       CS_DBGOUT(CS_FUNCTION, 2, printk(KERN_INFO 
-               "cs46xx: cs_copy_to_user()- copied bytes is %d \n",cnt));
-       return 0;
-}
-
-/* in this loop, dmabuf.count signifies the amount of data that is waiting to be copied to
-   the user's buffer.  it is filled by the dma machine and drained by this loop. */
-static ssize_t cs_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
-{
-       struct cs_card *card = file->private_data;
-       struct cs_state *state;
-       DECLARE_WAITQUEUE(wait, current);
-       struct dmabuf *dmabuf;
-       ssize_t ret = 0;
-       unsigned long flags;
-       unsigned swptr;
-       int cnt;
-       unsigned copied = 0;
-
-       CS_DBGOUT(CS_WAVE_READ | CS_FUNCTION, 4, 
-               printk("cs46xx: cs_read()+ %zd\n",count) );
-       state = card->states[0];
-       if (!state)
-               return -ENODEV;
-       dmabuf = &state->dmabuf;
-
-       if (dmabuf->mapped)
-               return -ENXIO;
-       if (!access_ok(VERIFY_WRITE, buffer, count))
-               return -EFAULT;
-       
-       mutex_lock(&state->sem);
-       if (!dmabuf->ready && (ret = __prog_dmabuf(state)))
-               goto out2;
-
-       add_wait_queue(&state->dmabuf.wait, &wait);
-       while (count > 0) {
-               while (!(card->pm.flags & CS46XX_PM_IDLE)) {
-                       schedule();
-                       if (signal_pending(current)) {
-                               if (!ret)
-                                       ret = -ERESTARTSYS;
-                               goto out;
-                       }
-               }
-               spin_lock_irqsave(&state->card->lock, flags);
-               swptr = dmabuf->swptr;
-               cnt = dmabuf->dmasize - swptr;
-               if (dmabuf->count < cnt)
-                       cnt = dmabuf->count;
-               if (cnt <= 0)
-                       __set_current_state(TASK_INTERRUPTIBLE);
-               spin_unlock_irqrestore(&state->card->lock, flags);
-
-               if (cnt > (count * dmabuf->divisor))
-                       cnt = count * dmabuf->divisor;
-               if (cnt <= 0) {
-                       /* buffer is empty, start the dma machine and wait for data to be
-                          recorded */
-                       start_adc(state);
-                       if (file->f_flags & O_NONBLOCK) {
-                               if (!ret)
-                                       ret = -EAGAIN;
-                               goto out;
-                       }
-                       mutex_unlock(&state->sem);
-                       schedule();
-                       if (signal_pending(current)) {
-                               if (!ret)
-                                       ret = -ERESTARTSYS;
-                               goto out;
-                       }
-                       mutex_lock(&state->sem);
-                       if (dmabuf->mapped) {
-                               if (!ret)
-                                       ret = -ENXIO;
-                               goto out;
-                       }
-                       continue;
-               }
-
-               CS_DBGOUT(CS_WAVE_READ, 2, printk(KERN_INFO 
-                       "_read() copy_to cnt=%d count=%zd ", cnt,count) );
-               CS_DBGOUT(CS_WAVE_READ, 8, printk(KERN_INFO 
-                       " .dmasize=%d .count=%d buffer=%p ret=%zd\n",
-                       dmabuf->dmasize,dmabuf->count,buffer,ret));
-
-                if (cs_copy_to_user(state, buffer, 
-                       (char *)dmabuf->rawbuf + swptr, cnt, &copied)) {
-                       if (!ret)
-                               ret = -EFAULT;
-                       goto out;
-               }
-                swptr = (swptr + cnt) % dmabuf->dmasize;
-                spin_lock_irqsave(&card->lock, flags);
-                dmabuf->swptr = swptr;
-                dmabuf->count -= cnt;
-                spin_unlock_irqrestore(&card->lock, flags);
-                count -= copied;
-                buffer += copied;
-                ret += copied;
-                start_adc(state);
-       }
-out:
-       remove_wait_queue(&state->dmabuf.wait, &wait);
-out2:
-       mutex_unlock(&state->sem);
-       set_current_state(TASK_RUNNING);
-       CS_DBGOUT(CS_WAVE_READ | CS_FUNCTION, 4, 
-               printk("cs46xx: cs_read()- %zd\n",ret) );
-       return ret;
-}
-
-/* in this loop, dmabuf.count signifies the amount of data that is waiting to be dma to
-   the soundcard.  it is drained by the dma machine and filled by this loop. */
-static ssize_t cs_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
-{
-       struct cs_card *card = file->private_data;
-       struct cs_state *state;
-       DECLARE_WAITQUEUE(wait, current);
-       struct dmabuf *dmabuf;
-       ssize_t ret;
-       unsigned long flags;
-       unsigned swptr;
-       int cnt;
-
-       CS_DBGOUT(CS_WAVE_WRITE | CS_FUNCTION, 4,
-               printk("cs46xx: cs_write called, count = %zd\n", count) );
-       state = card->states[1];
-       if (!state)
-               return -ENODEV;
-       if (!access_ok(VERIFY_READ, buffer, count))
-               return -EFAULT;
-       dmabuf = &state->dmabuf;
-
-       mutex_lock(&state->sem);
-       if (dmabuf->mapped) {
-               ret = -ENXIO;
-               goto out;
-       }
-
-       if (!dmabuf->ready && (ret = __prog_dmabuf(state)))
-               goto out;
-       add_wait_queue(&state->dmabuf.wait, &wait);
-       ret = 0;
-/*
-* Start the loop to read from the user's buffer and write to the dma buffer.
-* check for PM events and underrun/overrun in the loop.
-*/
-       while (count > 0) {
-               while (!(card->pm.flags & CS46XX_PM_IDLE)) {
-                       schedule();
-                       if (signal_pending(current)) {
-                               if (!ret)
-                                       ret = -ERESTARTSYS;
-                               goto out;
-                       }
-               }
-               spin_lock_irqsave(&state->card->lock, flags);
-               if (dmabuf->count < 0) {
-                       /* buffer underrun, we are recovering from sleep_on_timeout,
-                          resync hwptr and swptr */
-                       dmabuf->count = 0;
-                       dmabuf->swptr = dmabuf->hwptr;
-               }
-               if (dmabuf->underrun) {
-                       dmabuf->underrun = 0;
-                       dmabuf->hwptr = cs_get_dma_addr(state);
-                       dmabuf->swptr = dmabuf->hwptr;
-               }
-
-               swptr = dmabuf->swptr;
-               cnt = dmabuf->dmasize - swptr;
-               if (dmabuf->count + cnt > dmabuf->dmasize)
-                       cnt = dmabuf->dmasize - dmabuf->count;
-               if (cnt <= 0)
-                       __set_current_state(TASK_INTERRUPTIBLE);
-               spin_unlock_irqrestore(&state->card->lock, flags);
-
-               if (cnt > count)
-                       cnt = count;
-               if (cnt <= 0) {
-                       /* buffer is full, start the dma machine and wait for data to be
-                          played */
-                       start_dac(state);
-                       if (file->f_flags & O_NONBLOCK) {
-                               if (!ret)
-                                       ret = -EAGAIN;
-                               goto out;
-                       }
-                       mutex_unlock(&state->sem);
-                       schedule();
-                       if (signal_pending(current)) {
-                               if (!ret)
-                                       ret = -ERESTARTSYS;
-                               goto out;
-                       }
-                       mutex_lock(&state->sem);
-                       if (dmabuf->mapped) {
-                               if (!ret)
-                                       ret = -ENXIO;
-                               goto out;
-                       }
-                       continue;
-               }
-               if (copy_from_user(dmabuf->rawbuf + swptr, buffer, cnt)) {
-                       if (!ret)
-                               ret = -EFAULT;
-                       goto out;
-               }
-               spin_lock_irqsave(&state->card->lock, flags);
-               swptr = (swptr + cnt) % dmabuf->dmasize;
-               dmabuf->swptr = swptr;
-               dmabuf->count += cnt;
-               if (dmabuf->count > dmabuf->dmasize) {
-                       CS_DBGOUT(CS_WAVE_WRITE | CS_ERROR, 2, printk(
-                           "cs46xx: cs_write() d->count > dmasize - resetting\n"));
-                       dmabuf->count = dmabuf->dmasize;
-               }
-               dmabuf->endcleared = 0;
-               spin_unlock_irqrestore(&state->card->lock, flags);
-
-               count -= cnt;
-               buffer += cnt;
-               ret += cnt;
-               start_dac(state);
-       }
-out:
-       mutex_unlock(&state->sem);
-       remove_wait_queue(&state->dmabuf.wait, &wait);
-       set_current_state(TASK_RUNNING);
-
-       CS_DBGOUT(CS_WAVE_WRITE | CS_FUNCTION, 2, 
-               printk("cs46xx: cs_write()- ret=%zd\n", ret));
-       return ret;
-}
-
-static unsigned int cs_poll(struct file *file, struct poll_table_struct *wait)
-{
-       struct cs_card *card = file->private_data;
-       struct dmabuf *dmabuf;
-       struct cs_state *state;
-       unsigned long flags;
-       unsigned int mask = 0;
-
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_poll()+ \n"));
-       if (!(file->f_mode & (FMODE_WRITE | FMODE_READ))) {
-               return -EINVAL;
-       }
-       if (file->f_mode & FMODE_WRITE) {
-               state = card->states[1];
-               if (state) {
-                       dmabuf = &state->dmabuf;
-                       poll_wait(file, &dmabuf->wait, wait);
-               }
-       }
-       if (file->f_mode & FMODE_READ) {
-               state = card->states[0];
-               if (state) {
-                       dmabuf = &state->dmabuf;
-                       poll_wait(file, &dmabuf->wait, wait);
-               }
-       }
-
-       spin_lock_irqsave(&card->lock, flags);
-       cs_update_ptr(card, CS_FALSE);
-       if (file->f_mode & FMODE_READ) {
-               state = card->states[0];
-               if (state) {
-                       dmabuf = &state->dmabuf;
-                       if (dmabuf->count >= (signed)dmabuf->fragsize)
-                               mask |= POLLIN | POLLRDNORM;
-               }
-       }
-       if (file->f_mode & FMODE_WRITE) {
-               state = card->states[1];
-               if (state) {
-                       dmabuf = &state->dmabuf;
-                       if (dmabuf->mapped) {
-                               if (dmabuf->count >= (signed)dmabuf->fragsize)
-                                   mask |= POLLOUT | POLLWRNORM;
-                       } else {
-                               if ((signed)dmabuf->dmasize >= dmabuf->count 
-                                       + (signed)dmabuf->fragsize)
-                                   mask |= POLLOUT | POLLWRNORM;
-                       }
-               }
-       }
-       spin_unlock_irqrestore(&card->lock, flags);
-
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_poll()- (0x%x) \n",
-               mask));
-       return mask;
-}
-
-/*
- *     We let users mmap the ring buffer. Its not the real DMA buffer but
- *     that side of the code is hidden in the IRQ handling. We do a software
- *     emulation of DMA from a 64K or so buffer into a 2K FIFO. 
- *     (the hardware probably deserves a moan here but Crystal send me nice
- *     toys ;)).
- */
-static int cs_mmap(struct file *file, struct vm_area_struct *vma)
-{
-       struct cs_card *card = file->private_data;
-       struct cs_state *state;
-       struct dmabuf *dmabuf;
-       int ret = 0;
-       unsigned long size;
-
-       CS_DBGOUT(CS_FUNCTION | CS_PARMS, 2, printk("cs46xx: cs_mmap()+ file=%p %s %s\n", 
-               file, vma->vm_flags & VM_WRITE ? "VM_WRITE" : "",
-               vma->vm_flags & VM_READ ? "VM_READ" : "") );
-
-       if (vma->vm_flags & VM_WRITE) {
-               state = card->states[1];
-               if (state) {
-                       CS_DBGOUT(CS_OPEN, 2, printk(
-                         "cs46xx: cs_mmap() VM_WRITE - state TRUE prog_dmabuf DAC\n") );
-                       if ((ret = prog_dmabuf(state)) != 0)
-                               return ret;
-               }
-       } else if (vma->vm_flags & VM_READ) {
-               state = card->states[0];
-               if (state) {
-                       CS_DBGOUT(CS_OPEN, 2, printk(
-                         "cs46xx: cs_mmap() VM_READ - state TRUE prog_dmabuf ADC\n") );
-                       if ((ret = prog_dmabuf(state)) != 0)
-                               return ret;
-               }
-       } else {
-               CS_DBGOUT(CS_ERROR, 2, printk(
-                 "cs46xx: cs_mmap() return -EINVAL\n") );
-               return -EINVAL;
-       }
-
-/*
- * For now ONLY support playback, but seems like the only way to use
- * mmap() is to open an FD with RDWR, just read or just write access
- * does not function, get an error back from the kernel.
- * Also, QuakeIII opens with RDWR!  So, there must be something
- * to needing read/write access mapping.  So, allow read/write but 
- * use the DAC only.
- */
-       state = card->states[1];  
-       if (!state) {
-               ret = -EINVAL;
-               goto out;
-       }
-
-       mutex_lock(&state->sem);
-       dmabuf = &state->dmabuf;
-       if (cs4x_pgoff(vma) != 0) {
-               ret = -EINVAL;
-               goto out;
-       }
-       size = vma->vm_end - vma->vm_start;
-
-       CS_DBGOUT(CS_PARMS, 2, printk("cs46xx: cs_mmap(): size=%d\n",(unsigned)size) );
-
-       if (size > (PAGE_SIZE << dmabuf->buforder)) {
-               ret = -EINVAL;
-               goto out;
-       }
-       if (remap_pfn_range(vma, vma->vm_start,
-                            virt_to_phys(dmabuf->rawbuf) >> PAGE_SHIFT,
-                            size, vma->vm_page_prot)) {
-               ret = -EAGAIN;
-               goto out;
-       }
-       dmabuf->mapped = 1;
-
-       CS_DBGOUT(CS_FUNCTION, 2, printk("cs46xx: cs_mmap()-\n") );
-out:
-       mutex_unlock(&state->sem);
-       return ret;     
-}
-
-static int cs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
-{
-       struct cs_card *card = file->private_data;
-       struct cs_state *state;
-       struct dmabuf *dmabuf = NULL;
-       unsigned long flags;
-       audio_buf_info abinfo;
-       count_info cinfo;
-       int val, valsave, ret;
-       int mapped = 0;
-       void __user *argp = (void __user *)arg;
-       int __user *p = argp;
-
-       state = card->states[0];
-       if (state) {
-               dmabuf = &state->dmabuf;
-               mapped = (file->f_mode & FMODE_READ) && dmabuf->mapped;
-       }
-       state = card->states[1];
-       if (state) {
-               dmabuf = &state->dmabuf;
-               mapped |= (file->f_mode & FMODE_WRITE) && dmabuf->mapped;
-       }
-               
-#if CSDEBUG
-       printioctl(cmd);
-#endif
-
-       switch (cmd) {
-       case OSS_GETVERSION:
-               return put_user(SOUND_VERSION, p);
-       case SNDCTL_DSP_RESET:
-               /* FIXME: spin_lock ? */
-               if (file->f_mode & FMODE_WRITE) {
-                       state = card->states[1];
-                       if (state) {
-                               dmabuf = &state->dmabuf;
-                               stop_dac(state);
-                               synchronize_irq(card->irq);
-                               dmabuf->ready = 0;
-                               resync_dma_ptrs(state);
-                               dmabuf->swptr = dmabuf->hwptr = 0;
-                               dmabuf->count = dmabuf->total_bytes = 0;
-                               dmabuf->blocks = 0;
-                               dmabuf->SGok = 0;
-                       }
-               }
-               if (file->f_mode & FMODE_READ) {
-                       state = card->states[0];
-                       if (state) {
-                               dmabuf = &state->dmabuf;
-                               stop_adc(state);
-                               synchronize_irq(card->irq);
-                               resync_dma_ptrs(state);
-                               dmabuf->ready = 0;
-                               dmabuf->swptr = dmabuf->hwptr = 0;
-                               dmabuf->count = dmabuf->total_bytes = 0;
-                               dmabuf->blocks = 0;
-                               dmabuf->SGok = 0;
-                       }
-               }
-               CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_RESET()-\n") );
-               return 0;
-       case SNDCTL_DSP_SYNC:
-               if (file->f_mode & FMODE_WRITE)
-                       return drain_dac(state, file->f_flags & O_NONBLOCK);
-               return 0;
-       case SNDCTL_DSP_SPEED: /* set sample rate */
-               if (get_user(val, p))
-                       return -EFAULT;
-               if (val >= 0) {
-                       if (file->f_mode & FMODE_READ) {
-                               state = card->states[0];
-                               if (state) {
-                                       dmabuf = &state->dmabuf;
-                                       stop_adc(state);
-                                       dmabuf->ready = 0;
-                                       dmabuf->SGok = 0;
-                                       cs_set_adc_rate(state, val);
-                                       cs_set_divisor(dmabuf);
-                               }
-                       }
-                       if (file->f_mode & FMODE_WRITE) {
-                               state = card->states[1];
-                               if (state) {
-                                       dmabuf = &state->dmabuf;
-                                       stop_dac(state);
-                                       dmabuf->ready = 0;
-                                       dmabuf->SGok = 0;
-                                       cs_set_dac_rate(state, val);
-                                       cs_set_divisor(dmabuf);
-                               }
-                       }
-                       CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
-                           "cs46xx: cs_ioctl() DSP_SPEED %s %s %d\n",
-                               file->f_mode & FMODE_WRITE ? "DAC" : "",
-                               file->f_mode & FMODE_READ ? "ADC" : "",
-                               dmabuf->rate ) );
-                       return put_user(dmabuf->rate, p);
-               }
-               return put_user(0, p);
-       case SNDCTL_DSP_STEREO: /* set stereo or mono channel */
-               if (get_user(val, p))
-                       return -EFAULT;
-               if (file->f_mode & FMODE_WRITE) {
-                       state = card->states[1];
-                       if (state) {
-                               dmabuf = &state->dmabuf;
-                               stop_dac(state);
-                               dmabuf->ready = 0;
-                               dmabuf->SGok = 0;
-                               if (val)
-                                       dmabuf->fmt |= CS_FMT_STEREO;
-                               else
-                                       dmabuf->fmt &= ~CS_FMT_STEREO;
-                               cs_set_divisor(dmabuf);
-                               CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
-                                   "cs46xx: DSP_STEREO() DAC %s\n",
-                                   (dmabuf->fmt & CS_FMT_STEREO) ?
-                                       "STEREO":"MONO") );
-                       }
-               }
-               if (file->f_mode & FMODE_READ) {
-                       state = card->states[0];
-                       if (state) {
-                               dmabuf = &state->dmabuf;
-                               stop_adc(state);
-                               dmabuf->ready = 0;
-                               dmabuf->SGok = 0;
-                               if (val)
-                                       dmabuf->fmt |= CS_FMT_STEREO;
-                               else
-                                       dmabuf->fmt &= ~CS_FMT_STEREO;
-                               cs_set_divisor(dmabuf);
-                               CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
-                                   "cs46xx: DSP_STEREO() ADC %s\n",
-                                   (dmabuf->fmt & CS_FMT_STEREO) ?
-                                       "STEREO":"MONO") );
-                       }
-               }
-               return 0;
-       case SNDCTL_DSP_GETBLKSIZE:
-               if (file->f_mode & FMODE_WRITE) {
-                       state = card->states[1];
-                       if (state) {
-                               dmabuf = &state->dmabuf;
-                               if ((val = prog_dmabuf(state)))
-                                       return val;
-                               return put_user(dmabuf->fragsize, p);
-                       }
-               }
-               if (file->f_mode & FMODE_READ) {
-                       state = card->states[0];
-                       if (state) {
-                               dmabuf = &state->dmabuf;
-                               if ((val = prog_dmabuf(state)))
-                                       return val;
-                               return put_user(dmabuf->fragsize/dmabuf->divisor, 
-                                               p);
-                       }
-               }
-               return put_user(0, p);
-       case SNDCTL_DSP_GETFMTS: /* Returns a mask of supported sample format*/
-               return put_user(AFMT_S16_LE | AFMT_U8, p);
-       case SNDCTL_DSP_SETFMT: /* Select sample format */
-               if (get_user(val, p))
-                       return -EFAULT;
-               CS_DBGOUT(CS_IOCTL | CS_PARMS, 4, printk(
-                   "cs46xx: cs_ioctl() DSP_SETFMT %s %s %s %s\n",
-                       file->f_mode & FMODE_WRITE ? "DAC" : "",
-                       file->f_mode & FMODE_READ ? "ADC" : "",
-                       val == AFMT_S16_LE ? "16Bit Signed" : "",
-                       val == AFMT_U8 ? "8Bit Unsigned" : "") );
-               valsave = val;
-               if (val != AFMT_QUERY) {
-                       if (val==AFMT_S16_LE || val==AFMT_U8) {
-                               if (file->f_mode & FMODE_WRITE) {
-                                       state = card->states[1];
-                                       if (state) {
-                                               dmabuf = &state->dmabuf;
-                                               stop_dac(state);
-                                               dmabuf->ready = 0;
-                                               dmabuf->SGok = 0;
-                                               if (val == AFMT_S16_LE)
-                                                       dmabuf->fmt |= CS_FMT_16BIT;
-                                               else
-                                                       dmabuf->fmt &= ~CS_FMT_16BIT;
-                                               cs_set_divisor(dmabuf);
-                                               if ((ret = prog_dmabuf(state)))
-                                                       return ret;
-                                       }
-                               }
-                               if (file->f_mode & FMODE_READ) {
-                                       val = valsave;
-                                       state = card->states[0];
-                                       if (state) {
-                                               dmabuf = &state->dmabuf;
-                                               stop_adc(state);
-                                               dmabuf->ready = 0;
-                                               dmabuf->SGok = 0;
-                                               if (val == AFMT_S16_LE)
-                                                       dmabuf->fmt |= CS_FMT_16BIT;
-                                               else
-                                                       dmabuf->fmt &= ~CS_FMT_16BIT;
-                                               cs_set_divisor(dmabuf);
-                                               if ((ret = prog_dmabuf(state)))
-                                                       return ret;
-                                       }
-                               }
-                       } else {
-                               CS_DBGOUT(CS_IOCTL | CS_ERROR, 2, printk(
-                                   "cs46xx: DSP_SETFMT() Unsupported format (0x%x)\n",
-                                       valsave) );
-                       }
-               } else {
-                       if (file->f_mode & FMODE_WRITE) {
-                               state = card->states[1];
-                               if (state)
-                                       dmabuf = &state->dmabuf;
-                       } else if (file->f_mode & FMODE_READ) {
-                               state = card->states[0];
-                               if (state)
-                                       dmabuf = &state->dmabuf;
-                       }
-               }
-               if (dmabuf) {
-                       if (dmabuf->fmt & CS_FMT_16BIT)
-                               return put_user(AFMT_S16_LE, p);
-                       else
-                               return put_user(AFMT_U8, p);
-               }
-               return put_user(0, p);
-       case SNDCTL_DSP_CHANNELS:
-               if (get_user(val, p))
-                       return -EFAULT;
-               if (val != 0) {
-                       if (file->f_mode & FMODE_WRITE) {
-                               state = card->states[1];
-                               if (state) {
-                                       dmabuf = &state->dmabuf;
-                                       stop_dac(state);
-                                       dmabuf->ready = 0;
-                                       dmabuf->SGok = 0;
-                                       if (val > 1)
-                                               dmabuf->fmt |= CS_FMT_STEREO;
-                                       else
-                                               dmabuf->fmt &= ~CS_FMT_STEREO;
-                                       cs_set_divisor(dmabuf);
-                                       if (prog_dmabuf(state))
-                                               return 0;
-                               }
-                       }
-                       if (file->f_mode & FMODE_READ) {
-                               state = card->states[0];
-                               if (state) {
-                                       dmabuf = &state->dmabuf;
-                                       stop_adc(state);
-                                       dmabuf->ready = 0;
-                                       dmabuf->SGok = 0;
-                                       if (val > 1)
-                                               dmabuf->fmt |= CS_FMT_STEREO;
-                                       else
-                                               dmabuf->fmt &= ~CS_FMT_STEREO;
-                                       cs_set_divisor(dmabuf);
-                                       if (prog_dmabuf(state))
-                                               return 0;
-                               }
-                       }
-               }
-               return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1,
-                               p);
-       case SNDCTL_DSP_POST:
-               /*
-                * There will be a longer than normal pause in the data.
-                * so... do nothing, because there is nothing that we can do.
-                */
-               return 0;
-       case SNDCTL_DSP_SUBDIVIDE:
-               if (file->f_mode & FMODE_WRITE) {
-                       state = card->states[1];
-                       if (state) {
-                               dmabuf = &state->dmabuf;
-                               if (dmabuf->subdivision)
-                                       return -EINVAL;
-                               if (get_user(val, p))
-                                       return -EFAULT;
-                               if (val != 1 && val != 2)
-                                       return -EINVAL;
-                               dmabuf->subdivision = val;
-                       }
-               }
-               if (file->f_mode & FMODE_READ) {
-                       state = card->states[0];
-                       if (state) {
-                               dmabuf = &state->dmabuf;
-                               if (dmabuf->subdivision)
-                                       return -EINVAL;
-                               if (get_user(val, p))
-                                       return -EFAULT;
-                               if (val != 1 && val != 2)
-                                       return -EINVAL;
-                               dmabuf->subdivision = val;
-                       }
-               }
-               return 0;
-       case SNDCTL_DSP_SETFRAGMENT:
-               if (get_user(val, p))
-                       return -EFAULT;
-               if (file->f_mode & FMODE_WRITE) {
-                       state = card->states[1];
-                       if (state) {
-                               dmabuf = &state->dmabuf;
-                               dmabuf->ossfragshift = val & 0xffff;
-                               dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
-                       }
-               }
-               if (file->f_mode & FMODE_READ) {
-                       state = card->states[0];
-                       if (state) {
-                               dmabuf = &state->dmabuf;
-                               dmabuf->ossfragshift = val & 0xffff;
-                               dmabuf->ossmaxfrags = (val >> 16) & 0xffff;
-                       }
-               }
-               return 0;
-       case SNDCTL_DSP_GETOSPACE:
-               if (!(file->f_mode & FMODE_WRITE))
-                       return -EINVAL;
-               state = card->states[1];
-               if (state) {
-                       dmabuf = &state->dmabuf;
-                       spin_lock_irqsave(&state->card->lock, flags);
-                       cs_update_ptr(card, CS_TRUE);
-                       abinfo.fragsize = dmabuf->fragsize;
-                       abinfo.fragstotal = dmabuf->numfrag;
-               /*
-                * for mmap we always have total space available
-                */
-                       if (dmabuf->mapped)
-                               abinfo.bytes = dmabuf->dmasize;
-                       else
-                               abinfo.bytes = dmabuf->dmasize - dmabuf->count;
-
-                       abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
-                       spin_unlock_irqrestore(&state->card->lock, flags);
-                       return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
-               }
-               return -ENODEV;
-       case SNDCTL_DSP_GETISPACE:
-               if (!(file->f_mode & FMODE_READ))
-                       return -EINVAL;
-               state = card->states[0];
-               if (state) {
-                       dmabuf = &state->dmabuf;
-                       spin_lock_irqsave(&state->card->lock, flags);
-                       cs_update_ptr(card, CS_TRUE);
-                       abinfo.fragsize = dmabuf->fragsize/dmabuf->divisor;
-                       abinfo.bytes = dmabuf->count/dmabuf->divisor;
-                       abinfo.fragstotal = dmabuf->numfrag;
-                       abinfo.fragments = abinfo.bytes >> dmabuf->fragshift;
-                       spin_unlock_irqrestore(&state->card->lock, flags);
-                       return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
-               }
-               return -ENODEV;
-       case SNDCTL_DSP_NONBLOCK:
-               file->f_flags |= O_NONBLOCK;
-               return 0;
-       case SNDCTL_DSP_GETCAPS:
-               return put_user(DSP_CAP_REALTIME|DSP_CAP_TRIGGER|DSP_CAP_MMAP,
-                           p);
-       case SNDCTL_DSP_GETTRIGGER:
-               val = 0;
-               CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()+\n") );
-               if (file->f_mode & FMODE_WRITE) {
-                       state = card->states[1];
-                       if (state) {
-                               dmabuf = &state->dmabuf;
-                               if (dmabuf->enable & DAC_RUNNING)
-                                       val |= PCM_ENABLE_INPUT;
-                       }
-               }
-               if (file->f_mode & FMODE_READ) {
-                       if (state) {
-                               state = card->states[0];
-                               dmabuf = &state->dmabuf;
-                               if (dmabuf->enable & ADC_RUNNING)
-                                       val |= PCM_ENABLE_OUTPUT;
-                       }
-               }
-               CS_DBGOUT(CS_IOCTL, 2, printk("cs46xx: DSP_GETTRIGGER()- val=0x%x\n",val) );
-               return put_user(val, p);
-       case SNDCTL_DSP_SETTRIGGER:
-               if (get_user(val, p))
-                       return -EFAULT;
-               if (file->f_mode & FMODE_READ) {
-                       state = card->states[0];
-                       if (state) {
-                               dmabuf = &state->dmabuf;
-                               if (val & PCM_ENABLE_INPUT) {
-                                       if (!dmabuf->ready && (ret = prog_dmabuf(state)))
-                                               return ret;
-                                       start_adc(state);
-                               } else
-                                       stop_adc(state);
-                       }
-               }
-               if (file->f_mode & FMODE_WRITE) {
-                       state = card->states[1];
-                       if (state) {
-                               dmabuf = &state->dmabuf;
-                               if (val & PCM_ENABLE_OUTPUT) {
-                                       if (!dmabuf->ready && (ret = prog_dmabuf(state)))
-                                               return ret;
-                                       start_dac(state);
-                               } else
-                                       stop_dac(state);
-                       }
-               }
-               return 0;
-       case SNDCTL_DSP_GETIPTR:
-               if (!(file->f_mode & FMODE_READ))
-                       return -EINVAL;
-               state = card->states[0];
-               if (state) {
-                       dmabuf = &state->dmabuf;
-                       spin_lock_irqsave(&state->card->lock, flags);
-                       cs_update_ptr(card, CS_TRUE);
-                       cinfo.bytes = dmabuf->total_bytes/dmabuf->divisor;
-                       cinfo.blocks = dmabuf->count/dmabuf->divisor >> dmabuf->fragshift;
-                       cinfo.ptr = dmabuf->hwptr/dmabuf->divisor;
-                       spin_unlock_irqrestore(&state->card->lock, flags);
-                       if (copy_to_user(argp, &cinfo, sizeof(cinfo)))
-                               return -EFAULT;
-                       return 0;
-               }
-               return -ENODEV;
-       case SNDCTL_DSP_GETOPTR:
-               if (!(file->f_mode & FMODE_WRITE))
-                       return -EINVAL;
-               state = card->states[1];
-               if (state) {
-                       dmabuf = &state->dmabuf;
-                       spin_lock_irqsave(&state->card->lock, flags);
-                       cs_update_ptr(card, CS_TRUE);
-                       cinfo.bytes = dmabuf->total_bytes;
-                       if (dmabuf->mapped) {
-                               cinfo.blocks = (cinfo.bytes >> dmabuf->fragshift) 
-                                                       - dmabuf->blocks;
-                               CS_DBGOUT(CS_PARMS, 8, 
-                                       printk("total_bytes=%d blocks=%d dmabuf->blocks=%d\n", 
-                                       cinfo.bytes,cinfo.blocks,dmabuf->blocks) );
-                               dmabuf->blocks = cinfo.bytes >> dmabuf->fragshift;
-                       } else {
-                               cinfo.blocks = dmabuf->count >> dmabuf->fragshift;
-                       }
-                       cinfo.ptr = dmabuf->hwptr;
-
-                       CS_DBGOUT(CS_PARMS, 4, printk(
-                           "cs46xx: GETOPTR bytes=%d blocks=%d ptr=%d\n",
-                               cinfo.bytes,cinfo.blocks,cinfo.ptr) );
-                       spin_unlock_irqrestore(&state->card->lock, flags);
-                       if (copy_to_user(argp, &cinfo, sizeof(cinfo)))
-                               return -EFAULT;
-                       return 0;
-               }
-               return -ENODEV;
-       case SNDCTL_DSP_SETDUPLEX:
-               return 0;
-       case SNDCTL_DSP_GETODELAY:
-               if (!(file->f_mode & FMODE_WRITE))
-                       return -EINVAL;
-               state = card->states[1];
-               if (state) {
-                       dmabuf = &state->dmabuf;
-                       spin_lock_irqsave(&state->card->lock, flags);
-                       cs_update_ptr(card, CS_TRUE);
-                       val = dmabuf->count;
-                       spin_unlock_irqrestore(&state->card->lock, flags);
-               } else
-                       val = 0;
-               return put_user(val, p);
-       case SOUND_PCM_READ_RATE:
-               if (file->f_mode & FMODE_READ)
-                       state = card->states[0];
-               else 
-                       state = card->states[1];
-               if (state) {
-                       dmabuf = &state->dmabuf;
-                       return put_user(dmabuf->rate, p);
-               }
-               return put_user(0, p);
-       case SOUND_PCM_READ_CHANNELS:
-               if (file->f_mode & FMODE_READ)
-                       state = card->states[0];
-               else 
-                       state = card->states[1];
-               if (state) {
-                       dmabuf = &state->dmabuf;
-                       return put_user((dmabuf->fmt & CS_FMT_STEREO) ? 2 : 1,
-                               p);
-               }
-               return put_user(0, p);
-       case SOUND_PCM_READ_BITS:
-               if (file->f_mode & FMODE_READ)
-                       state = card->states[0];
-               else 
-                       state = card->states[1];
-               if (state) {
-                       dmabuf = &state->dmabuf;
-                       return put_user((dmabuf->fmt & CS_FMT_16BIT) ? 
-                               AFMT_S16_LE : AFMT_U8, p);
-
-               }
-               return put_user(0, p);
-       case SNDCTL_DSP_MAPINBUF:
-       case SNDCTL_DSP_MAPOUTBUF:
-       case SNDCTL_DSP_SETSYNCRO:
-       case SOUND_PCM_WRITE_FILTER:
-       case SOUND_PCM_READ_FILTER:
-               return -EINVAL;
-       }
-       return -EINVAL;
-}
-
-
-/*
- *     AMP control - null AMP
- */
-static void amp_none(struct cs_card *card, int change)
-{      
-}
-
-/*
- *     Crystal EAPD mode
- */
-static void amp_voyetra(struct cs_card *card, int change)
-{
-       /* Manage the EAPD bit on the Crystal 4297 
-          and the Analog AD1885 */
-          
-       int old = card->amplifier;
-       
-       card->amplifier+=change;
-       if (card->amplifier && !old) {
-               /* Turn the EAPD amp on */
-               cs_ac97_set(card->ac97_codec[0],  AC97_POWER_CONTROL, 
-                       cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) |
-                               0x8000);
-       } else if(old && !card->amplifier) {
-               /* Turn the EAPD amp off */
-               cs_ac97_set(card->ac97_codec[0],  AC97_POWER_CONTROL, 
-                       cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) &
-                               ~0x8000);
-       }
-}
-
-                      
-/*
- *     Game Theatre XP card - EGPIO[2] is used to enable the external amp.
- */
-static void amp_hercules(struct cs_card *card, int change)
-{
-       int old = card->amplifier;
-       if (!card) {
-               CS_DBGOUT(CS_ERROR, 2, printk(KERN_INFO 
-                       "cs46xx: amp_hercules() called before initialized.\n"));
-               return;
-       }
-       card->amplifier+=change;
-       if ((card->amplifier && !old) && !(hercules_egpio_disable)) {
-               CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO 
-                       "cs46xx: amp_hercules() external amp enabled\n"));
-               cs461x_pokeBA0(card, BA0_EGPIODR, 
-                       EGPIODR_GPOE2);     /* enable EGPIO2 output */
-               cs461x_pokeBA0(card, BA0_EGPIOPTR, 
-                       EGPIOPTR_GPPT2);   /* open-drain on output */
-       } else if (old && !card->amplifier) {
-               CS_DBGOUT(CS_PARMS, 4, printk(KERN_INFO 
-                       "cs46xx: amp_hercules() external amp disabled\n"));
-               cs461x_pokeBA0(card, BA0_EGPIODR, 0); /* disable */
-               cs461x_pokeBA0(card, BA0_EGPIOPTR, 0); /* disable */
-       }
-}
-
-/*
- *     Handle the CLKRUN on a thinkpad. We must disable CLKRUN support
- *     whenever we need to beat on the chip.
- *
- *     The original idea and code for this hack comes from David Kaiser at
- *     Linuxcare. Perhaps one day Crystal will document their chips well
- *     enough to make them useful.
- */
-static void clkrun_hack(struct cs_card *card, int change)
-{
-       struct pci_dev *acpi_dev;
-       u16 control;
-       u8 pp;
-       unsigned long port;
-       int old = card->active;
-       
-       card->active+=change;
-       
-       acpi_dev = pci_get_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, NULL);
-       if (acpi_dev == NULL)
-               return;         /* Not a thinkpad thats for sure */
-
-       /* Find the control port */             
-       pci_read_config_byte(acpi_dev, 0x41, &pp);
-       port = pp << 8;
-
-       /* Read ACPI port */    
-       control = inw(port + 0x10);
-
-       /* Flip CLKRUN off while running */
-       if (!card->active && old) {
-               CS_DBGOUT(CS_PARMS , 9, printk( KERN_INFO
-                       "cs46xx: clkrun() enable clkrun - change=%d active=%d\n",
-                               change,card->active));
-               outw(control|0x2000, port+0x10);
-       } else {
-       /*
-       * sometimes on a resume the bit is set, so always reset the bit.
-       */
-               CS_DBGOUT(CS_PARMS , 9, printk( KERN_INFO
-                       "cs46xx: clkrun() disable clkrun - change=%d active=%d\n",
-                               change,card->active));
-               outw(control&~0x2000, port+0x10);
-       }
-       pci_dev_put(acpi_dev);
-}
-
-       
-static int cs_open(struct inode *inode, struct file *file)
-{
-       struct cs_card *card = file->private_data;
-       struct cs_state *state = NULL;
-       struct dmabuf *dmabuf = NULL;
-       struct list_head *entry;
-        unsigned int minor = iminor(inode);
-       int ret = 0;
-       unsigned int tmp;
-
-       CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()+ file=%p %s %s\n",
-               file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "",
-               file->f_mode & FMODE_READ ? "FMODE_READ" : "") );
-
-       list_for_each(entry, &cs46xx_devs) {
-               card = list_entry(entry, struct cs_card, list);
-
-               if (!((card->dev_audio ^ minor) & ~0xf))
-                       break;
-       }
-       if (entry == &cs46xx_devs)
-               return -ENODEV;
-       if (!card) {
-               CS_DBGOUT(CS_FUNCTION | CS_OPEN, 2, printk(KERN_INFO
-                       "cs46xx: cs_open(): Error - unable to find audio card struct\n"));
-               return -ENODEV;
-       }
-
-       /*
-        * hardcode state[0] for capture, [1] for playback
-        */
-       if (file->f_mode & FMODE_READ) {
-               CS_DBGOUT(CS_WAVE_READ, 2, printk("cs46xx: cs_open() FMODE_READ\n") );
-               if (card->states[0] == NULL) {
-                       state = card->states[0] =
-                               kzalloc(sizeof(struct cs_state), GFP_KERNEL);
-                       if (state == NULL)
-                               return -ENOMEM;
-                       mutex_init(&state->sem);
-                       dmabuf = &state->dmabuf;
-                       dmabuf->pbuf = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
-                       if (dmabuf->pbuf == NULL) {
-                               kfree(state);
-                               card->states[0] = NULL;
-                               return -ENOMEM;
-                       }
-               } else {
-                       state = card->states[0];
-                       if (state->open_mode & FMODE_READ)
-                               return -EBUSY;
-               }
-               dmabuf->channel = card->alloc_rec_pcm_channel(card);
-                       
-               if (dmabuf->channel == NULL) {
-                       kfree(card->states[0]);
-                       card->states[0] = NULL;
-                       return -ENODEV;
-               }
-
-               /* Now turn on external AMP if needed */
-               state->card = card;
-               state->card->active_ctrl(state->card, 1);
-               state->card->amplifier_ctrl(state->card, 1);
-               
-               if ((tmp = cs46xx_powerup(card, CS_POWER_ADC))) {
-                       CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
-                               "cs46xx: cs46xx_powerup of ADC failed (0x%x)\n", tmp));
-                       return -EIO;
-               }
-
-               dmabuf->channel->state = state;
-               /* initialize the virtual channel */
-               state->virt = 0;
-               state->magic = CS_STATE_MAGIC;
-               init_waitqueue_head(&dmabuf->wait);
-               mutex_init(&state->open_mutex);
-               file->private_data = card;
-
-               mutex_lock(&state->open_mutex);
-
-               /* set default sample format. According to OSS Programmer's Guide  /dev/dsp
-                  should be default to unsigned 8-bits, mono, with sample rate 8kHz and
-                  /dev/dspW will accept 16-bits sample */
-
-               /* Default input is 8bit mono */
-               dmabuf->fmt &= ~CS_FMT_MASK;
-               dmabuf->type = CS_TYPE_ADC;
-               dmabuf->ossfragshift = 0;
-               dmabuf->ossmaxfrags  = 0;
-               dmabuf->subdivision  = 0;
-               cs_set_adc_rate(state, 8000);
-               cs_set_divisor(dmabuf);
-
-               state->open_mode |= FMODE_READ;
-               mutex_unlock(&state->open_mutex);
-       }
-       if (file->f_mode & FMODE_WRITE) {
-               CS_DBGOUT(CS_OPEN, 2, printk("cs46xx: cs_open() FMODE_WRITE\n") );
-               if (card->states[1] == NULL) {
-                       state = card->states[1] =
-                               kzalloc(sizeof(struct cs_state), GFP_KERNEL);
-                       if (state == NULL)
-                               return -ENOMEM;
-                       mutex_init(&state->sem);
-                       dmabuf = &state->dmabuf;
-                       dmabuf->pbuf = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
-                       if (dmabuf->pbuf == NULL) {
-                               kfree(state);
-                               card->states[1] = NULL;
-                               return -ENOMEM;
-                       }
-               } else {
-                       state = card->states[1];
-                       if (state->open_mode & FMODE_WRITE)
-                               return -EBUSY;
-               }
-               dmabuf->channel = card->alloc_pcm_channel(card);
-                       
-               if (dmabuf->channel == NULL) {
-                       kfree(card->states[1]);
-                       card->states[1] = NULL;
-                       return -ENODEV;
-               }
-
-               /* Now turn on external AMP if needed */
-               state->card = card;
-               state->card->active_ctrl(state->card, 1);
-               state->card->amplifier_ctrl(state->card, 1);
-
-               if ((tmp = cs46xx_powerup(card, CS_POWER_DAC))) {
-                       CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
-                               "cs46xx: cs46xx_powerup of DAC failed (0x%x)\n", tmp));
-                       return -EIO;
-               }
-               
-               dmabuf->channel->state = state;
-               /* initialize the virtual channel */
-               state->virt = 1;
-               state->magic = CS_STATE_MAGIC;
-               init_waitqueue_head(&dmabuf->wait);
-               mutex_init(&state->open_mutex);
-               file->private_data = card;
-
-               mutex_lock(&state->open_mutex);
-
-               /* set default sample format. According to OSS Programmer's Guide  /dev/dsp
-                  should be default to unsigned 8-bits, mono, with sample rate 8kHz and
-                  /dev/dspW will accept 16-bits sample */
-
-               /* Default output is 8bit mono. */
-               dmabuf->fmt &= ~CS_FMT_MASK;
-               dmabuf->type = CS_TYPE_DAC;
-               dmabuf->ossfragshift = 0;
-               dmabuf->ossmaxfrags  = 0;
-               dmabuf->subdivision  = 0;
-               cs_set_dac_rate(state, 8000);
-               cs_set_divisor(dmabuf);
-
-               state->open_mode |= FMODE_WRITE;
-               mutex_unlock(&state->open_mutex);
-               if ((ret = prog_dmabuf(state)))
-                       return ret;
-       }
-       CS_DBGOUT(CS_OPEN | CS_FUNCTION, 2, printk("cs46xx: cs_open()- 0\n"));
-       return nonseekable_open(inode, file);
-}
-
-static int cs_release(struct inode *inode, struct file *file)
-{
-       struct cs_card *card = file->private_data;
-       struct dmabuf *dmabuf;
-       struct cs_state *state;
-       unsigned int tmp;
-       CS_DBGOUT(CS_RELEASE | CS_FUNCTION, 2, printk("cs46xx: cs_release()+ file=%p %s %s\n",
-               file, file->f_mode & FMODE_WRITE ? "FMODE_WRITE" : "",
-               file->f_mode & FMODE_READ ? "FMODE_READ" : ""));
-
-       if (!(file->f_mode & (FMODE_WRITE | FMODE_READ)))
-               return -EINVAL;
-       state = card->states[1];
-       if (state) {
-               if ((state->open_mode & FMODE_WRITE) & (file->f_mode & FMODE_WRITE)) {
-                       CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_WRITE\n"));
-                       dmabuf = &state->dmabuf;
-                       cs_clear_tail(state);
-                       drain_dac(state, file->f_flags & O_NONBLOCK);
-                       /* stop DMA state machine and free DMA buffers/channels */
-                       mutex_lock(&state->open_mutex);
-                       stop_dac(state);
-                       dealloc_dmabuf(state);
-                       state->card->free_pcm_channel(state->card, dmabuf->channel->num);
-                       free_page((unsigned long)state->dmabuf.pbuf);
-
-                       /* we're covered by the open_mutex */
-                       mutex_unlock(&state->open_mutex);
-                       state->card->states[state->virt] = NULL;
-                       state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
-
-                       if ((tmp = cs461x_powerdown(card, CS_POWER_DAC, CS_FALSE))) {
-                               CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO 
-                                       "cs46xx: cs_release_mixdev() powerdown DAC failure (0x%x)\n",tmp) );
-                       }
-
-                       /* Now turn off external AMP if needed */
-                       state->card->amplifier_ctrl(state->card, -1);
-                       state->card->active_ctrl(state->card, -1);
-                       kfree(state);
-               }
-       }
-
-       state = card->states[0];
-       if (state) {
-               if ((state->open_mode & FMODE_READ) & (file->f_mode & FMODE_READ)) {
-                       CS_DBGOUT(CS_RELEASE, 2, printk("cs46xx: cs_release() FMODE_READ\n"));
-                       dmabuf = &state->dmabuf;
-                       mutex_lock(&state->open_mutex);
-                       stop_adc(state);
-                       dealloc_dmabuf(state);
-                       state->card->free_pcm_channel(state->card, dmabuf->channel->num);
-                       free_page((unsigned long)state->dmabuf.pbuf);
-
-                       /* we're covered by the open_mutex */
-                       mutex_unlock(&state->open_mutex);
-                       state->card->states[state->virt] = NULL;
-                       state->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
-
-                       if ((tmp = cs461x_powerdown(card, CS_POWER_ADC, CS_FALSE))) {
-                               CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO 
-                                       "cs46xx: cs_release_mixdev() powerdown ADC failure (0x%x)\n",tmp) );
-                       }
-
-                       /* Now turn off external AMP if needed */
-                       state->card->amplifier_ctrl(state->card, -1);
-                       state->card->active_ctrl(state->card, -1);
-                       kfree(state);
-               }
-       }
-
-       CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 2, printk("cs46xx: cs_release()- 0\n"));
-       return 0;
-}
-
-static void printpm(struct cs_card *s)
-{
-       CS_DBGOUT(CS_PM, 9, printk("pm struct:\n"));
-       CS_DBGOUT(CS_PM, 9, printk("flags:0x%x u32CLKCR1_SAVE: 0%x u32SSPMValue: 0x%x\n",
-               (unsigned)s->pm.flags,s->pm.u32CLKCR1_SAVE,s->pm.u32SSPMValue));
-       CS_DBGOUT(CS_PM, 9, printk("u32PPLVCvalue: 0x%x u32PPRVCvalue: 0x%x\n",
-               s->pm.u32PPLVCvalue,s->pm.u32PPRVCvalue));
-       CS_DBGOUT(CS_PM, 9, printk("u32FMLVCvalue: 0x%x u32FMRVCvalue: 0x%x\n",
-               s->pm.u32FMLVCvalue,s->pm.u32FMRVCvalue));
-       CS_DBGOUT(CS_PM, 9, printk("u32GPIORvalue: 0x%x u32JSCTLvalue: 0x%x\n",
-               s->pm.u32GPIORvalue,s->pm.u32JSCTLvalue));
-       CS_DBGOUT(CS_PM, 9, printk("u32SSCR: 0x%x u32SRCSA: 0x%x\n",
-               s->pm.u32SSCR,s->pm.u32SRCSA));
-       CS_DBGOUT(CS_PM, 9, printk("u32DacASR: 0x%x u32AdcASR: 0x%x\n",
-               s->pm.u32DacASR,s->pm.u32AdcASR));
-       CS_DBGOUT(CS_PM, 9, printk("u32DacSR: 0x%x u32AdcSR: 0x%x\n",
-               s->pm.u32DacSR,s->pm.u32AdcSR));
-       CS_DBGOUT(CS_PM, 9, printk("u32MIDCR_Save: 0x%x\n",
-               s->pm.u32MIDCR_Save));
-       CS_DBGOUT(CS_PM, 9, printk("u32AC97_powerdown: 0x%x _general_purpose 0x%x\n",
-               s->pm.u32AC97_powerdown,s->pm.u32AC97_general_purpose));
-       CS_DBGOUT(CS_PM, 9, printk("u32AC97_master_volume: 0x%x\n",
-               s->pm.u32AC97_master_volume));
-       CS_DBGOUT(CS_PM, 9, printk("u32AC97_headphone_volume: 0x%x\n",
-               s->pm.u32AC97_headphone_volume));
-       CS_DBGOUT(CS_PM, 9, printk("u32AC97_master_volume_mono: 0x%x\n",
-               s->pm.u32AC97_master_volume_mono));
-       CS_DBGOUT(CS_PM, 9, printk("u32AC97_pcm_out_volume: 0x%x\n",
-               s->pm.u32AC97_pcm_out_volume));
-       CS_DBGOUT(CS_PM, 9, printk("dmabuf_swptr_play: 0x%x dmabuf_count_play: %d\n",
-               s->pm.dmabuf_swptr_play,s->pm.dmabuf_count_play));
-       CS_DBGOUT(CS_PM, 9, printk("dmabuf_swptr_capture: 0x%x dmabuf_count_capture: %d\n",
-               s->pm.dmabuf_swptr_capture,s->pm.dmabuf_count_capture));
-
-}
-
-/****************************************************************************
-*
-*  Suspend - save the ac97 regs, mute the outputs and power down the part.  
-*
-****************************************************************************/
-static void cs46xx_ac97_suspend(struct cs_card *card)
-{
-       int Count,i;
-       struct ac97_codec *dev=card->ac97_codec[0];
-       unsigned int tmp;
-
-       CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_suspend()+\n"));
-
-       if (card->states[1]) {
-               stop_dac(card->states[1]);
-               resync_dma_ptrs(card->states[1]);
-       }
-       if (card->states[0]) {
-               stop_adc(card->states[0]);
-               resync_dma_ptrs(card->states[0]);
-       }
-
-       for (Count = 0x2, i = 0; (Count <= CS46XX_AC97_HIGHESTREGTORESTORE)
-                       && (i < CS46XX_AC97_NUMBER_RESTORE_REGS);
-                       Count += 2, i++) {
-               card->pm.ac97[i] = cs_ac97_get(dev, BA0_AC97_RESET + Count);
-       }
-/*
-* Save the ac97 volume registers as well as the current powerdown state.
-* Now, mute the all the outputs (master, headphone, and mono), as well
-* as the PCM volume, in preparation for powering down the entire part.
-       card->pm.u32AC97_master_volume = (u32)cs_ac97_get( dev, 
-                       (u8)BA0_AC97_MASTER_VOLUME); 
-       card->pm.u32AC97_headphone_volume = (u32)cs_ac97_get(dev, 
-                       (u8)BA0_AC97_HEADPHONE_VOLUME); 
-       card->pm.u32AC97_master_volume_mono = (u32)cs_ac97_get(dev, 
-                       (u8)BA0_AC97_MASTER_VOLUME_MONO); 
-       card->pm.u32AC97_pcm_out_volume = (u32)cs_ac97_get(dev, 
-                       (u8)BA0_AC97_PCM_OUT_VOLUME);
-*/ 
-/*
-* mute the outputs
-*/
-       cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME, 0x8000);
-       cs_ac97_set(dev, (u8)BA0_AC97_HEADPHONE_VOLUME, 0x8000);
-       cs_ac97_set(dev, (u8)BA0_AC97_MASTER_VOLUME_MONO, 0x8000);
-       cs_ac97_set(dev, (u8)BA0_AC97_PCM_OUT_VOLUME, 0x8000);
-
-/*
-* save the registers that cause pops
-*/
-       card->pm.u32AC97_powerdown = (u32)cs_ac97_get(dev, (u8)AC97_POWER_CONTROL); 
-       card->pm.u32AC97_general_purpose = (u32)cs_ac97_get(dev, (u8)BA0_AC97_GENERAL_PURPOSE); 
-/*
-* And power down everything on the AC97 codec.
-* well, for now, only power down the DAC/ADC and MIXER VREFON components. 
-* trouble with removing VREF.
-*/
-       if ((tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
-                       CS_POWER_MIXVON, CS_TRUE))) {
-               CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
-                       "cs46xx: cs46xx_ac97_suspend() failure (0x%x)\n",tmp));
-       }
-
-       CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_suspend()-\n"));
-}
-
-/****************************************************************************
-*
-*  Resume - power up the part and restore its registers..  
-*
-****************************************************************************/
-static void cs46xx_ac97_resume(struct cs_card *card)
-{
-       int Count,i;
-       struct ac97_codec *dev=card->ac97_codec[0];
-
-       CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_resume()+\n"));
-
-/*
-* First, we restore the state of the general purpose register.  This
-* contains the mic select (mic1 or mic2) and if we restore this after
-* we restore the mic volume/boost state and mic2 was selected at
-* suspend time, we will end up with a brief period of time where mic1
-* is selected with the volume/boost settings for mic2, causing
-* acoustic feedback.  So we restore the general purpose register
-* first, thereby getting the correct mic selected before we restore
-* the mic volume/boost.
-*/
-       cs_ac97_set(dev, (u8)BA0_AC97_GENERAL_PURPOSE, 
-               (u16)card->pm.u32AC97_general_purpose);
-/*
-* Now, while the outputs are still muted, restore the state of power
-* on the AC97 part.
-*/
-       cs_ac97_set(dev, (u8)BA0_AC97_POWERDOWN, (u16)card->pm.u32AC97_powerdown);
-       mdelay(5 * cs_laptop_wait);
-/*
-* Restore just the first set of registers, from register number
-* 0x02 to the register number that ulHighestRegToRestore specifies.
-*/
-       for (Count = 0x2, i=0; (Count <= CS46XX_AC97_HIGHESTREGTORESTORE) &&
-                       (i < CS46XX_AC97_NUMBER_RESTORE_REGS); Count += 2, i++) {
-               cs_ac97_set(dev, (u8)(BA0_AC97_RESET + Count), (u16)card->pm.ac97[i]);
-       }
-
-       /* Check if we have to init the amplifier */
-       if (card->amp_init)
-               card->amp_init(card);
-        
-       CS_DBGOUT(CS_PM, 9, printk("cs46xx: cs46xx_ac97_resume()-\n"));
-}
-
-
-static int cs46xx_restart_part(struct cs_card *card)
-{
-       struct dmabuf *dmabuf;
-
-       CS_DBGOUT(CS_PM | CS_FUNCTION, 4, 
-               printk( "cs46xx: cs46xx_restart_part()+\n"));
-       if (card->states[1]) {
-               dmabuf = &card->states[1]->dmabuf;
-               dmabuf->ready = 0;
-               resync_dma_ptrs(card->states[1]);
-               cs_set_divisor(dmabuf);
-               if (__prog_dmabuf(card->states[1])) {
-                       CS_DBGOUT(CS_PM | CS_ERROR, 1, 
-                               printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() dac error\n"));
-                       return -1;
-               }
-               cs_set_dac_rate(card->states[1], dmabuf->rate);
-       }
-       if (card->states[0]) {
-               dmabuf = &card->states[0]->dmabuf;
-               dmabuf->ready = 0;
-               resync_dma_ptrs(card->states[0]);
-               cs_set_divisor(dmabuf);
-               if (__prog_dmabuf(card->states[0])) {
-                       CS_DBGOUT(CS_PM | CS_ERROR, 1, 
-                               printk("cs46xx: cs46xx_restart_part()- (-1) prog_dmabuf() adc error\n"));
-                       return -1;
-               }
-               cs_set_adc_rate(card->states[0], dmabuf->rate);
-       }
-       card->pm.flags |= CS46XX_PM_RESUMED;
-       if (card->states[0])
-               start_adc(card->states[0]);
-       if (card->states[1])
-               start_dac(card->states[1]);
-
-       card->pm.flags |= CS46XX_PM_IDLE;
-       card->pm.flags &= ~(CS46XX_PM_SUSPENDING | CS46XX_PM_SUSPENDED 
-                       | CS46XX_PM_RESUMING | CS46XX_PM_RESUMED);
-       if (card->states[0])
-               wake_up(&card->states[0]->dmabuf.wait);
-       if (card->states[1])
-               wake_up(&card->states[1]->dmabuf.wait);
-
-       CS_DBGOUT(CS_PM | CS_FUNCTION, 4, 
-               printk( "cs46xx: cs46xx_restart_part()-\n"));
-       return 0;
-}
-
-static void cs461x_reset(struct cs_card *card);
-static void cs461x_proc_stop(struct cs_card *card);
-static int cs46xx_suspend(struct cs_card *card, pm_message_t state)
-{
-       unsigned int tmp;
-
-       CS_DBGOUT(CS_PM | CS_FUNCTION, 4, 
-               printk("cs46xx: cs46xx_suspend()+ flags=0x%x s=%p\n",
-                       (unsigned)card->pm.flags,card));
-/*
-* check the current state, only suspend if IDLE
-*/
-       if (!(card->pm.flags & CS46XX_PM_IDLE)) {
-               CS_DBGOUT(CS_PM | CS_ERROR, 2, 
-                       printk("cs46xx: cs46xx_suspend() unable to suspend, not IDLE\n"));
-               return 1;
-       }
-       card->pm.flags &= ~CS46XX_PM_IDLE;
-       card->pm.flags |= CS46XX_PM_SUSPENDING;
-
-       card->active_ctrl(card,1);
-       
-       tmp = cs461x_peek(card, BA1_PFIE);
-       tmp &= ~0x0000f03f;
-       tmp |=  0x00000010;
-       cs461x_poke(card, BA1_PFIE, tmp);       /* playback interrupt disable */
-
-       tmp = cs461x_peek(card, BA1_CIE);
-       tmp &= ~0x0000003f;
-       tmp |=  0x00000011;
-       cs461x_poke(card, BA1_CIE, tmp);        /* capture interrupt disable */
-
-       /*
-         *  Stop playback DMA.
-        */
-       tmp = cs461x_peek(card, BA1_PCTL);
-       cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
-
-       /*
-         *  Stop capture DMA.
-        */
-       tmp = cs461x_peek(card, BA1_CCTL);
-       cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
-
-       if (card->states[1]) {
-               card->pm.dmabuf_swptr_play = card->states[1]->dmabuf.swptr;
-               card->pm.dmabuf_count_play = card->states[1]->dmabuf.count;
-       }
-       if (card->states[0]) {
-               card->pm.dmabuf_swptr_capture = card->states[0]->dmabuf.swptr;
-               card->pm.dmabuf_count_capture = card->states[0]->dmabuf.count;
-       }
-
-       cs46xx_ac97_suspend(card);
-
-       /*
-         *  Reset the processor.
-         */
-       cs461x_reset(card);
-
-       cs461x_proc_stop(card);
-
-       /*
-        *  Power down the DAC and ADC.  For now leave the other areas on.
-        */
-       cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, 0x0300);
-
-       /*
-        *  Power down the PLL.
-        */
-       cs461x_pokeBA0(card, BA0_CLKCR1, 0);
-
-       /*
-        *  Turn off the Processor by turning off the software clock enable flag in 
-        *  the clock control register.
-        */
-       tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE;
-       cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
-
-       card->active_ctrl(card,-1);
-
-       card->pm.flags &= ~CS46XX_PM_SUSPENDING;
-       card->pm.flags |= CS46XX_PM_SUSPENDED;
-
-       printpm(card);
-
-       CS_DBGOUT(CS_PM | CS_FUNCTION, 4, 
-               printk("cs46xx: cs46xx_suspend()- flags=0x%x\n",
-                       (unsigned)card->pm.flags));
-       return 0;
-}
-
-static int cs46xx_resume(struct cs_card *card)
-{
-       int i;
-
-       CS_DBGOUT(CS_PM | CS_FUNCTION, 4, 
-               printk( "cs46xx: cs46xx_resume()+ flags=0x%x\n",
-                       (unsigned)card->pm.flags));
-       if (!(card->pm.flags & CS46XX_PM_SUSPENDED)) {
-               CS_DBGOUT(CS_PM | CS_ERROR, 2, 
-                       printk("cs46xx: cs46xx_resume() unable to resume, not SUSPENDED\n"));
-               return 1;
-       }
-       card->pm.flags |= CS46XX_PM_RESUMING;
-       card->pm.flags &= ~CS46XX_PM_SUSPENDED;
-       printpm(card);
-       card->active_ctrl(card, 1);
-
-       for (i = 0; i < 5; i++) {
-               if (cs_hardware_init(card) != 0) {
-                       CS_DBGOUT(CS_PM | CS_ERROR, 4, printk(
-                               "cs46xx: cs46xx_resume()- ERROR in cs_hardware_init()\n"));
-                       mdelay(10 * cs_laptop_wait);
-                       cs461x_reset(card);
-                       continue;
-               }
-               break;
-       }
-       if (i >= 4) {
-               CS_DBGOUT(CS_PM | CS_ERROR, 1, printk(
-                       "cs46xx: cs46xx_resume()- cs_hardware_init() failed, retried %d times.\n",i));
-               return 0;
-       }
-
-       if (cs46xx_restart_part(card)) {
-               CS_DBGOUT(CS_PM | CS_ERROR, 4, printk(
-                       "cs46xx: cs46xx_resume(): cs46xx_restart_part() returned error\n"));
-       }
-
-       card->active_ctrl(card, -1);
-
-       CS_DBGOUT(CS_PM | CS_FUNCTION, 4, printk("cs46xx: cs46xx_resume()- flags=0x%x\n",
-               (unsigned)card->pm.flags));
-       return 0;
-}
-
-static /*const*/ struct file_operations cs461x_fops = {
-       CS_OWNER        CS_THIS_MODULE
-       .llseek         = no_llseek,
-       .read           = cs_read,
-       .write          = cs_write,
-       .poll           = cs_poll,
-       .ioctl          = cs_ioctl,
-       .mmap           = cs_mmap,
-       .open           = cs_open,
-       .release        = cs_release,
-};
-
-/* Write AC97 codec registers */
-
-
-static u16 _cs_ac97_get(struct ac97_codec *dev, u8 reg)
-{
-       struct cs_card *card = dev->private_data;
-       int count,loopcnt;
-       unsigned int tmp;
-       u16 ret;
-       
-       /*
-        *  1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
-        *  2. Write ACCDA = Command Data Register = 470h    for data to write to AC97 
-        *  3. Write ACCTL = Control Register = 460h for initiating the write
-        *  4. Read ACCTL = 460h, DCV should be reset by now and 460h = 17h
-        *  5. if DCV not cleared, break and return error
-        *  6. Read ACSTS = Status Register = 464h, check VSTS bit
-        */
-
-       cs461x_peekBA0(card, BA0_ACSDA);
-
-       /*
-        *  Setup the AC97 control registers on the CS461x to send the
-        *  appropriate command to the AC97 to perform the read.
-        *  ACCAD = Command Address Register = 46Ch
-        *  ACCDA = Command Data Register = 470h
-        *  ACCTL = Control Register = 460h
-        *  set DCV - will clear when process completed
-        *  set CRW - Read command
-        *  set VFRM - valid frame enabled
-        *  set ESYN - ASYNC generation enabled
-        *  set RSTN - ARST# inactive, AC97 codec not reset
-        */
-
-       cs461x_pokeBA0(card, BA0_ACCAD, reg);
-       cs461x_pokeBA0(card, BA0_ACCDA, 0);
-       cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_DCV | ACCTL_CRW |
-                                            ACCTL_VFRM | ACCTL_ESYN |
-                                            ACCTL_RSTN);
-
-
-       /*
-        *  Wait for the read to occur.
-        */
-       if (!(card->pm.flags & CS46XX_PM_IDLE))
-               loopcnt = 2000;
-       else
-               loopcnt = 500 * cs_laptop_wait;
-       loopcnt *= cs_laptop_wait;
-       for (count = 0; count < loopcnt; count++) {
-               /*
-                *  First, we want to wait for a short time.
-                */
-               udelay(10 * cs_laptop_wait);
-               /*
-                *  Now, check to see if the read has completed.
-                *  ACCTL = 460h, DCV should be reset by now and 460h = 17h
-                */
-               if (!(cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV))
-                       break;
-       }
-
-       /*
-        *  Make sure the read completed.
-        */
-       if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV) {
-               CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
-                       "cs46xx: AC'97 read problem (ACCTL_DCV), reg = 0x%x returning 0xffff\n", reg));
-               return 0xffff;
-       }
-
-       /*
-        *  Wait for the valid status bit to go active.
-        */
-
-       if (!(card->pm.flags & CS46XX_PM_IDLE))
-               loopcnt = 2000;
-       else
-               loopcnt = 1000;
-       loopcnt *= cs_laptop_wait;
-       for (count = 0; count < loopcnt; count++) {
-               /*
-                *  Read the AC97 status register.
-                *  ACSTS = Status Register = 464h
-                *  VSTS - Valid Status
-                */
-               if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_VSTS)
-                       break;
-               udelay(10 * cs_laptop_wait);
-       }
-       
-       /*
-        *  Make sure we got valid status.
-        */
-       if (!((tmp = cs461x_peekBA0(card, BA0_ACSTS)) & ACSTS_VSTS)) {
-               CS_DBGOUT(CS_ERROR, 2, printk(KERN_WARNING 
-                       "cs46xx: AC'97 read problem (ACSTS_VSTS), reg = 0x%x val=0x%x 0xffff \n", 
-                               reg, tmp));
-               return 0xffff;
-       }
-
-       /*
-        *  Read the data returned from the AC97 register.
-        *  ACSDA = Status Data Register = 474h
-        */
-       CS_DBGOUT(CS_FUNCTION, 9, printk(KERN_INFO
-               "cs46xx: cs_ac97_get() reg = 0x%x, val = 0x%x, BA0_ACCAD = 0x%x\n", 
-                       reg, cs461x_peekBA0(card, BA0_ACSDA),
-                       cs461x_peekBA0(card, BA0_ACCAD)));
-       ret = cs461x_peekBA0(card, BA0_ACSDA);
-       return ret;
-}
-
-static u16 cs_ac97_get(struct ac97_codec *dev, u8 reg)
-{
-       u16 ret;
-       struct cs_card *card = dev->private_data;
-       
-       spin_lock(&card->ac97_lock);
-       ret = _cs_ac97_get(dev, reg);
-       spin_unlock(&card->ac97_lock);
-       return ret;
-}
-
-static void cs_ac97_set(struct ac97_codec *dev, u8 reg, u16 val)
-{
-       struct cs_card *card = dev->private_data;
-       int count;
-       int val2 = 0;
-       
-       spin_lock(&card->ac97_lock);
-       
-       if (reg == AC97_CD_VOL)
-               val2 = _cs_ac97_get(dev, AC97_CD_VOL);
-
-       /*
-        *  1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
-        *  2. Write ACCDA = Command Data Register = 470h    for data to write to AC97
-        *  3. Write ACCTL = Control Register = 460h for initiating the write
-        *  4. Read ACCTL = 460h, DCV should be reset by now and 460h = 07h
-        *  5. if DCV not cleared, break and return error
-        */
-
-       /*
-        *  Setup the AC97 control registers on the CS461x to send the
-        *  appropriate command to the AC97 to perform the read.
-        *  ACCAD = Command Address Register = 46Ch
-        *  ACCDA = Command Data Register = 470h
-        *  ACCTL = Control Register = 460h
-        *  set DCV - will clear when process completed
-        *  reset CRW - Write command
-        *  set VFRM - valid frame enabled
-        *  set ESYN - ASYNC generation enabled
-        *  set RSTN - ARST# inactive, AC97 codec not reset
-         */
-       cs461x_pokeBA0(card, BA0_ACCAD, reg);
-       cs461x_pokeBA0(card, BA0_ACCDA, val);
-       cs461x_peekBA0(card, BA0_ACCTL);
-       cs461x_pokeBA0(card, BA0_ACCTL, 0 | ACCTL_VFRM | ACCTL_ESYN | ACCTL_RSTN);
-       cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_DCV | ACCTL_VFRM |
-                                            ACCTL_ESYN | ACCTL_RSTN);
-       for (count = 0; count < 1000; count++) {
-               /*
-                *  First, we want to wait for a short time.
-                */
-               udelay(10 * cs_laptop_wait);
-               /*
-                *  Now, check to see if the write has completed.
-                *  ACCTL = 460h, DCV should be reset by now and 460h = 07h
-                */
-               if (!(cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV))
-                       break;
-       }
-       /*
-        *  Make sure the write completed.
-        */
-       if (cs461x_peekBA0(card, BA0_ACCTL) & ACCTL_DCV) {
-               CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
-                       "cs46xx: AC'97 write problem, reg = 0x%x, val = 0x%x\n", reg, val));
-       }
-
-       spin_unlock(&card->ac97_lock);
-
-       /*
-        *      Adjust power if the mixer is selected/deselected according
-        *      to the CD.
-        *
-        *      IF the CD is a valid input source (mixer or direct) AND
-        *              the CD is not muted THEN power is needed
-        *
-        *      We do two things. When record select changes the input to
-        *      add/remove the CD we adjust the power count if the CD is
-        *      unmuted.
-        *
-        *      When the CD mute changes we adjust the power level if the
-        *      CD was a valid input.
-        *
-        *      We also check for CD volume != 0, as the CD mute isn't
-        *      normally tweaked from userspace.
-        */
-        
-       /* CD mute change ? */
-       
-       if (reg == AC97_CD_VOL) {
-               /* Mute bit change ? */
-               if ((val2^val) & 0x8000 ||
-                   ((val2 == 0x1f1f || val == 0x1f1f) && val2 != val)) {
-                       /* This is a hack but its cleaner than the alternatives.
-                          Right now card->ac97_codec[0] might be NULL as we are
-                          still doing codec setup. This does an early assignment
-                          to avoid the problem if it occurs */
-                          
-                       if (card->ac97_codec[0] == NULL)
-                               card->ac97_codec[0] = dev;
-                               
-                       /* Mute on */
-                       if (val & 0x8000 || val == 0x1f1f)
-                               card->amplifier_ctrl(card, -1);
-                       else { /* Mute off power on */
-                               if (card->amp_init)
-                                       card->amp_init(card);
-                               card->amplifier_ctrl(card, 1);
-                       }
-               }
-       }
-}
-
-/* OSS /dev/mixer file operation methods */
-
-static int cs_open_mixdev(struct inode *inode, struct file *file)
-{
-       int i = 0;
-       unsigned int minor = iminor(inode);
-       struct cs_card *card = NULL;
-       struct list_head *entry;
-       unsigned int tmp;
-
-       CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
-                 printk(KERN_INFO "cs46xx: cs_open_mixdev()+\n"));
-
-       list_for_each(entry, &cs46xx_devs) {
-               card = list_entry(entry, struct cs_card, list);
-               for (i = 0; i < NR_AC97; i++)
-                       if (card->ac97_codec[i] != NULL &&
-                           card->ac97_codec[i]->dev_mixer == minor)
-                               goto match;
-       }
-       if (!card) {
-               CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
-                       printk(KERN_INFO "cs46xx: cs46xx_open_mixdev()- -ENODEV\n"));
-               return -ENODEV;
-       }
- match:
-       if (!card->ac97_codec[i])
-               return -ENODEV;
-       file->private_data = card->ac97_codec[i];
-
-       card->active_ctrl(card,1);
-       if (!CS_IN_USE(&card->mixer_use_cnt)) {
-               if ((tmp = cs46xx_powerup(card, CS_POWER_MIXVON))) {
-                       CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
-                               "cs46xx: cs_open_mixdev() powerup failure (0x%x)\n", tmp));
-                       return -EIO;
-               }
-       }
-       card->amplifier_ctrl(card, 1);
-       CS_INC_USE_COUNT(&card->mixer_use_cnt);
-       CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
-                 printk(KERN_INFO "cs46xx: cs_open_mixdev()- 0\n"));
-       return nonseekable_open(inode, file);
-}
-
-static int cs_release_mixdev(struct inode *inode, struct file *file)
-{
-       unsigned int minor = iminor(inode);
-       struct cs_card *card = NULL;
-       struct list_head *entry;
-       int i;
-       unsigned int tmp;
-
-       CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
-                 printk(KERN_INFO "cs46xx: cs_release_mixdev()+\n"));
-       list_for_each(entry, &cs46xx_devs)
-       {
-               card = list_entry(entry, struct cs_card, list);
-               for (i = 0; i < NR_AC97; i++)
-                       if (card->ac97_codec[i] != NULL &&
-                           card->ac97_codec[i]->dev_mixer == minor)
-                               goto match;
-       }
-       if (!card) {
-               CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
-                       printk(KERN_INFO "cs46xx: cs46xx_open_mixdev()- -ENODEV\n"));
-               return -ENODEV;
-       }
-match:
-       if (!CS_DEC_AND_TEST(&card->mixer_use_cnt)) {
-               CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
-                         printk(KERN_INFO "cs46xx: cs_release_mixdev()- no powerdown, usecnt>0\n"));
-               card->active_ctrl(card, -1);
-               card->amplifier_ctrl(card, -1);
-               return 0;
-       }
-/*
-* ok, no outstanding mixer opens, so powerdown.
-*/
-       if ((tmp = cs461x_powerdown(card, CS_POWER_MIXVON, CS_FALSE))) {
-               CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
-                       "cs46xx: cs_release_mixdev() powerdown MIXVON failure (0x%x)\n", tmp));
-               card->active_ctrl(card, -1);
-               card->amplifier_ctrl(card, -1);
-               return -EIO;
-       }
-       card->active_ctrl(card, -1);
-       card->amplifier_ctrl(card, -1);
-       CS_DBGOUT(CS_FUNCTION | CS_RELEASE, 4,
-                 printk(KERN_INFO "cs46xx: cs_release_mixdev()- 0\n"));
-       return 0;
-}
-
-static int cs_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd,
-                       unsigned long arg)
-{
-       struct ac97_codec *codec = file->private_data;
-       struct cs_card *card = NULL;
-       struct list_head *entry;
-       unsigned long __user *p = (long __user *)arg;
-#if CSDEBUG_INTERFACE
-        int val;
-
-       if (    (cmd == SOUND_MIXER_CS_GETDBGMASK) ||
-               (cmd == SOUND_MIXER_CS_SETDBGMASK) ||
-               (cmd == SOUND_MIXER_CS_GETDBGLEVEL) ||
-               (cmd == SOUND_MIXER_CS_SETDBGLEVEL) ||
-               (cmd == SOUND_MIXER_CS_APM)) {
-               switch (cmd) {
-               case SOUND_MIXER_CS_GETDBGMASK:
-                       return put_user(cs_debugmask, p);
-               case SOUND_MIXER_CS_GETDBGLEVEL:
-                       return put_user(cs_debuglevel, p);
-               case SOUND_MIXER_CS_SETDBGMASK:
-                       if (get_user(val, p))
-                               return -EFAULT;
-                       cs_debugmask = val;
-                       return 0;
-               case SOUND_MIXER_CS_SETDBGLEVEL:
-                       if (get_user(val, p))
-                               return -EFAULT;
-                       cs_debuglevel = val;
-                       return 0;
-               case SOUND_MIXER_CS_APM:
-                       if (get_user(val, p))
-                               return -EFAULT;
-                       if (val == CS_IOCTL_CMD_SUSPEND) {
-                               list_for_each(entry, &cs46xx_devs) {
-                                       card = list_entry(entry, struct cs_card, list);
-                                       cs46xx_suspend(card, PMSG_ON);
-                               }
-
-                       } else if (val == CS_IOCTL_CMD_RESUME) {
-                               list_for_each(entry, &cs46xx_devs) {
-                                       card = list_entry(entry, struct cs_card, list);
-                                       cs46xx_resume(card);
-                               }
-                       } else {
-                               CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO
-                                   "cs46xx: mixer_ioctl(): invalid APM cmd (%d)\n",
-                                       val));
-                       }
-                       return 0;
-               default:
-                       CS_DBGOUT(CS_ERROR, 1, printk(KERN_INFO 
-                               "cs46xx: mixer_ioctl(): ERROR unknown debug cmd\n"));
-                       return 0;
-               }
-       }
-#endif
-       return codec->mixer_ioctl(codec, cmd, arg);
-}
-
-static /*const*/ struct file_operations cs_mixer_fops = {
-       CS_OWNER        CS_THIS_MODULE
-       .llseek         = no_llseek,
-       .ioctl          = cs_ioctl_mixdev,
-       .open           = cs_open_mixdev,
-       .release        = cs_release_mixdev,
-};
-
-/* AC97 codec initialisation. */
-static int __init cs_ac97_init(struct cs_card *card)
-{
-       int num_ac97 = 0;
-       int ready_2nd = 0;
-       struct ac97_codec *codec;
-       u16 eid;
-
-       CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO 
-               "cs46xx: cs_ac97_init()+\n") );
-
-       for (num_ac97 = 0; num_ac97 < NR_AC97; num_ac97++) {
-               if ((codec = ac97_alloc_codec()) == NULL)
-                       return -ENOMEM;
-
-               /* initialize some basic codec information, other fields will be filled
-                  in ac97_probe_codec */
-               codec->private_data = card;
-               codec->id = num_ac97;
-
-               codec->codec_read = cs_ac97_get;
-               codec->codec_write = cs_ac97_set;
-       
-               if (ac97_probe_codec(codec) == 0) {
-                       CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO 
-                               "cs46xx: cs_ac97_init()- codec number %d not found\n",
-                                       num_ac97) );
-                       card->ac97_codec[num_ac97] = NULL;
-                       break;
-               }
-               CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO 
-                       "cs46xx: cs_ac97_init() found codec %d\n",num_ac97));
-
-               eid = cs_ac97_get(codec, AC97_EXTENDED_ID);
-               
-               if (eid == 0xFFFF) {
-                       printk(KERN_WARNING "cs46xx: codec %d not present\n",num_ac97);
-                       ac97_release_codec(codec);
-                       break;
-               }
-               
-               card->ac97_features = eid;
-                       
-               if ((codec->dev_mixer = register_sound_mixer(&cs_mixer_fops, -1)) < 0) {
-                       printk(KERN_ERR "cs46xx: couldn't register mixer!\n");
-                       ac97_release_codec(codec);
-                       break;
-               }
-               card->ac97_codec[num_ac97] = codec;
-
-               CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO 
-                       "cs46xx: cs_ac97_init() ac97_codec[%d] set to %p\n",
-                               (unsigned int)num_ac97,
-                               codec));
-               /* if there is no secondary codec at all, don't probe any more */
-               if (!ready_2nd)
-               {
-                       num_ac97 += 1;
-                       break;
-               }
-       }
-       CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO 
-               "cs46xx: cs_ac97_init()- %d\n", (unsigned int)num_ac97));
-       return num_ac97;
-}
-
-/*
- * load the static image into the DSP
- */
-#include "cs461x_image.h"
-static void cs461x_download_image(struct cs_card *card)
-{
-    unsigned i, j, temp1, temp2, offset, count;
-    unsigned char __iomem *pBA1 = ioremap(card->ba1_addr, 0x40000);
-    for (i = 0; i < CLEAR__COUNT; i++) {
-        offset = ClrStat[i].BA1__DestByteOffset;
-        count  = ClrStat[i].BA1__SourceSize;
-        for (temp1 = offset; temp1 < (offset + count); temp1 += 4)
-              writel(0, pBA1+temp1);
-    }
-
-    for (i = 0; i < FILL__COUNT; i++) {
-        temp2 = FillStat[i].Offset;
-        for (j = 0; j < (FillStat[i].Size) / 4; j++) {
-            temp1 = (FillStat[i]).pFill[j];
-            writel(temp1, pBA1+temp2 + j * 4);
-        }
-    }
-    iounmap(pBA1);
-}
-
-/*
- *  Chip reset
- */
-
-static void cs461x_reset(struct cs_card *card)
-{
-       int idx;
-
-       /*
-        *  Write the reset bit of the SP control register.
-        */
-       cs461x_poke(card, BA1_SPCR, SPCR_RSTSP);
-
-       /*
-        *  Write the control register.
-        */
-       cs461x_poke(card, BA1_SPCR, SPCR_DRQEN);
-
-       /*
-        *  Clear the trap registers.
-        */
-       for (idx = 0; idx < 8; idx++) {
-               cs461x_poke(card, BA1_DREG, DREG_REGID_TRAP_SELECT + idx);
-               cs461x_poke(card, BA1_TWPR, 0xFFFF);
-       }
-       cs461x_poke(card, BA1_DREG, 0);
-
-       /*
-        *  Set the frame timer to reflect the number of cycles per frame.
-        */
-       cs461x_poke(card, BA1_FRMT, 0xadf);
-}
-
-static void cs461x_clear_serial_FIFOs(struct cs_card *card, int type)
-{
-       int idx, loop, startfifo=0, endfifo=0, powerdown1 = 0;
-       unsigned int tmp;
-
-       /*
-        *  See if the devices are powered down.  If so, we must power them up first
-        *  or they will not respond.
-        */
-       if (!((tmp = cs461x_peekBA0(card, BA0_CLKCR1)) & CLKCR1_SWCE)) {
-               cs461x_pokeBA0(card, BA0_CLKCR1, tmp | CLKCR1_SWCE);
-               powerdown1 = 1;
-       }
-
-       /*
-        *  We want to clear out the serial port FIFOs so we don't end up playing
-        *  whatever random garbage happens to be in them.  We fill the sample FIFOS
-        *  with zero (silence).
-         */
-       cs461x_pokeBA0(card, BA0_SERBWP, 0);
-
-       /*
-       * Check for which FIFO locations to clear, if we are currently
-       * playing or capturing then we don't want to put in 128 bytes of
-       * "noise".
-        */
-       if (type & CS_TYPE_DAC) {
-               startfifo = 128;
-               endfifo = 256;
-       }
-       if (type & CS_TYPE_ADC) {
-               startfifo = 0;
-               if (!endfifo)
-                       endfifo = 128;
-       }
-       /*
-        *  Fill sample FIFO locations (256 locations total).
-        */
-       for (idx = startfifo; idx < endfifo; idx++) {
-               /*
-                *  Make sure the previous FIFO write operation has completed.
-                */
-               for (loop = 0; loop < 5; loop++) {
-                       udelay(50);
-                       if (!(cs461x_peekBA0(card, BA0_SERBST) & SERBST_WBSY))
-                               break;
-               }
-               if (cs461x_peekBA0(card, BA0_SERBST) & SERBST_WBSY) {
-                       if (powerdown1)
-                               cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
-               }
-               /*
-                *  Write the serial port FIFO index.
-                */
-               cs461x_pokeBA0(card, BA0_SERBAD, idx);
-               /*
-                *  Tell the serial port to load the new value into the FIFO location.
-                */
-               cs461x_pokeBA0(card, BA0_SERBCM, SERBCM_WRC);
-       }
-       /*
-        *  Now, if we powered up the devices, then power them back down again.
-        *  This is kinda ugly, but should never happen.
-        */
-       if (powerdown1)
-               cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
-}
-
-
-static int cs461x_powerdown(struct cs_card *card, unsigned int type, int suspendflag)
-{
-       int count;
-       unsigned int tmp=0,muted=0;
-
-       CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO 
-               "cs46xx: cs461x_powerdown()+ type=0x%x\n",type));
-       if (!cs_powerdown && !suspendflag) {
-               CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO 
-                       "cs46xx: cs461x_powerdown() DISABLED exiting\n"));
-               return 0;
-       }
-       tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
-       CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO 
-               "cs46xx: cs461x_powerdown() powerdown reg=0x%x\n",tmp));
-/*
-* if powering down only the VREF, and not powering down the DAC/ADC,
-* then do not power down the VREF, UNLESS both the DAC and ADC are not
-* currently powered down.  If powering down DAC and ADC, then
-* it is possible to power down the VREF (ON).
-*/
-       if (((type & CS_POWER_MIXVON) &&
-                (!(type & CS_POWER_ADC) || (!(type & CS_POWER_DAC))))
-             && 
-               ((tmp & CS_AC97_POWER_CONTROL_ADC_ON) ||
-                (tmp & CS_AC97_POWER_CONTROL_DAC_ON))) {
-               CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO 
-                       "cs46xx: cs461x_powerdown()- 0  unable to powerdown. tmp=0x%x\n",tmp));
-               return 0;
-       }
-/*
-* for now, always keep power to the mixer block.
-* not sure why it's a problem but it seems to be if we power off.
-*/
-       type &= ~CS_POWER_MIXVON;
-       type &= ~CS_POWER_MIXVOFF;
-
-       /*
-        *  Power down indicated areas.
-        */
-       if (type & CS_POWER_MIXVOFF) {
-
-               CS_DBGOUT(CS_FUNCTION, 4, 
-                       printk(KERN_INFO "cs46xx: cs461x_powerdown()+ MIXVOFF\n"));
-               /*
-                *  Power down the MIXER (VREF ON) on the AC97 card.  
-                */
-               tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
-               if (tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON) {
-                       if (!muted) {
-                               cs_mute(card, CS_TRUE);
-                               muted = 1;
-                       }
-                       tmp |= CS_AC97_POWER_CONTROL_MIXVOFF;
-                       cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
-                       /*
-                        *  Now, we wait until we sample a ready state.
-                        */
-                       for (count = 0; count < 32; count++) {
-                               /*
-                                *  First, lets wait a short while to let things settle out a
-                                *  bit, and to prevent retrying the read too quickly.
-                                */
-                               udelay(500);
-
-                               /*
-                                *  Read the current state of the power control register.
-                                */
-                               if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
-                                       CS_AC97_POWER_CONTROL_MIXVOFF_ON))
-                                       break;
-                       }
-                       
-                       /*
-                        *  Check the status..
-                        */
-                       if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
-                               CS_AC97_POWER_CONTROL_MIXVOFF_ON) {
-                               CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
-                                       "cs46xx: powerdown MIXVOFF failed\n"));
-                               return 1;
-                       }
-               }
-       }
-       if (type & CS_POWER_MIXVON) {
-
-               CS_DBGOUT(CS_FUNCTION, 4, 
-                       printk(KERN_INFO "cs46xx: cs461x_powerdown()+ MIXVON\n"));
-               /*
-                *  Power down the MIXER (VREF ON) on the AC97 card.  
-                */
-               tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
-               if (tmp & CS_AC97_POWER_CONTROL_MIXVON_ON) {
-                       if (!muted) {
-                               cs_mute(card, CS_TRUE);
-                               muted = 1;
-                       }
-                       tmp |= CS_AC97_POWER_CONTROL_MIXVON;
-                       cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp);
-                       /*
-                        *  Now, we wait until we sample a ready state.
-                        */
-                       for (count = 0; count < 32; count++) {
-                               /*
-                                *  First, lets wait a short while to let things settle out a
-                                *  bit, and to prevent retrying the read too quickly.
-                                */
-                               udelay(500);
-
-                               /*
-                                *  Read the current state of the power control register.
-                                */
-                               if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
-                                       CS_AC97_POWER_CONTROL_MIXVON_ON))
-                                       break;
-                       }
-                       
-                       /*
-                        *  Check the status..
-                        */
-                       if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
-                               CS_AC97_POWER_CONTROL_MIXVON_ON) {
-                               CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
-                                       "cs46xx: powerdown MIXVON failed\n"));
-                               return 1;
-                       }
-               }
-       }
-       if (type & CS_POWER_ADC) {
-               /*
-                *  Power down the ADC on the AC97 card.  
-                */
-               CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs461x_powerdown()+ ADC\n"));
-               tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
-               if (tmp & CS_AC97_POWER_CONTROL_ADC_ON) {
-                       if (!muted) {
-                               cs_mute(card, CS_TRUE);
-                               muted = 1;
-                       }
-                       tmp |= CS_AC97_POWER_CONTROL_ADC;
-                       cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp);
-
-                       /*
-                        *  Now, we wait until we sample a ready state.
-                        */
-                       for (count = 0; count < 32; count++) {
-                               /*
-                                *  First, lets wait a short while to let things settle out a
-                                *  bit, and to prevent retrying the read too quickly.
-                                */
-                               udelay(500);
-
-                               /*
-                                *  Read the current state of the power control register.
-                                */
-                               if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
-                                       CS_AC97_POWER_CONTROL_ADC_ON))
-                                       break;
-                       }
-
-                       /*
-                        *  Check the status..
-                        */
-                       if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
-                               CS_AC97_POWER_CONTROL_ADC_ON) {
-                               CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
-                                       "cs46xx: powerdown ADC failed\n"));
-                               return 1;
-                       }
-               }
-       }
-       if (type & CS_POWER_DAC) {
-               /*
-                *  Power down the DAC on the AC97 card.  
-                */
-
-               CS_DBGOUT(CS_FUNCTION, 4, 
-                       printk(KERN_INFO "cs46xx: cs461x_powerdown()+ DAC\n"));
-               tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
-               if (tmp & CS_AC97_POWER_CONTROL_DAC_ON) {
-                       if (!muted) {
-                               cs_mute(card, CS_TRUE);
-                               muted = 1;
-                       }
-                       tmp |= CS_AC97_POWER_CONTROL_DAC;
-                       cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp);
-                       /*
-                        *  Now, we wait until we sample a ready state.
-                        */
-                       for (count = 0; count < 32; count++) {
-                               /*
-                                *  First, lets wait a short while to let things settle out a
-                                *  bit, and to prevent retrying the read too quickly.
-                                */
-                               udelay(500);
-
-                               /*
-                                *  Read the current state of the power control register.
-                                */
-                               if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
-                                       CS_AC97_POWER_CONTROL_DAC_ON))
-                                       break;
-                       }
-                       
-                       /*
-                        *  Check the status..
-                        */
-                       if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
-                               CS_AC97_POWER_CONTROL_DAC_ON) {
-                               CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
-                                       "cs46xx: powerdown DAC failed\n"));
-                               return 1;
-                       }
-               }
-       }
-       tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
-       if (muted)
-               cs_mute(card, CS_FALSE);
-       CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO 
-               "cs46xx: cs461x_powerdown()- 0 tmp=0x%x\n",tmp));
-       return 0;
-}
-
-static int cs46xx_powerup(struct cs_card *card, unsigned int type)
-{
-       int count;
-       unsigned int tmp = 0, muted = 0;
-
-       CS_DBGOUT(CS_FUNCTION, 8, printk(KERN_INFO 
-               "cs46xx: cs46xx_powerup()+ type=0x%x\n",type));
-       /*
-       * check for VREF and powerup if need to.
-       */
-       if (type & CS_POWER_MIXVON)
-               type |= CS_POWER_MIXVOFF;
-       if (type & (CS_POWER_DAC | CS_POWER_ADC))
-               type |= CS_POWER_MIXVON | CS_POWER_MIXVOFF;
-
-       /*
-        *  Power up indicated areas.
-        */
-       if (type & CS_POWER_MIXVOFF) {
-
-               CS_DBGOUT(CS_FUNCTION, 4, 
-                       printk(KERN_INFO "cs46xx: cs46xx_powerup()+ MIXVOFF\n"));
-               /*
-                *  Power up the MIXER (VREF ON) on the AC97 card.  
-                */
-               tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
-               if (!(tmp & CS_AC97_POWER_CONTROL_MIXVOFF_ON)) {
-                       if (!muted) {
-                               cs_mute(card, CS_TRUE);
-                               muted = 1;
-                       }
-                       tmp &= ~CS_AC97_POWER_CONTROL_MIXVOFF;
-                       cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
-                       /*
-                        *  Now, we wait until we sample a ready state.
-                        */
-                       for (count = 0; count < 32; count++) {
-                               /*
-                                *  First, lets wait a short while to let things settle out a
-                                *  bit, and to prevent retrying the read too quickly.
-                                */
-                               udelay(500);
-
-                               /*
-                                *  Read the current state of the power control register.
-                                */
-                               if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
-                                       CS_AC97_POWER_CONTROL_MIXVOFF_ON)
-                                       break;
-                       }
-                       
-                       /*
-                        *  Check the status..
-                        */
-                       if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
-                               CS_AC97_POWER_CONTROL_MIXVOFF_ON)) {
-                               CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
-                                       "cs46xx: powerup MIXVOFF failed\n"));
-                               return 1;
-                       }
-               }
-       }
-       if(type & CS_POWER_MIXVON) {
-
-               CS_DBGOUT(CS_FUNCTION, 4, 
-                       printk(KERN_INFO "cs46xx: cs46xx_powerup()+ MIXVON\n"));
-               /*
-                *  Power up the MIXER (VREF ON) on the AC97 card.  
-                */
-               tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
-               if (!(tmp & CS_AC97_POWER_CONTROL_MIXVON_ON)) {
-                       if (!muted) {
-                               cs_mute(card, CS_TRUE);
-                               muted = 1;
-                       }
-                       tmp &= ~CS_AC97_POWER_CONTROL_MIXVON;
-                       cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
-                       /*
-                        *  Now, we wait until we sample a ready state.
-                        */
-                       for (count = 0; count < 32; count++) {
-                               /*
-                                *  First, lets wait a short while to let things settle out a
-                                *  bit, and to prevent retrying the read too quickly.
-                                */
-                               udelay(500);
-
-                               /*
-                                *  Read the current state of the power control register.
-                                */
-                               if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
-                                       CS_AC97_POWER_CONTROL_MIXVON_ON)
-                                       break;
-                       }
-                       
-                       /*
-                        *  Check the status..
-                        */
-                       if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
-                               CS_AC97_POWER_CONTROL_MIXVON_ON)) {
-                               CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
-                                       "cs46xx: powerup MIXVON failed\n"));
-                               return 1;
-                       }
-               }
-       }
-       if (type & CS_POWER_ADC) {
-               /*
-                *  Power up the ADC on the AC97 card.  
-                */
-               CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO "cs46xx: cs46xx_powerup()+ ADC\n"));
-               tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
-               if (!(tmp & CS_AC97_POWER_CONTROL_ADC_ON)) {
-                       if (!muted) {
-                               cs_mute(card, CS_TRUE);
-                               muted = 1;
-                       }
-                       tmp &= ~CS_AC97_POWER_CONTROL_ADC;
-                       cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
-
-                       /*
-                        *  Now, we wait until we sample a ready state.
-                        */
-                       for (count = 0; count < 32; count++) {
-                               /*
-                                *  First, lets wait a short while to let things settle out a
-                                *  bit, and to prevent retrying the read too quickly.
-                                */
-                               udelay(500);
-
-                               /*
-                                *  Read the current state of the power control register.
-                                */
-                               if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
-                                       CS_AC97_POWER_CONTROL_ADC_ON)
-                                       break;
-                       }
-
-                       /*
-                        *  Check the status..
-                        */
-                       if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
-                               CS_AC97_POWER_CONTROL_ADC_ON)) {
-                               CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
-                                       "cs46xx: powerup ADC failed\n"));
-                               return 1;
-                       }
-               }
-       }
-       if (type & CS_POWER_DAC) {
-               /*
-                *  Power up the DAC on the AC97 card.  
-                */
-
-               CS_DBGOUT(CS_FUNCTION, 4, 
-                       printk(KERN_INFO "cs46xx: cs46xx_powerup()+ DAC\n"));
-               tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
-               if (!(tmp & CS_AC97_POWER_CONTROL_DAC_ON)) {
-                       if (!muted) {
-                               cs_mute(card, CS_TRUE);
-                               muted = 1;
-                       }
-                       tmp &= ~CS_AC97_POWER_CONTROL_DAC;
-                       cs_ac97_set(card->ac97_codec[0], AC97_POWER_CONTROL, tmp );
-                       /*
-                        *  Now, we wait until we sample a ready state.
-                        */
-                       for (count = 0; count < 32; count++) {
-                               /*
-                                *  First, lets wait a short while to let things settle out a
-                                *  bit, and to prevent retrying the read too quickly.
-                                */
-                               udelay(500);
-
-                               /*
-                                *  Read the current state of the power control register.
-                                */
-                               if (cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
-                                       CS_AC97_POWER_CONTROL_DAC_ON)
-                                       break;
-                       }
-                       
-                       /*
-                        *  Check the status..
-                        */
-                       if (!(cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL) & 
-                               CS_AC97_POWER_CONTROL_DAC_ON)) {
-                               CS_DBGOUT(CS_ERROR, 1, printk(KERN_WARNING 
-                                       "cs46xx: powerup DAC failed\n"));
-                               return 1;
-                       }
-               }
-       }
-       tmp = cs_ac97_get(card->ac97_codec[0], AC97_POWER_CONTROL);
-       if (muted)
-               cs_mute(card, CS_FALSE);
-       CS_DBGOUT(CS_FUNCTION, 4, printk(KERN_INFO 
-               "cs46xx: cs46xx_powerup()- 0 tmp=0x%x\n",tmp));
-       return 0;
-}
-
-static void cs461x_proc_start(struct cs_card *card)
-{
-       int cnt;
-
-       /*
-        *  Set the frame timer to reflect the number of cycles per frame.
-        */
-       cs461x_poke(card, BA1_FRMT, 0xadf);
-       /*
-        *  Turn on the run, run at frame, and DMA enable bits in the local copy of
-        *  the SP control register.
-        */
-       cs461x_poke(card, BA1_SPCR, SPCR_RUN | SPCR_RUNFR | SPCR_DRQEN);
-       /*
-        *  Wait until the run at frame bit resets itself in the SP control
-        *  register.
-        */
-       for (cnt = 0; cnt < 25; cnt++) {
-               udelay(50);
-               if (!(cs461x_peek(card, BA1_SPCR) & SPCR_RUNFR))
-                       break;
-       }
-
-       if (cs461x_peek(card, BA1_SPCR) & SPCR_RUNFR)
-               printk(KERN_WARNING "cs46xx: SPCR_RUNFR never reset\n");
-}
-
-static void cs461x_proc_stop(struct cs_card *card)
-{
-       /*
-        *  Turn off the run, run at frame, and DMA enable bits in the local copy of
-        *  the SP control register.
-        */
-       cs461x_poke(card, BA1_SPCR, 0);
-}
-
-static int cs_hardware_init(struct cs_card *card)
-{
-       unsigned long end_time;
-       unsigned int tmp,count;
-       
-       CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO 
-               "cs46xx: cs_hardware_init()+\n") );
-       /* 
-        *  First, blast the clock control register to zero so that the PLL starts
-         *  out in a known state, and blast the master serial port control register
-         *  to zero so that the serial ports also start out in a known state.
-         */
-        cs461x_pokeBA0(card, BA0_CLKCR1, 0);
-        cs461x_pokeBA0(card, BA0_SERMC1, 0);
-
-       /*
-        *  If we are in AC97 mode, then we must set the part to a host controlled
-         *  AC-link.  Otherwise, we won't be able to bring up the link.
-         */        
-        cs461x_pokeBA0(card, BA0_SERACC, SERACC_HSP | SERACC_CODEC_TYPE_1_03); /* 1.03 card */
-        /* cs461x_pokeBA0(card, BA0_SERACC, SERACC_HSP | SERACC_CODEC_TYPE_2_0); */ /* 2.00 card */
-
-        /*
-         *  Drive the ARST# pin low for a minimum of 1uS (as defined in the AC97
-         *  spec) and then drive it high.  This is done for non AC97 modes since
-         *  there might be logic external to the CS461x that uses the ARST# line
-         *  for a reset.
-         */
-        cs461x_pokeBA0(card, BA0_ACCTL, 1);
-        udelay(50);
-        cs461x_pokeBA0(card, BA0_ACCTL, 0);
-        udelay(50);
-        cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_RSTN);
-
-       /*
-        *  The first thing we do here is to enable sync generation.  As soon
-        *  as we start receiving bit clock, we'll start producing the SYNC
-        *  signal.
-        */
-       cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_ESYN | ACCTL_RSTN);
-
-       /*
-        *  Now wait for a short while to allow the AC97 part to start
-        *  generating bit clock (so we don't try to start the PLL without an
-        *  input clock).
-        */
-       mdelay(5 * cs_laptop_wait);             /* 1 should be enough ?? (and pigs might fly) */
-
-       /*
-        *  Set the serial port timing configuration, so that
-        *  the clock control circuit gets its clock from the correct place.
-        */
-       cs461x_pokeBA0(card, BA0_SERMC1, SERMC1_PTC_AC97);
-
-       /*
-       * The part seems to not be ready for a while after a resume.
-       * so, if we are resuming, then wait for 700 mils.  Note that 600 mils
-       * is not enough for some platforms! tested on an IBM Thinkpads and 
-       * reference cards.
-       */
-       if (!(card->pm.flags & CS46XX_PM_IDLE))
-               mdelay(initdelay);
-       /*
-        *  Write the selected clock control setup to the hardware.  Do not turn on
-        *  SWCE yet (if requested), so that the devices clocked by the output of
-        *  PLL are not clocked until the PLL is stable.
-        */
-       cs461x_pokeBA0(card, BA0_PLLCC, PLLCC_LPF_1050_2780_KHZ | PLLCC_CDR_73_104_MHZ);
-       cs461x_pokeBA0(card, BA0_PLLM, 0x3a);
-       cs461x_pokeBA0(card, BA0_CLKCR2, CLKCR2_PDIVS_8);
-
-       /*
-        *  Power up the PLL.
-        */
-       cs461x_pokeBA0(card, BA0_CLKCR1, CLKCR1_PLLP);
-
-       /*
-         *  Wait until the PLL has stabilized.
-        */
-       mdelay(5 * cs_laptop_wait);             /* Again 1 should be enough ?? */
-
-       /*
-        *  Turn on clocking of the core so that we can setup the serial ports.
-        */
-       tmp = cs461x_peekBA0(card, BA0_CLKCR1) | CLKCR1_SWCE;
-       cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
-
-       /*
-        *  Fill the serial port FIFOs with silence.
-        */
-       cs461x_clear_serial_FIFOs(card,CS_TYPE_DAC | CS_TYPE_ADC);
-
-       /*
-        *  Set the serial port FIFO pointer to the first sample in the FIFO.
-        */
-       /* cs461x_pokeBA0(card, BA0_SERBSP, 0); */
-
-       /*
-        *  Write the serial port configuration to the part.  The master
-        *  enable bit is not set until all other values have been written.
-        */
-       cs461x_pokeBA0(card, BA0_SERC1, SERC1_SO1F_AC97 | SERC1_SO1EN);
-       cs461x_pokeBA0(card, BA0_SERC2, SERC2_SI1F_AC97 | SERC1_SO1EN);
-       cs461x_pokeBA0(card, BA0_SERMC1, SERMC1_PTC_AC97 | SERMC1_MSPE);
-
-
-       mdelay(5 * cs_laptop_wait);             /* Shouldnt be needed ?? */
-       
-/*
-* If we are resuming under 2.2.x then we cannot schedule a timeout,
-* so just spin the CPU.
-*/
-       if (card->pm.flags & CS46XX_PM_IDLE) {
-       /*
-        * Wait for the card ready signal from the AC97 card.
-        */
-               end_time = jiffies + 3 * (HZ >> 2);
-               do {
-               /*
-                *  Read the AC97 status register to see if we've seen a CODEC READY
-                *  signal from the AC97 card.
-                */
-                       if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)
-                               break;
-                       current->state = TASK_UNINTERRUPTIBLE;
-                       schedule_timeout(1);
-               } while (time_before(jiffies, end_time));
-       } else {
-               for (count = 0; count < 100; count++) {
-               // First, we want to wait for a short time.
-                       udelay(25 * cs_laptop_wait);
-
-                       if (cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)
-                               break;
-               }
-       }
-
-       /*
-        *  Make sure CODEC is READY.
-        */
-       if (!(cs461x_peekBA0(card, BA0_ACSTS) & ACSTS_CRDY)) {
-               CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING  
-                       "cs46xx: create - never read card ready from AC'97\n"));
-               CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING  
-                       "cs46xx: probably not a bug, try using the CS4232 driver,\n"));
-               CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_WARNING  
-                       "cs46xx: or turn off any automatic Power Management support in the BIOS.\n"));
-               return -EIO;
-       }
-
-       /*
-        *  Assert the vaid frame signal so that we can start sending commands
-        *  to the AC97 card.
-        */
-       cs461x_pokeBA0(card, BA0_ACCTL, ACCTL_VFRM | ACCTL_ESYN | ACCTL_RSTN);
-
-       if (card->pm.flags & CS46XX_PM_IDLE) {
-       /*
-        *  Wait until we've sampled input slots 3 and 4 as valid, meaning that
-        *  the card is pumping ADC data across the AC-link.
-        */
-               end_time = jiffies + 3 * (HZ >> 2);
-               do {
-                       /*
-                        *  Read the input slot valid register and see if input slots 3 and
-                        *  4 are valid yet.
-                        */
-                       if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) == (ACISV_ISV3 | ACISV_ISV4))
-                               break;
-                       current->state = TASK_UNINTERRUPTIBLE;
-                       schedule_timeout(1);
-               } while (time_before(jiffies, end_time));
-       } else {
-               for (count = 0; count < 100; count++) {
-               // First, we want to wait for a short time.
-                       udelay(25 * cs_laptop_wait);
-
-                       if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) == (ACISV_ISV3 | ACISV_ISV4))
-                               break;
-               }
-       }
-       /*
-        *  Make sure input slots 3 and 4 are valid.  If not, then return
-        *  an error.
-        */
-       if ((cs461x_peekBA0(card, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) != (ACISV_ISV3 | ACISV_ISV4)) {
-               printk(KERN_WARNING "cs46xx: create - never read ISV3 & ISV4 from AC'97\n");
-               return -EIO;
-       }
-
-       /*
-        *  Now, assert valid frame and the slot 3 and 4 valid bits.  This will
-        *  commense the transfer of digital audio data to the AC97 card.
-        */
-       cs461x_pokeBA0(card, BA0_ACOSV, ACOSV_SLV3 | ACOSV_SLV4);
-
-       /*
-        *  Turn off the Processor by turning off the software clock enable flag in 
-        *  the clock control register.
-        */
-       /* tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE; */
-       /* cs461x_pokeBA0(card, BA0_CLKCR1, tmp); */
-
-       /*
-         *  Reset the processor.
-         */
-       cs461x_reset(card);
-
-       /*
-         *  Download the image to the processor.
-        */
-       
-       cs461x_download_image(card);
-
-       /*
-         *  Stop playback DMA.
-        */
-       tmp = cs461x_peek(card, BA1_PCTL);
-       card->pctl = tmp & 0xffff0000;
-       cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
-
-       /*
-         *  Stop capture DMA.
-        */
-       tmp = cs461x_peek(card, BA1_CCTL);
-       card->cctl = tmp & 0x0000ffff;
-       cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
-
-       /* initialize AC97 codec and register /dev/mixer */
-       if (card->pm.flags & CS46XX_PM_IDLE) {
-               if (cs_ac97_init(card) <= 0) {
-                       CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
-                               "cs46xx: cs_ac97_init() failure\n"));
-                       return -EIO;
-               }
-       } else {
-               cs46xx_ac97_resume(card);
-       }
-       
-       cs461x_proc_start(card);
-
-       /*
-        *  Enable interrupts on the part.
-        */
-       cs461x_pokeBA0(card, BA0_HICR, HICR_IEV | HICR_CHGM);
-
-       tmp = cs461x_peek(card, BA1_PFIE);
-       tmp &= ~0x0000f03f;
-       cs461x_poke(card, BA1_PFIE, tmp);       /* playback interrupt enable */
-
-       tmp = cs461x_peek(card, BA1_CIE);
-       tmp &= ~0x0000003f;
-       tmp |=  0x00000001;
-       cs461x_poke(card, BA1_CIE, tmp);        /* capture interrupt enable */  
-
-       /*
-        *  If IDLE then Power down the part.  We will power components up 
-        *  when we need them.  
-        */
-       if (card->pm.flags & CS46XX_PM_IDLE) {
-               if (!cs_powerdown) {
-                       if ((tmp = cs46xx_powerup(card, CS_POWER_DAC | CS_POWER_ADC |
-                                       CS_POWER_MIXVON))) {
-                               CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
-                                       "cs46xx: cs461x_powerup() failure (0x%x)\n",tmp) );
-                               return -EIO;
-                       }
-               } else {
-                       if ((tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
-                                       CS_POWER_MIXVON, CS_FALSE))) {
-                               CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
-                                       "cs46xx: cs461x_powerdown() failure (0x%x)\n",tmp) );
-                               return -EIO;
-                       }
-               }
-       }
-       CS_DBGOUT(CS_FUNCTION | CS_INIT, 2, printk(KERN_INFO 
-               "cs46xx: cs_hardware_init()- 0\n"));
-       return 0;
-}
-
-/* install the driver, we do not allocate hardware channel nor DMA buffer now, they are defered 
-   until "ACCESS" time (in prog_dmabuf called by open/read/write/ioctl/mmap) */
-   
-/*
- *     Card subid table
- */
-struct cs_card_type
-{
-       u16 vendor;
-       u16 id;
-       char *name;
-       void (*amp)(struct cs_card *, int);
-       void (*amp_init)(struct cs_card *);
-       void (*active)(struct cs_card *, int);
-};
-
-static struct cs_card_type cards[] = {
-       {
-               .vendor = 0x1489,
-               .id     = 0x7001,
-               .name   = "Genius Soundmaker 128 value",
-               .amp    = amp_none,
-       },
-       {
-               .vendor = 0x5053,
-               .id     = 0x3357,
-               .name   = "Voyetra",
-               .amp    = amp_voyetra,
-       },
-       {
-               .vendor = 0x1071,
-               .id     = 0x6003,
-               .name   = "Mitac MI6020/21",
-               .amp    = amp_voyetra,
-       },
-       {
-               .vendor = 0x14AF,
-               .id     = 0x0050,
-               .name   = "Hercules Game Theatre XP",
-               .amp    = amp_hercules,
-       },
-       {
-               .vendor = 0x1681,
-               .id     = 0x0050,
-               .name   = "Hercules Game Theatre XP",
-               .amp    = amp_hercules,
-       },
-       {
-               .vendor = 0x1681,
-               .id     = 0x0051,
-               .name   = "Hercules Game Theatre XP",
-               .amp    = amp_hercules,
-       },
-       {
-               .vendor = 0x1681,
-               .id     = 0x0052,
-               .name   = "Hercules Game Theatre XP",
-               .amp    = amp_hercules,
-       },
-       {
-               .vendor = 0x1681,
-               .id     = 0x0053,
-               .name   = "Hercules Game Theatre XP",
-               .amp    = amp_hercules,
-       },
-       {
-               .vendor = 0x1681,
-               .id     = 0x0054,
-               .name   = "Hercules Game Theatre XP",
-               .amp    = amp_hercules,
-       },
-       {
-               .vendor = 0x1681,
-               .id     = 0xa010,
-               .name   = "Hercules Fortissimo II",
-               .amp    = amp_none,
-       },
-       /* Not sure if the 570 needs the clkrun hack */
-       {
-               .vendor = PCI_VENDOR_ID_IBM,
-               .id     = 0x0132,
-               .name   = "Thinkpad 570",
-               .amp    = amp_none,
-               .active = clkrun_hack,
-       },
-       {
-               .vendor = PCI_VENDOR_ID_IBM,
-               .id     = 0x0153,
-               .name   = "Thinkpad 600X/A20/T20",
-               .amp    = amp_none,
-               .active = clkrun_hack,
-       },
-       {
-               .vendor = PCI_VENDOR_ID_IBM,
-               .id     = 0x1010,
-               .name   = "Thinkpad 600E (unsupported)",
-       },
-       {
-               .name   = "Card without SSID set",
-       },
-       { 0, },
-};
-
-MODULE_AUTHOR("Alan Cox <alan@redhat.com>, Jaroslav Kysela, <pcaudio@crystal.cirrus.com>");
-MODULE_DESCRIPTION("Crystal SoundFusion Audio Support");
-MODULE_LICENSE("GPL");
-
-static const char cs46xx_banner[] = KERN_INFO "Crystal 4280/46xx + AC97 Audio, version " CS46XX_MAJOR_VERSION "." CS46XX_MINOR_VERSION "." CS46XX_ARCH ", " __TIME__ " " __DATE__ "\n";
-static const char fndmsg[] = KERN_INFO "cs46xx: Found %d audio device(s).\n";
-
-static int __devinit cs46xx_probe(struct pci_dev *pci_dev,
-                                 const struct pci_device_id *pciid)
-{
-       int i, j;
-       u16 ss_card, ss_vendor;
-       struct cs_card *card;
-       dma_addr_t dma_mask;
-       struct cs_card_type *cp = &cards[0];
-
-       CS_DBGOUT(CS_FUNCTION | CS_INIT, 2,
-                 printk(KERN_INFO "cs46xx: probe()+\n"));
-
-       dma_mask = 0xffffffff;  /* this enables playback and recording */
-       if (pci_enable_device(pci_dev)) {
-               CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_ERR
-                        "cs46xx: pci_enable_device() failed\n"));
-               return -1;
-       }
-       if (!RSRCISMEMORYREGION(pci_dev, 0) ||
-           !RSRCISMEMORYREGION(pci_dev, 1)) {
-               CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
-                        "cs46xx: probe()- Memory region not assigned\n"));
-               return -1;
-       }
-       if (pci_dev->irq == 0) {
-               CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
-                        "cs46xx: probe() IRQ not assigned\n"));
-               return -1;
-       }
-       if (!pci_dma_supported(pci_dev, 0xffffffff)) {
-               CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
-                     "cs46xx: probe() architecture does not support 32bit PCI busmaster DMA\n"));
-               return -1;
-       }
-       pci_read_config_word(pci_dev, PCI_SUBSYSTEM_VENDOR_ID, &ss_vendor);
-       pci_read_config_word(pci_dev, PCI_SUBSYSTEM_ID, &ss_card);
-
-       if ((card = kzalloc(sizeof(struct cs_card), GFP_KERNEL)) == NULL) {
-               printk(KERN_ERR "cs46xx: out of memory\n");
-               return -ENOMEM;
-       }
-       card->ba0_addr = RSRCADDRESS(pci_dev, 0);
-       card->ba1_addr = RSRCADDRESS(pci_dev, 1);
-       card->pci_dev = pci_dev;
-       card->irq = pci_dev->irq;
-       card->magic = CS_CARD_MAGIC;
-       spin_lock_init(&card->lock);
-       spin_lock_init(&card->ac97_lock);
-
-       pci_set_master(pci_dev);
-
-       printk(cs46xx_banner);
-       printk(KERN_INFO "cs46xx: Card found at 0x%08lx and 0x%08lx, IRQ %d\n",
-              card->ba0_addr, card->ba1_addr, card->irq);
-
-       card->alloc_pcm_channel = cs_alloc_pcm_channel;
-       card->alloc_rec_pcm_channel = cs_alloc_rec_pcm_channel;
-       card->free_pcm_channel = cs_free_pcm_channel;
-       card->amplifier_ctrl = amp_none;
-       card->active_ctrl = amp_none;
-
-       while (cp->name)
-       {
-               if (cp->vendor == ss_vendor && cp->id == ss_card) {
-                       card->amplifier_ctrl = cp->amp;
-                       if (cp->active)
-                               card->active_ctrl = cp->active;
-                       if (cp->amp_init)
-                               card->amp_init = cp->amp_init;
-                       break;
-               }
-               cp++;
-       }
-       if (cp->name == NULL) {
-               printk(KERN_INFO "cs46xx: Unknown card (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %d\n",
-                       ss_vendor, ss_card, card->ba0_addr, card->ba1_addr,  card->irq);
-       } else {
-               printk(KERN_INFO "cs46xx: %s (%04X:%04X) at 0x%08lx/0x%08lx, IRQ %d\n",
-                       cp->name, ss_vendor, ss_card, card->ba0_addr, card->ba1_addr, card->irq);
-       }
-       
-       if (card->amplifier_ctrl == NULL) {
-               card->amplifier_ctrl = amp_none;
-               card->active_ctrl = clkrun_hack;
-       }               
-
-       if (external_amp == 1) {
-               printk(KERN_INFO "cs46xx: Crystal EAPD support forced on.\n");
-               card->amplifier_ctrl = amp_voyetra;
-       }
-
-       if (thinkpad == 1) {
-               printk(KERN_INFO "cs46xx: Activating CLKRUN hack for Thinkpad.\n");
-               card->active_ctrl = clkrun_hack;
-       }
-/*
-* The thinkpads don't work well without runtime updating on their kernel 
-* delay values (or any laptop with variable CPU speeds really).
-* so, just to be safe set the init delay to 2100.  Eliminates
-* failures on T21 Thinkpads.  remove this code when the udelay
-* and mdelay kernel code is replaced by a pm timer, or the delays
-* work well for battery and/or AC power both.
-*/
-       if (card->active_ctrl == clkrun_hack) {
-               initdelay = 2100;
-               cs_laptop_wait = 5;
-       }
-       if ((card->active_ctrl == clkrun_hack) && !(powerdown == 1)) {
-/*
-* for some currently unknown reason, powering down the DAC and ADC component
-* blocks on thinkpads causes some funky behavior... distoorrrtion and ac97 
-* codec access problems.  probably the serial clock becomes unsynced. 
-* added code to sync the chips back up, but only helped about 70% the time.
-*/
-               cs_powerdown = 0;
-       }
-       if (powerdown == 0)
-               cs_powerdown = 0;
-       card->active_ctrl(card, 1);
-
-       /* claim our iospace and irq */
-       
-       card->ba0 = ioremap_nocache(card->ba0_addr, CS461X_BA0_SIZE);
-       card->ba1.name.data0 = ioremap_nocache(card->ba1_addr + BA1_SP_DMEM0, CS461X_BA1_DATA0_SIZE);
-       card->ba1.name.data1 = ioremap_nocache(card->ba1_addr + BA1_SP_DMEM1, CS461X_BA1_DATA1_SIZE);
-       card->ba1.name.pmem = ioremap_nocache(card->ba1_addr + BA1_SP_PMEM, CS461X_BA1_PRG_SIZE);
-       card->ba1.name.reg = ioremap_nocache(card->ba1_addr + BA1_SP_REG, CS461X_BA1_REG_SIZE);
-       
-       CS_DBGOUT(CS_INIT, 4, printk(KERN_INFO 
-               "cs46xx: card=%p card->ba0=%p\n",card,card->ba0) );
-       CS_DBGOUT(CS_INIT, 4, printk(KERN_INFO 
-               "cs46xx: card->ba1=%p %p %p %p\n",
-                       card->ba1.name.data0,
-                       card->ba1.name.data1,
-                       card->ba1.name.pmem,
-                       card->ba1.name.reg) );
-
-       if (card->ba0 == 0 || card->ba1.name.data0 == 0 ||
-               card->ba1.name.data1 == 0 || card->ba1.name.pmem == 0 ||
-               card->ba1.name.reg == 0)
-               goto fail2;
-               
-       if (request_irq(card->irq, &cs_interrupt, IRQF_SHARED, "cs46xx", card)) {
-               printk(KERN_ERR "cs46xx: unable to allocate irq %d\n", card->irq);
-               goto fail2;
-       }
-       /* register /dev/dsp */
-       if ((card->dev_audio = register_sound_dsp(&cs461x_fops, -1)) < 0) {
-               printk(KERN_ERR "cs46xx: unable to register dsp\n");
-               goto fail;
-       }
-
-        /* register /dev/midi */
-        if ((card->dev_midi = register_sound_midi(&cs_midi_fops, -1)) < 0)
-                printk(KERN_ERR "cs46xx: unable to register midi\n");
-                
-       card->pm.flags |= CS46XX_PM_IDLE;
-       for (i = 0; i < 5; i++) {
-               if (cs_hardware_init(card) != 0) {
-                       CS_DBGOUT(CS_ERROR, 4, printk(
-                               "cs46xx: ERROR in cs_hardware_init()... retrying\n"));
-                       for (j = 0; j < NR_AC97; j++)
-                               if (card->ac97_codec[j] != NULL) {
-                                       unregister_sound_mixer(card->ac97_codec[j]->dev_mixer);
-                                       ac97_release_codec(card->ac97_codec[j]);
-                               }
-                       mdelay(10 * cs_laptop_wait);
-                       continue;
-               }
-               break;
-       }
-       if(i >= 4) {
-               CS_DBGOUT(CS_PM | CS_ERROR, 1, printk(
-                       "cs46xx: cs46xx_probe()- cs_hardware_init() failed, retried %d times.\n",i));
-                unregister_sound_dsp(card->dev_audio);
-                if (card->dev_midi)
-                        unregister_sound_midi(card->dev_midi);
-                goto fail;
-       }
-
-        init_waitqueue_head(&card->midi.open_wait);
-        mutex_init(&card->midi.open_mutex);
-        init_waitqueue_head(&card->midi.iwait);
-        init_waitqueue_head(&card->midi.owait);
-        cs461x_pokeBA0(card, BA0_MIDCR, MIDCR_MRST);   
-        cs461x_pokeBA0(card, BA0_MIDCR, 0);   
-
-       /* 
-       * Check if we have to init the amplifier, but probably already done
-       * since the CD logic in the ac97 init code will turn on the ext amp.
-       */
-       if (cp->amp_init)
-               cp->amp_init(card);
-        card->active_ctrl(card, -1);
-
-       PCI_SET_DRIVER_DATA(pci_dev, card);
-       PCI_SET_DMA_MASK(pci_dev, dma_mask);
-       list_add(&card->list, &cs46xx_devs);
-
-       CS_DBGOUT(CS_PM, 9, printk(KERN_INFO "cs46xx: pm.flags=0x%x card=%p\n",
-               (unsigned)card->pm.flags,card));
-
-       CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
-               "cs46xx: probe()- device allocated successfully\n"));
-        return 0;
-
-fail:
-       free_irq(card->irq, card);
-fail2:
-       if (card->ba0)
-               iounmap(card->ba0);
-       if (card->ba1.name.data0)
-               iounmap(card->ba1.name.data0);
-       if (card->ba1.name.data1)
-               iounmap(card->ba1.name.data1);
-       if (card->ba1.name.pmem)
-               iounmap(card->ba1.name.pmem);
-       if (card->ba1.name.reg)
-               iounmap(card->ba1.name.reg);
-       kfree(card);
-       CS_DBGOUT(CS_INIT | CS_ERROR, 1, printk(KERN_INFO
-               "cs46xx: probe()- no device allocated\n"));
-       return -ENODEV;
-} // probe_cs46xx
-
-// --------------------------------------------------------------------- 
-
-static void __devexit cs46xx_remove(struct pci_dev *pci_dev)
-{
-       struct cs_card *card = PCI_GET_DRIVER_DATA(pci_dev);
-       int i;
-       unsigned int tmp;
-       
-       CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
-                "cs46xx: cs46xx_remove()+\n"));
-
-       card->active_ctrl(card,1);
-       
-       tmp = cs461x_peek(card, BA1_PFIE);
-       tmp &= ~0x0000f03f;
-       tmp |=  0x00000010;
-       cs461x_poke(card, BA1_PFIE, tmp);       /* playback interrupt disable */
-
-       tmp = cs461x_peek(card, BA1_CIE);
-       tmp &= ~0x0000003f;
-       tmp |=  0x00000011;
-       cs461x_poke(card, BA1_CIE, tmp);        /* capture interrupt disable */
-
-       /*
-         *  Stop playback DMA.
-        */
-       tmp = cs461x_peek(card, BA1_PCTL);
-       cs461x_poke(card, BA1_PCTL, tmp & 0x0000ffff);
-
-       /*
-         *  Stop capture DMA.
-        */
-       tmp = cs461x_peek(card, BA1_CCTL);
-       cs461x_poke(card, BA1_CCTL, tmp & 0xffff0000);
-
-       /*
-         *  Reset the processor.
-         */
-       cs461x_reset(card);
-
-       cs461x_proc_stop(card);
-
-       /*
-        *  Power down the DAC and ADC.  We will power them up (if) when we need
-        *  them.
-        */
-       if ((tmp = cs461x_powerdown(card, CS_POWER_DAC | CS_POWER_ADC |
-                       CS_POWER_MIXVON, CS_TRUE))) {
-               CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk(KERN_INFO 
-                       "cs46xx: cs461x_powerdown() failure (0x%x)\n",tmp) );
-       }
-
-       /*
-        *  Power down the PLL.
-        */
-       cs461x_pokeBA0(card, BA0_CLKCR1, 0);
-
-       /*
-        *  Turn off the Processor by turning off the software clock enable flag in 
-        *  the clock control register.
-        */
-       tmp = cs461x_peekBA0(card, BA0_CLKCR1) & ~CLKCR1_SWCE;
-       cs461x_pokeBA0(card, BA0_CLKCR1, tmp);
-
-       card->active_ctrl(card,-1);
-
-       /* free hardware resources */
-       free_irq(card->irq, card);
-       iounmap(card->ba0);
-       iounmap(card->ba1.name.data0);
-       iounmap(card->ba1.name.data1);
-       iounmap(card->ba1.name.pmem);
-       iounmap(card->ba1.name.reg);
-       
-       /* unregister audio devices */
-       for (i = 0; i < NR_AC97; i++)
-               if (card->ac97_codec[i] != NULL) {
-                       unregister_sound_mixer(card->ac97_codec[i]->dev_mixer);
-                       ac97_release_codec(card->ac97_codec[i]);
-               }
-       unregister_sound_dsp(card->dev_audio);
-        if (card->dev_midi)
-                unregister_sound_midi(card->dev_midi);
-       list_del(&card->list);
-       kfree(card);
-       PCI_SET_DRIVER_DATA(pci_dev,NULL);
-
-       CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO
-                "cs46xx: cs46xx_remove()-: remove successful\n"));
-}
-
-enum {
-       CS46XX_4610 = 0,
-       CS46XX_4612,    /* same as 4630 */
-       CS46XX_4615,    /* same as 4624 */
-};
-
-static struct pci_device_id cs46xx_pci_tbl[] = {
-       {
-               .vendor      = PCI_VENDOR_ID_CIRRUS,
-               .device      = PCI_DEVICE_ID_CIRRUS_4610,
-               .subvendor   = PCI_ANY_ID,
-               .subdevice   = PCI_ANY_ID,
-               .driver_data = CS46XX_4610,
-       },
-       {
-               .vendor      = PCI_VENDOR_ID_CIRRUS,
-               .device      = PCI_DEVICE_ID_CIRRUS_4612,
-               .subvendor   = PCI_ANY_ID,
-               .subdevice   = PCI_ANY_ID,
-               .driver_data = CS46XX_4612,
-       },
-       {
-               .vendor      = PCI_VENDOR_ID_CIRRUS,
-               .device      = PCI_DEVICE_ID_CIRRUS_4615,
-               .subvendor   = PCI_ANY_ID,
-               .subdevice   = PCI_ANY_ID,
-               .driver_data = CS46XX_4615,
-       },
-       { 0, },
-};
-
-MODULE_DEVICE_TABLE(pci, cs46xx_pci_tbl);
-
-static struct pci_driver cs46xx_pci_driver = {
-       .name     = "cs46xx",
-       .id_table = cs46xx_pci_tbl,
-       .probe    = cs46xx_probe,
-       .remove   = __devexit_p(cs46xx_remove),
-#ifdef CONFIG_PM
-       .suspend  = cs46xx_suspend_tbl,
-       .resume   = cs46xx_resume_tbl,
-#endif
-};
-
-static int __init cs46xx_init_module(void)
-{
-       int rtn = 0;
-       CS_DBGOUT(CS_INIT | CS_FUNCTION, 2, printk(KERN_INFO 
-               "cs46xx: cs46xx_init_module()+ \n"));
-       rtn = pci_register_driver(&cs46xx_pci_driver);
-
-       if (rtn == -ENODEV) {
-               CS_DBGOUT(CS_ERROR | CS_INIT, 1, printk( 
-                       "cs46xx: Unable to detect valid cs46xx device\n"));
-       }
-
-       CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
-                 printk(KERN_INFO "cs46xx: cs46xx_init_module()- (%d)\n",rtn));
-       return rtn;
-}
-
-static void __exit cs46xx_cleanup_module(void)
-{
-       pci_unregister_driver(&cs46xx_pci_driver);
-       CS_DBGOUT(CS_INIT | CS_FUNCTION, 2,
-                 printk(KERN_INFO "cs46xx: cleanup_cs46xx() finished\n"));
-}
-
-module_init(cs46xx_init_module);
-module_exit(cs46xx_cleanup_module);
-
-#ifdef CONFIG_PM
-static int cs46xx_suspend_tbl(struct pci_dev *pcidev, pm_message_t state)
-{
-       struct cs_card *s = PCI_GET_DRIVER_DATA(pcidev);
-       CS_DBGOUT(CS_PM | CS_FUNCTION, 2, 
-               printk(KERN_INFO "cs46xx: cs46xx_suspend_tbl request\n"));
-       cs46xx_suspend(s, state);
-       return 0;
-}
-
-static int cs46xx_resume_tbl(struct pci_dev *pcidev)
-{
-       struct cs_card *s = PCI_GET_DRIVER_DATA(pcidev);
-       CS_DBGOUT(CS_PM | CS_FUNCTION, 2, 
-               printk(KERN_INFO "cs46xx: cs46xx_resume_tbl request\n"));
-       cs46xx_resume(s);
-       return 0;
-}
-#endif
diff --git a/sound/oss/cs46xx_wrapper-24.h b/sound/oss/cs46xx_wrapper-24.h
deleted file mode 100644 (file)
index f68e011..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
-*
-*      "cs46xx_wrapper.c" --  Cirrus Logic-Crystal CS46XX linux audio driver.
-*
-*      Copyright (C) 2000,2001  Cirrus Logic Corp.  
-*            -- tom woller (twoller@crystal.cirrus.com) or
-*               (pcaudio@crystal.cirrus.com).
-*
-*      This program is free software; you can redistribute it and/or modify
-*      it under the terms of the GNU General Public License as published by
-*      the Free Software Foundation; either version 2 of the License, or
-*      (at your option) any later version.
-*
-*      This program is distributed in the hope that it will be useful,
-*      but WITHOUT ANY WARRANTY; without even the implied warranty of
-*      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*      GNU General Public License for more details.
-*
-*      You should have received a copy of the GNU General Public License
-*      along with this program; if not, write to the Free Software
-*      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*
-* 01/11/2001 trw - new file from cs4281 wrapper code. 
-*
-*******************************************************************************/
-#ifndef __CS46XX_WRAPPER24_H
-#define __CS46XX_WRAPPER24_H
-
-#include <linux/spinlock.h>
-
-#define CS_OWNER .owner =
-#define CS_THIS_MODULE THIS_MODULE,
-static inline void cs46xx_null(struct pci_dev *pcidev) { return; }
-#define cs4x_mem_map_reserve(page) SetPageReserved(page)
-#define cs4x_mem_map_unreserve(page) ClearPageReserved(page)
-
-#define free_dmabuf(card, dmabuf) \
-       pci_free_consistent((card)->pci_dev, \
-                           PAGE_SIZE << (dmabuf)->buforder, \
-                           (dmabuf)->rawbuf, (dmabuf)->dmaaddr);
-#define free_dmabuf2(card, dmabuf) \
-       pci_free_consistent((card)->pci_dev, \
-                                   PAGE_SIZE << (dmabuf)->buforder_tmpbuff, \
-                                   (dmabuf)->tmpbuff, (dmabuf)->dmaaddr_tmpbuff);
-#define cs4x_pgoff(vma) ((vma)->vm_pgoff)
-
-#define RSRCISIOREGION(dev,num) ((dev)->resource[(num)].start != 0 && \
-        ((dev)->resource[(num)].flags & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO)
-#define RSRCISMEMORYREGION(dev,num) ((dev)->resource[(num)].start != 0 && \
-        ((dev)->resource[(num)].flags & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_MEMORY)
-#define RSRCADDRESS(dev,num) ((dev)->resource[(num)].start)
-#define PCI_GET_DRIVER_DATA pci_get_drvdata
-#define PCI_SET_DRIVER_DATA pci_set_drvdata
-#define PCI_SET_DMA_MASK(pcidev,mask) pcidev->dma_mask = mask
-
-#endif
diff --git a/sound/oss/cs46xxpm.h b/sound/oss/cs46xxpm.h
deleted file mode 100644 (file)
index 2932b6e..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
-*
-*      "cs46xxpm.h" --  Cirrus Logic-Crystal CS46XX linux audio driver.
-*
-*      Copyright (C) 2000,2001  Cirrus Logic Corp.  
-*            -- tom woller (twoller@crystal.cirrus.com) or
-*               (pcaudio@crystal.cirrus.com).
-*
-*      This program is free software; you can redistribute it and/or modify
-*      it under the terms of the GNU General Public License as published by
-*      the Free Software Foundation; either version 2 of the License, or
-*      (at your option) any later version.
-*
-*      This program is distributed in the hope that it will be useful,
-*      but WITHOUT ANY WARRANTY; without even the implied warranty of
-*      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*      GNU General Public License for more details.
-*
-*      You should have received a copy of the GNU General Public License
-*      along with this program; if not, write to the Free Software
-*      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*
-* 12/22/00 trw - new file. 
-*
-*******************************************************************************/
-#ifndef __CS46XXPM_H
-#define __CS46XXPM_H
-
-#define CS46XX_AC97_HIGHESTREGTORESTORE 0x26
-#define CS46XX_AC97_NUMBER_RESTORE_REGS (CS46XX_AC97_HIGHESTREGTORESTORE/2-1)
-
-/* PM state defintions */
-#define CS46XX_PM_NOT_REGISTERED       0x1000
-#define CS46XX_PM_IDLE                 0x0001
-#define CS46XX_PM_SUSPENDING           0x0002
-#define CS46XX_PM_SUSPENDED            0x0004
-#define CS46XX_PM_RESUMING             0x0008
-#define CS46XX_PM_RESUMED              0x0010
-
-#define CS_POWER_DAC                   0x0001
-#define CS_POWER_ADC                   0x0002
-#define CS_POWER_MIXVON                        0x0004
-#define CS_POWER_MIXVOFF               0x0008
-#define CS_AC97_POWER_CONTROL_ON       0xf000  /* always on bits (inverted) */
-#define CS_AC97_POWER_CONTROL_ADC      0x0100
-#define CS_AC97_POWER_CONTROL_DAC      0x0200
-#define CS_AC97_POWER_CONTROL_MIXVON   0x0400
-#define CS_AC97_POWER_CONTROL_MIXVOFF  0x0800
-#define CS_AC97_POWER_CONTROL_ADC_ON   0x0001
-#define CS_AC97_POWER_CONTROL_DAC_ON   0x0002
-#define CS_AC97_POWER_CONTROL_MIXVON_ON        0x0004
-#define CS_AC97_POWER_CONTROL_MIXVOFF_ON 0x0008
-
-struct cs46xx_pm {
-       unsigned long flags;
-       u32 u32CLKCR1_SAVE,u32SSPMValue,u32PPLVCvalue,u32PPRVCvalue;
-       u32 u32FMLVCvalue,u32FMRVCvalue,u32GPIORvalue,u32JSCTLvalue,u32SSCR;
-       u32 u32SRCSA,u32DacASR,u32AdcASR,u32DacSR,u32AdcSR,u32MIDCR_Save;
-       u32 u32SSPM_BITS;
-       u32 ac97[CS46XX_AC97_NUMBER_RESTORE_REGS];
-       u32 u32AC97_master_volume, u32AC97_headphone_volume, u32AC97_master_volume_mono;
-       u32 u32AC97_pcm_out_volume, u32AC97_powerdown, u32AC97_general_purpose;
-       u32 u32hwptr_playback,u32hwptr_capture;
-       unsigned dmabuf_swptr_play;
-       int dmabuf_count_play;
-       unsigned dmabuf_swptr_capture;
-       int dmabuf_count_capture;
-};
-
-#endif
diff --git a/sound/oss/emu10k1/8010.h b/sound/oss/emu10k1/8010.h
deleted file mode 100644 (file)
index 61c6c42..0000000
+++ /dev/null
@@ -1,737 +0,0 @@
-/*
- **********************************************************************
- *     8010.h
- *     Copyright 1999-2001 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                Author          Summary of changes
- *     ----                ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *     November 2, 1999     Alan Cox       Cleaned of 8bit chars, DOS
- *                                         line endings
- *     December 8, 1999     Jon Taylor     Added lots of new register info
- *     May 16, 2001         Daniel Bertrand Added unofficial DBG register info
- *     Oct-Nov 2001         D.B.            Added unofficial Audigy registers 
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- *
- **********************************************************************
- */
-
-
-#ifndef _8010_H
-#define _8010_H
-
-#include <linux/types.h>
-
-// Driver version:
-#define MAJOR_VER 0
-#define MINOR_VER 20
-#define DRIVER_VERSION "0.20a"
-
-
-// Audigy specify registers are prefixed with 'A_'
-
-/************************************************************************************************/
-/* PCI function 0 registers, address = <val> + PCIBASE0                                                */
-/************************************************************************************************/
-
-#define PTR                    0x00            /* Indexed register set pointer register        */
-                                               /* NOTE: The CHANNELNUM and ADDRESS words can   */
-                                               /* be modified independently of each other.     */
-#define PTR_CHANNELNUM_MASK    0x0000003f      /* For each per-channel register, indicates the */
-                                               /* channel number of the register to be         */
-                                               /* accessed.  For non per-channel registers the */
-                                               /* value should be set to zero.                 */
-#define PTR_ADDRESS_MASK       0x07ff0000      /* Register index                               */
-
-#define DATA                   0x04            /* Indexed register set data register           */
-
-#define IPR                    0x08            /* Global interrupt pending register            */
-                                               /* Clear pending interrupts by writing a 1 to   */
-                                               /* the relevant bits and zero to the other bits */
-
-/* The next two interrupts are for the midi port on the Audigy Drive (A_MPU1)                  */
-#define A_IPR_MIDITRANSBUFEMPTY2       0x10000000      /* MIDI UART transmit buffer empty              */
-#define A_IPR_MIDIRECVBUFEMPTY2        0x08000000      /* MIDI UART receive buffer empty               */
-
-#define IPR_SAMPLERATETRACKER  0x01000000      /* Sample rate tracker lock status change       */
-#define IPR_FXDSP              0x00800000      /* Enable FX DSP interrupts                     */
-#define IPR_FORCEINT           0x00400000      /* Force Sound Blaster interrupt                */
-#define IPR_PCIERROR           0x00200000      /* PCI bus error                                */
-#define IPR_VOLINCR            0x00100000      /* Volume increment button pressed              */
-#define IPR_VOLDECR            0x00080000      /* Volume decrement button pressed              */
-#define IPR_MUTE               0x00040000      /* Mute button pressed                          */
-#define IPR_MICBUFFULL         0x00020000      /* Microphone buffer full                       */
-#define IPR_MICBUFHALFFULL     0x00010000      /* Microphone buffer half full                  */
-#define IPR_ADCBUFFULL         0x00008000      /* ADC buffer full                              */
-#define IPR_ADCBUFHALFFULL     0x00004000      /* ADC buffer half full                         */
-#define IPR_EFXBUFFULL         0x00002000      /* Effects buffer full                          */
-#define IPR_EFXBUFHALFFULL     0x00001000      /* Effects buffer half full                     */
-#define IPR_GPSPDIFSTATUSCHANGE        0x00000800      /* GPSPDIF channel status change                */
-#define IPR_CDROMSTATUSCHANGE  0x00000400      /* CD-ROM channel status change                 */
-#define IPR_INTERVALTIMER      0x00000200      /* Interval timer terminal count                */
-#define IPR_MIDITRANSBUFEMPTY  0x00000100      /* MIDI UART transmit buffer empty              */
-#define IPR_MIDIRECVBUFEMPTY   0x00000080      /* MIDI UART receive buffer empty               */
-#define IPR_CHANNELLOOP                0x00000040      /* One or more channel loop interrupts pending  */
-#define IPR_CHANNELNUMBERMASK  0x0000003f      /* When IPR_CHANNELLOOP is set, indicates the   */
-                                               /* Highest set channel in CLIPL or CLIPH.  When */
-                                               /* IP is written with CL set, the bit in CLIPL  */
-                                               /* or CLIPH corresponding to the CIN value      */
-                                               /* written will be cleared.                     */
-#define A_IPR_MIDITRANSBUFEMPTY1       IPR_MIDITRANSBUFEMPTY   /* MIDI UART transmit buffer empty              */
-#define A_IPR_MIDIRECVBUFEMPTY1        IPR_MIDIRECVBUFEMPTY    /* MIDI UART receive buffer empty               */
-
-
-
-#define INTE                   0x0c            /* Interrupt enable register                    */
-#define INTE_VIRTUALSB_MASK    0xc0000000      /* Virtual Soundblaster I/O port capture        */
-#define INTE_VIRTUALSB_220     0x00000000      /* Capture at I/O base address 0x220-0x22f      */
-#define INTE_VIRTUALSB_240     0x40000000      /* Capture at I/O base address 0x240            */
-#define INTE_VIRTUALSB_260     0x80000000      /* Capture at I/O base address 0x260            */
-#define INTE_VIRTUALSB_280     0xc0000000      /* Capture at I/O base address 0x280            */
-#define INTE_VIRTUALMPU_MASK   0x30000000      /* Virtual MPU I/O port capture                 */
-#define INTE_VIRTUALMPU_300    0x00000000      /* Capture at I/O base address 0x300-0x301      */
-#define INTE_VIRTUALMPU_310    0x10000000      /* Capture at I/O base address 0x310            */
-#define INTE_VIRTUALMPU_320    0x20000000      /* Capture at I/O base address 0x320            */
-#define INTE_VIRTUALMPU_330    0x30000000      /* Capture at I/O base address 0x330            */
-#define INTE_MASTERDMAENABLE   0x08000000      /* Master DMA emulation at 0x000-0x00f          */
-#define INTE_SLAVEDMAENABLE    0x04000000      /* Slave DMA emulation at 0x0c0-0x0df           */
-#define INTE_MASTERPICENABLE   0x02000000      /* Master PIC emulation at 0x020-0x021          */
-#define INTE_SLAVEPICENABLE    0x01000000      /* Slave PIC emulation at 0x0a0-0x0a1           */
-#define INTE_VSBENABLE         0x00800000      /* Enable virtual Soundblaster                  */
-#define INTE_ADLIBENABLE       0x00400000      /* Enable AdLib emulation at 0x388-0x38b        */
-#define INTE_MPUENABLE         0x00200000      /* Enable virtual MPU                           */
-#define INTE_FORCEINT          0x00100000      /* Continuously assert INTAN                    */
-
-#define INTE_MRHANDENABLE      0x00080000      /* Enable the "Mr. Hand" logic                  */
-                                               /* NOTE: There is no reason to use this under   */
-                                               /* Linux, and it will cause odd hardware        */
-                                               /* behavior and possibly random segfaults and   */
-                                               /* lockups if enabled.                          */
-
-/* The next two interrupts are for the midi port on the Audigy Drive (A_MPU1)                  */
-#define A_INTE_MIDITXENABLE2   0x00020000      /* Enable MIDI transmit-buffer-empty interrupts */
-#define A_INTE_MIDIRXENABLE2   0x00010000      /* Enable MIDI receive-buffer-empty interrupts  */
-
-
-#define INTE_SAMPLERATETRACKER 0x00002000      /* Enable sample rate tracker interrupts        */
-                                               /* NOTE: This bit must always be enabled        */
-#define INTE_FXDSPENABLE       0x00001000      /* Enable FX DSP interrupts                     */
-#define INTE_PCIERRORENABLE    0x00000800      /* Enable PCI bus error interrupts              */
-#define INTE_VOLINCRENABLE     0x00000400      /* Enable volume increment button interrupts    */
-#define INTE_VOLDECRENABLE     0x00000200      /* Enable volume decrement button interrupts    */
-#define INTE_MUTEENABLE                0x00000100      /* Enable mute button interrupts                */
-#define INTE_MICBUFENABLE      0x00000080      /* Enable microphone buffer interrupts          */
-#define INTE_ADCBUFENABLE      0x00000040      /* Enable ADC buffer interrupts                 */
-#define INTE_EFXBUFENABLE      0x00000020      /* Enable Effects buffer interrupts             */
-#define INTE_GPSPDIFENABLE     0x00000010      /* Enable GPSPDIF status interrupts             */
-#define INTE_CDSPDIFENABLE     0x00000008      /* Enable CDSPDIF status interrupts             */
-#define INTE_INTERVALTIMERENB  0x00000004      /* Enable interval timer interrupts             */
-#define INTE_MIDITXENABLE      0x00000002      /* Enable MIDI transmit-buffer-empty interrupts */
-#define INTE_MIDIRXENABLE      0x00000001      /* Enable MIDI receive-buffer-empty interrupts  */
-
-/* The next two interrupts are for the midi port on the Audigy (A_MPU2)        */
-#define A_INTE_MIDITXENABLE1   INTE_MIDITXENABLE
-#define A_INTE_MIDIRXENABLE1   INTE_MIDIRXENABLE
-
-#define WC                     0x10            /* Wall Clock register                          */
-#define WC_SAMPLECOUNTER_MASK  0x03FFFFC0      /* Sample periods elapsed since reset           */
-#define WC_SAMPLECOUNTER       0x14060010
-#define WC_CURRENTCHANNEL      0x0000003F      /* Channel [0..63] currently being serviced     */
-                                               /* NOTE: Each channel takes 1/64th of a sample  */
-                                               /* period to be serviced.                       */
-
-#define HCFG                   0x14            /* Hardware config register                     */
-                                               /* NOTE: There is no reason to use the legacy   */
-                                               /* SoundBlaster emulation stuff described below */
-                                               /* under Linux, and all kinds of weird hardware */
-                                               /* behavior can result if you try.  Don't.      */
-#define HCFG_LEGACYFUNC_MASK   0xe0000000      /* Legacy function number                       */
-#define HCFG_LEGACYFUNC_MPU    0x00000000      /* Legacy MPU                                   */
-#define HCFG_LEGACYFUNC_SB     0x40000000      /* Legacy SB                                    */
-#define HCFG_LEGACYFUNC_AD     0x60000000      /* Legacy AD                                    */
-#define HCFG_LEGACYFUNC_MPIC   0x80000000      /* Legacy MPIC                                  */
-#define HCFG_LEGACYFUNC_MDMA   0xa0000000      /* Legacy MDMA                                  */
-#define HCFG_LEGACYFUNC_SPCI   0xc0000000      /* Legacy SPCI                                  */
-#define HCFG_LEGACYFUNC_SDMA   0xe0000000      /* Legacy SDMA                                  */
-#define HCFG_IOCAPTUREADDR     0x1f000000      /* The 4 LSBs of the captured I/O address.      */
-#define HCFG_LEGACYWRITE       0x00800000      /* 1 = write, 0 = read                          */
-#define HCFG_LEGACYWORD                0x00400000      /* 1 = word, 0 = byte                           */
-#define HCFG_LEGACYINT         0x00200000      /* 1 = legacy event captured. Write 1 to clear. */
-                                               /* NOTE: The rest of the bits in this register  */
-                                               /* _are_ relevant under Linux.                  */
-#define HCFG_CODECFORMAT_MASK  0x00070000      /* CODEC format                                 */
-#define HCFG_CODECFORMAT_AC97  0x00000000      /* AC97 CODEC format -- Primary Output          */
-#define HCFG_CODECFORMAT_I2S   0x00010000      /* I2S CODEC format -- Secondary (Rear) Output  */
-#define HCFG_GPINPUT0          0x00004000      /* External pin112                              */
-#define HCFG_GPINPUT1          0x00002000      /* External pin110                              */
-
-#define HCFG_GPOUTPUT_MASK     0x00001c00      /* External pins which may be controlled        */
-#define HCFG_GPOUT0            0x00001000      /* set to enable digital out on 5.1 cards       */
-
-#define HCFG_JOYENABLE         0x00000200      /* Internal joystick enable                     */
-#define HCFG_PHASETRACKENABLE  0x00000100      /* Phase tracking enable                        */
-                                               /* 1 = Force all 3 async digital inputs to use  */
-                                               /* the same async sample rate tracker (ZVIDEO)  */
-#define HCFG_AC3ENABLE_MASK    0x0x0000e0      /* AC3 async input control - Not implemented    */
-#define HCFG_AC3ENABLE_ZVIDEO  0x00000080      /* Channels 0 and 1 replace ZVIDEO              */
-#define HCFG_AC3ENABLE_CDSPDIF 0x00000040      /* Channels 0 and 1 replace CDSPDIF             */
-#define HCFG_AC3ENABLE_GPSPDIF  0x00000020      /* Channels 0 and 1 replace GPSPDIF             */
-#define HCFG_AUTOMUTE          0x00000010      /* When set, the async sample rate convertors   */
-                                               /* will automatically mute their output when    */
-                                               /* they are not rate-locked to the external     */
-                                               /* async audio source                           */
-#define HCFG_LOCKSOUNDCACHE    0x00000008      /* 1 = Cancel bustmaster accesses to soundcache */
-                                               /* NOTE: This should generally never be used.   */
-#define HCFG_LOCKTANKCACHE_MASK        0x00000004      /* 1 = Cancel bustmaster accesses to tankcache  */
-                                               /* NOTE: This should generally never be used.   */
-#define HCFG_LOCKTANKCACHE     0x01020014
-#define HCFG_MUTEBUTTONENABLE  0x00000002      /* 1 = Master mute button sets AUDIOENABLE = 0. */
-                                               /* NOTE: This is a 'cheap' way to implement a   */
-                                               /* master mute function on the mute button, and */
-                                               /* in general should not be used unless a more  */
-                                               /* sophisticated master mute function has not   */
-                                               /* been written.                                */
-#define HCFG_AUDIOENABLE       0x00000001      /* 0 = CODECs transmit zero-valued samples      */
-                                               /* Should be set to 1 when the EMU10K1 is       */
-                                               /* completely initialized.                      */
-
-//For Audigy, MPU port move to 0x70-0x74 ptr register
-
-#define MUDATA                 0x18            /* MPU401 data register (8 bits)                */
-
-#define MUCMD                  0x19            /* MPU401 command register (8 bits)             */
-#define MUCMD_RESET            0xff            /* RESET command                                */
-#define MUCMD_ENTERUARTMODE    0x3f            /* Enter_UART_mode command                      */
-                                               /* NOTE: All other commands are ignored         */
-
-#define MUSTAT                 MUCMD           /* MPU401 status register (8 bits)              */
-#define MUSTAT_IRDYN           0x80            /* 0 = MIDI data or command ACK                 */
-#define MUSTAT_ORDYN           0x40            /* 0 = MUDATA can accept a command or data      */
-
-#define A_IOCFG                        0x18            /* GPIO on Audigy card (16bits)                 */
-#define A_GPINPUT_MASK         0xff00
-#define A_GPOUTPUT_MASK                0x00ff
-
-#define TIMER                  0x1a            /* Timer terminal count register (16-bit)       */
-                                               /* NOTE: After the rate is changed, a maximum   */
-                                               /* of 1024 sample periods should be allowed     */
-                                               /* before the new rate is guaranteed accurate.  */
-#define TIMER_RATE_MASK                0x03ff          /* Timer interrupt rate in sample periods       */
-                                               /* 0 == 1024 periods, [1..4] are not useful     */
-
-#define AC97DATA               0x1c            /* AC97 register set data register (16 bit)     */
-
-#define AC97ADDRESS            0x1e            /* AC97 register set address register (8 bit)   */
-#define AC97ADDRESS_READY      0x80            /* Read-only bit, reflects CODEC READY signal   */
-#define AC97ADDRESS_ADDRESS    0x7f            /* Address of indexed AC97 register             */
-
-/********************************************************************************************************/
-/* Emu10k1 pointer-offset register set, accessed through the PTR and DATA registers                    */
-/********************************************************************************************************/
-
-#define CPF                    0x00            /* Current pitch and fraction register                  */
-#define CPF_CURRENTPITCH_MASK  0xffff0000      /* Current pitch (linear, 0x4000 == unity pitch shift)  */
-#define CPF_CURRENTPITCH       0x10100000
-#define CPF_STEREO_MASK                0x00008000      /* 1 = Even channel interleave, odd channel locked      */
-#define CPF_STOP_MASK          0x00004000      /* 1 = Current pitch forced to 0                        */
-#define CPF_FRACADDRESS_MASK   0x00003fff      /* Linear fractional address of the current channel     */
-
-#define PTRX                   0x01            /* Pitch target and send A/B amounts register           */
-#define PTRX_PITCHTARGET_MASK  0xffff0000      /* Pitch target of specified channel                    */
-#define PTRX_PITCHTARGET       0x10100001
-#define PTRX_FXSENDAMOUNT_A_MASK 0x0000ff00    /* Linear level of channel output sent to FX send bus A */
-#define PTRX_FXSENDAMOUNT_A    0x08080001
-#define PTRX_FXSENDAMOUNT_B_MASK 0x000000ff    /* Linear level of channel output sent to FX send bus B */
-#define PTRX_FXSENDAMOUNT_B    0x08000001
-
-#define CVCF                   0x02            /* Current volume and filter cutoff register            */
-#define CVCF_CURRENTVOL_MASK   0xffff0000      /* Current linear volume of specified channel           */
-#define CVCF_CURRENTVOL                0x10100002
-#define CVCF_CURRENTFILTER_MASK        0x0000ffff      /* Current filter cutoff frequency of specified channel */
-#define CVCF_CURRENTFILTER     0x10000002
-
-#define VTFT                   0x03            /* Volume target and filter cutoff target register      */
-#define VTFT_VOLUMETARGET_MASK 0xffff0000      /* Volume target of specified channel                   */
-#define VTFT_FILTERTARGET_MASK 0x0000ffff      /* Filter cutoff target of specified channel            */
-
-#define Z1                     0x05            /* Filter delay memory 1 register                       */
-
-#define Z2                     0x04            /* Filter delay memory 2 register                       */
-
-#define PSST                   0x06            /* Send C amount and loop start address register        */
-#define PSST_FXSENDAMOUNT_C_MASK 0xff000000    /* Linear level of channel output sent to FX send bus C */
-
-#define PSST_FXSENDAMOUNT_C    0x08180006
-
-#define PSST_LOOPSTARTADDR_MASK        0x00ffffff      /* Loop start address of the specified channel          */
-#define PSST_LOOPSTARTADDR     0x18000006
-
-#define DSL                    0x07            /* Send D amount and loop start address register        */
-#define DSL_FXSENDAMOUNT_D_MASK        0xff000000      /* Linear level of channel output sent to FX send bus D */
-
-#define DSL_FXSENDAMOUNT_D     0x08180007
-
-#define DSL_LOOPENDADDR_MASK   0x00ffffff      /* Loop end address of the specified channel            */
-#define DSL_LOOPENDADDR                0x18000007
-
-#define CCCA                   0x08            /* Filter Q, interp. ROM, byte size, cur. addr register */
-#define CCCA_RESONANCE         0xf0000000      /* Lowpass filter resonance (Q) height                  */
-#define CCCA_INTERPROMMASK     0x0e000000      /* Selects passband of interpolation ROM                */
-                                               /* 1 == full band, 7 == lowpass                         */
-                                               /* ROM 0 is used when pitch shifting downward or less   */
-                                               /* then 3 semitones upward.  Increasingly higher ROM    */
-                                               /* numbers are used, typically in steps of 3 semitones, */
-                                               /* as upward pitch shifting is performed.               */
-#define CCCA_INTERPROM_0       0x00000000      /* Select interpolation ROM 0                           */
-#define CCCA_INTERPROM_1       0x02000000      /* Select interpolation ROM 1                           */
-#define CCCA_INTERPROM_2       0x04000000      /* Select interpolation ROM 2                           */
-#define CCCA_INTERPROM_3       0x06000000      /* Select interpolation ROM 3                           */
-#define CCCA_INTERPROM_4       0x08000000      /* Select interpolation ROM 4                           */
-#define CCCA_INTERPROM_5       0x0a000000      /* Select interpolation ROM 5                           */
-#define CCCA_INTERPROM_6       0x0c000000      /* Select interpolation ROM 6                           */
-#define CCCA_INTERPROM_7       0x0e000000      /* Select interpolation ROM 7                           */
-#define CCCA_8BITSELECT                0x01000000      /* 1 = Sound memory for this channel uses 8-bit samples */
-#define CCCA_CURRADDR_MASK     0x00ffffff      /* Current address of the selected channel              */
-#define CCCA_CURRADDR          0x18000008
-
-#define CCR                    0x09            /* Cache control register                               */
-#define CCR_CACHEINVALIDSIZE   0x07190009
-#define CCR_CACHEINVALIDSIZE_MASK      0xfe000000      /* Number of invalid samples cache for this channel     */
-#define CCR_CACHELOOPFLAG      0x01000000      /* 1 = Cache has a loop service pending                 */
-#define CCR_INTERLEAVEDSAMPLES 0x00800000      /* 1 = A cache service will fetch interleaved samples   */
-#define CCR_WORDSIZEDSAMPLES   0x00400000      /* 1 = A cache service will fetch word sized samples    */
-#define CCR_READADDRESS                0x06100009
-#define CCR_READADDRESS_MASK   0x003f0000      /* Location of cache just beyond current cache service  */
-#define CCR_LOOPINVALSIZE      0x0000fe00      /* Number of invalid samples in cache prior to loop     */
-                                               /* NOTE: This is valid only if CACHELOOPFLAG is set     */
-#define CCR_LOOPFLAG           0x00000100      /* Set for a single sample period when a loop occurs    */
-#define CCR_CACHELOOPADDRHI    0x000000ff      /* DSL_LOOPSTARTADDR's hi byte if CACHELOOPFLAG is set  */
-
-#define CLP                    0x0a            /* Cache loop register (valid if CCR_CACHELOOPFLAG = 1) */
-                                               /* NOTE: This register is normally not used             */
-#define CLP_CACHELOOPADDR      0x0000ffff      /* Cache loop address (DSL_LOOPSTARTADDR [0..15])       */
-
-#define FXRT                   0x0b            /* Effects send routing register                        */
-                                               /* NOTE: It is illegal to assign the same routing to    */
-                                               /* two effects sends.                                   */
-#define FXRT_CHANNELA          0x000f0000      /* Effects send bus number for channel's effects send A */
-#define FXRT_CHANNELB          0x00f00000      /* Effects send bus number for channel's effects send B */
-#define FXRT_CHANNELC          0x0f000000      /* Effects send bus number for channel's effects send C */
-#define FXRT_CHANNELD          0xf0000000      /* Effects send bus number for channel's effects send D */
-
-#define MAPA                   0x0c            /* Cache map A                                          */
-
-#define MAPB                   0x0d            /* Cache map B                                          */
-
-#define MAP_PTE_MASK           0xffffe000      /* The 19 MSBs of the PTE indexed by the PTI            */
-#define MAP_PTI_MASK           0x00001fff      /* The 13 bit index to one of the 8192 PTE dwords       */
-
-#define ENVVOL                 0x10            /* Volume envelope register                             */
-#define ENVVOL_MASK            0x0000ffff      /* Current value of volume envelope state variable      */  
-                                               /* 0x8000-n == 666*n usec delay                         */
-
-#define ATKHLDV                0x11            /* Volume envelope hold and attack register             */
-#define ATKHLDV_PHASE0         0x00008000      /* 0 = Begin attack phase                               */
-#define ATKHLDV_HOLDTIME_MASK  0x00007f00      /* Envelope hold time (127-n == n*88.2msec)             */
-#define ATKHLDV_ATTACKTIME_MASK        0x0000007f      /* Envelope attack time, log encoded                    */
-                                               /* 0 = infinite, 1 = 10.9msec, ... 0x7f = 5.5msec       */
-
-#define DCYSUSV                0x12            /* Volume envelope sustain and decay register           */
-#define DCYSUSV_PHASE1_MASK    0x00008000      /* 0 = Begin attack phase, 1 = begin release phase      */
-#define DCYSUSV_SUSTAINLEVEL_MASK 0x00007f00   /* 127 = full, 0 = off, 0.75dB increments               */
-#define DCYSUSV_CHANNELENABLE_MASK 0x00000080  /* 1 = Inhibit envelope engine from writing values in   */
-                                               /* this channel and from writing to pitch, filter and   */
-                                               /* volume targets.                                      */
-#define DCYSUSV_DECAYTIME_MASK 0x0000007f      /* Volume envelope decay time, log encoded              */
-                                               /* 0 = 43.7msec, 1 = 21.8msec, 0x7f = 22msec            */
-
-#define LFOVAL1                0x13            /* Modulation LFO value                                 */
-#define LFOVAL_MASK            0x0000ffff      /* Current value of modulation LFO state variable       */
-                                               /* 0x8000-n == 666*n usec delay                         */
-
-#define ENVVAL                 0x14            /* Modulation envelope register                         */
-#define ENVVAL_MASK            0x0000ffff      /* Current value of modulation envelope state variable  */
-                                               /* 0x8000-n == 666*n usec delay                         */
-
-#define ATKHLDM                        0x15            /* Modulation envelope hold and attack register         */
-#define ATKHLDM_PHASE0         0x00008000      /* 0 = Begin attack phase                               */
-#define ATKHLDM_HOLDTIME       0x00007f00      /* Envelope hold time (127-n == n*42msec)               */
-#define ATKHLDM_ATTACKTIME     0x0000007f      /* Envelope attack time, log encoded                    */
-                                               /* 0 = infinite, 1 = 11msec, ... 0x7f = 5.5msec         */
-
-#define DCYSUSM                        0x16            /* Modulation envelope decay and sustain register       */
-#define DCYSUSM_PHASE1_MASK    0x00008000      /* 0 = Begin attack phase, 1 = begin release phase      */
-#define DCYSUSM_SUSTAINLEVEL_MASK 0x00007f00   /* 127 = full, 0 = off, 0.75dB increments               */
-#define DCYSUSM_DECAYTIME_MASK 0x0000007f      /* Envelope decay time, log encoded                     */
-                                               /* 0 = 43.7msec, 1 = 21.8msec, 0x7f = 22msec            */
-
-#define LFOVAL2                0x17            /* Vibrato LFO register                                 */
-#define LFOVAL2_MASK           0x0000ffff      /* Current value of vibrato LFO state variable          */
-                                               /* 0x8000-n == 666*n usec delay                         */
-
-#define IP                     0x18            /* Initial pitch register                               */
-#define IP_MASK                        0x0000ffff      /* Exponential initial pitch shift                      */
-                                               /* 4 bits of octave, 12 bits of fractional octave       */
-#define IP_UNITY               0x0000e000      /* Unity pitch shift                                    */
-
-#define IFATN                  0x19            /* Initial filter cutoff and attenuation register       */
-#define IFATN_FILTERCUTOFF_MASK        0x0000ff00      /* Initial filter cutoff frequency in exponential units */
-                                               /* 6 most significant bits are semitones                */
-                                               /* 2 least significant bits are fractions               */
-#define IFATN_FILTERCUTOFF     0x08080019
-#define IFATN_ATTENUATION_MASK 0x000000ff      /* Initial attenuation in 0.375dB steps                 */
-#define IFATN_ATTENUATION      0x08000019
-
-
-#define PEFE                   0x1a            /* Pitch envelope and filter envelope amount register   */
-#define PEFE_PITCHAMOUNT_MASK  0x0000ff00      /* Pitch envlope amount                                 */
-                                               /* Signed 2's complement, +/- one octave peak extremes  */
-#define PEFE_PITCHAMOUNT       0x0808001a
-#define PEFE_FILTERAMOUNT_MASK 0x000000ff      /* Filter envlope amount                                */
-                                               /* Signed 2's complement, +/- six octaves peak extremes */
-#define PEFE_FILTERAMOUNT      0x0800001a
-#define FMMOD                  0x1b            /* Vibrato/filter modulation from LFO register          */
-#define FMMOD_MODVIBRATO       0x0000ff00      /* Vibrato LFO modulation depth                         */
-                                               /* Signed 2's complement, +/- one octave extremes       */
-#define FMMOD_MOFILTER         0x000000ff      /* Filter LFO modulation depth                          */
-                                               /* Signed 2's complement, +/- three octave extremes     */
-
-
-#define TREMFRQ                0x1c            /* Tremolo amount and modulation LFO frequency register */
-#define TREMFRQ_DEPTH          0x0000ff00      /* Tremolo depth                                        */
-                                               /* Signed 2's complement, with +/- 12dB extremes        */
-#define TREMFRQ_FREQUENCY      0x000000ff      /* Tremolo LFO frequency                                */
-                                               /* ??Hz steps, maximum of ?? Hz.                        */
-
-#define FM2FRQ2                0x1d            /* Vibrato amount and vibrato LFO frequency register    */
-#define FM2FRQ2_DEPTH          0x0000ff00      /* Vibrato LFO vibrato depth                            */
-                                               /* Signed 2's complement, +/- one octave extremes       */
-#define FM2FRQ2_FREQUENCY      0x000000ff      /* Vibrato LFO frequency                                */
-                                               /* 0.039Hz steps, maximum of 9.85 Hz.                   */
-
-#define TEMPENV                0x1e            /* Tempory envelope register                            */
-#define TEMPENV_MASK           0x0000ffff      /* 16-bit value                                         */
-                                               /* NOTE: All channels contain internal variables; do    */
-                                               /* not write to these locations.                        */
-
-#define CD0                    0x20            /* Cache data 0 register                                */
-#define CD1                    0x21            /* Cache data 1 register                                */
-#define CD2                    0x22            /* Cache data 2 register                                */
-#define CD3                    0x23            /* Cache data 3 register                                */
-#define CD4                    0x24            /* Cache data 4 register                                */
-#define CD5                    0x25            /* Cache data 5 register                                */
-#define CD6                    0x26            /* Cache data 6 register                                */
-#define CD7                    0x27            /* Cache data 7 register                                */
-#define CD8                    0x28            /* Cache data 8 register                                */
-#define CD9                    0x29            /* Cache data 9 register                                */
-#define CDA                    0x2a            /* Cache data A register                                */
-#define CDB                    0x2b            /* Cache data B register                                */
-#define CDC                    0x2c            /* Cache data C register                                */
-#define CDD                    0x2d            /* Cache data D register                                */
-#define CDE                    0x2e            /* Cache data E register                                */
-#define CDF                    0x2f            /* Cache data F register                                */
-
-#define PTB                    0x40            /* Page table base register                             */
-#define PTB_MASK               0xfffff000      /* Physical address of the page table in host memory    */
-
-#define TCB                    0x41            /* Tank cache base register                             */
-#define TCB_MASK               0xfffff000      /* Physical address of the bottom of host based TRAM    */
-
-#define ADCCR                  0x42            /* ADC sample rate/stereo control register              */
-#define ADCCR_RCHANENABLE      0x00000010      /* Enables right channel for writing to the host        */
-#define ADCCR_LCHANENABLE      0x00000008      /* Enables left channel for writing to the host         */
-                                               /* NOTE: To guarantee phase coherency, both channels    */
-                                               /* must be disabled prior to enabling both channels.    */
-#define A_ADCCR_RCHANENABLE    0x00000020
-#define A_ADCCR_LCHANENABLE    0x00000010
-
-#define A_ADCCR_SAMPLERATE_MASK 0x0000000F      /* Audigy sample rate convertor output rate            */
-#define ADCCR_SAMPLERATE_MASK  0x00000007      /* Sample rate convertor output rate                    */
-
-#define ADCCR_SAMPLERATE_48    0x00000000      /* 48kHz sample rate                                    */
-#define ADCCR_SAMPLERATE_44    0x00000001      /* 44.1kHz sample rate                                  */
-#define ADCCR_SAMPLERATE_32    0x00000002      /* 32kHz sample rate                                    */
-#define ADCCR_SAMPLERATE_24    0x00000003      /* 24kHz sample rate                                    */
-#define ADCCR_SAMPLERATE_22    0x00000004      /* 22.05kHz sample rate                                 */
-#define ADCCR_SAMPLERATE_16    0x00000005      /* 16kHz sample rate                                    */
-#define ADCCR_SAMPLERATE_11    0x00000006      /* 11.025kHz sample rate                                */
-#define ADCCR_SAMPLERATE_8     0x00000007      /* 8kHz sample rate                                     */
-
-#define A_ADCCR_SAMPLERATE_12  0x00000006      /* 12kHz sample rate                                    */
-#define A_ADCCR_SAMPLERATE_11  0x00000007      /* 11.025kHz sample rate                                */
-#define A_ADCCR_SAMPLERATE_8   0x00000008      /* 8kHz sample rate                                     */
-
-#define FXWC                   0x43            /* FX output write channels register                    */
-                                               /* When set, each bit enables the writing of the        */
-                                               /* corresponding FX output channel (internal registers  */
-                                               /* 0x20-0x3f) into host memory. This mode of recording  */
-                                               /* is 16bit, 48KHz only. All 32 channels can be enabled */
-                                               /* simultaneously.                                      */
-#define TCBS                   0x44            /* Tank cache buffer size register                      */
-#define TCBS_MASK              0x00000007      /* Tank cache buffer size field                         */
-#define TCBS_BUFFSIZE_16K      0x00000000
-#define TCBS_BUFFSIZE_32K      0x00000001
-#define TCBS_BUFFSIZE_64K      0x00000002
-#define TCBS_BUFFSIZE_128K     0x00000003
-#define TCBS_BUFFSIZE_256K     0x00000004
-#define TCBS_BUFFSIZE_512K     0x00000005
-#define TCBS_BUFFSIZE_1024K    0x00000006
-#define TCBS_BUFFSIZE_2048K    0x00000007
-
-#define MICBA                  0x45            /* AC97 microphone buffer address register              */
-#define MICBA_MASK             0xfffff000      /* 20 bit base address                                  */
-
-#define ADCBA                  0x46            /* ADC buffer address register                          */
-#define ADCBA_MASK             0xfffff000      /* 20 bit base address                                  */
-
-#define FXBA                   0x47            /* FX Buffer Address */
-#define FXBA_MASK              0xfffff000      /* 20 bit base address                                  */
-
-#define MICBS                  0x49            /* Microphone buffer size register                      */
-
-#define ADCBS                  0x4a            /* ADC buffer size register                             */
-
-#define FXBS                   0x4b            /* FX buffer size register                              */
-
-/* The following mask values define the size of the ADC, MIX and FX buffers in bytes */
-#define ADCBS_BUFSIZE_NONE     0x00000000
-#define ADCBS_BUFSIZE_384      0x00000001
-#define ADCBS_BUFSIZE_448      0x00000002
-#define ADCBS_BUFSIZE_512      0x00000003
-#define ADCBS_BUFSIZE_640      0x00000004
-#define ADCBS_BUFSIZE_768      0x00000005
-#define ADCBS_BUFSIZE_896      0x00000006
-#define ADCBS_BUFSIZE_1024     0x00000007
-#define ADCBS_BUFSIZE_1280     0x00000008
-#define ADCBS_BUFSIZE_1536     0x00000009
-#define ADCBS_BUFSIZE_1792     0x0000000a
-#define ADCBS_BUFSIZE_2048     0x0000000b
-#define ADCBS_BUFSIZE_2560     0x0000000c
-#define ADCBS_BUFSIZE_3072     0x0000000d
-#define ADCBS_BUFSIZE_3584     0x0000000e
-#define ADCBS_BUFSIZE_4096     0x0000000f
-#define ADCBS_BUFSIZE_5120     0x00000010
-#define ADCBS_BUFSIZE_6144     0x00000011
-#define ADCBS_BUFSIZE_7168     0x00000012
-#define ADCBS_BUFSIZE_8192     0x00000013
-#define ADCBS_BUFSIZE_10240    0x00000014
-#define ADCBS_BUFSIZE_12288    0x00000015
-#define ADCBS_BUFSIZE_14366    0x00000016
-#define ADCBS_BUFSIZE_16384    0x00000017
-#define ADCBS_BUFSIZE_20480    0x00000018
-#define ADCBS_BUFSIZE_24576    0x00000019
-#define ADCBS_BUFSIZE_28672    0x0000001a
-#define ADCBS_BUFSIZE_32768    0x0000001b
-#define ADCBS_BUFSIZE_40960    0x0000001c
-#define ADCBS_BUFSIZE_49152    0x0000001d
-#define ADCBS_BUFSIZE_57344    0x0000001e
-#define ADCBS_BUFSIZE_65536    0x0000001f
-
-
-#define CDCS                   0x50            /* CD-ROM digital channel status register       */
-
-#define GPSCS                  0x51            /* General Purpose SPDIF channel status register*/
-
-#define DBG                    0x52            /* DO NOT PROGRAM THIS REGISTER!!! MAY DESTROY CHIP */
-
-/* definitions for debug register - taken from the alsa drivers */
-#define DBG_ZC                  0x80000000      /* zero tram counter */
-#define DBG_SATURATION_OCCURED  0x02000000      /* saturation control */
-#define DBG_SATURATION_ADDR     0x01ff0000      /* saturation address */
-#define DBG_SINGLE_STEP         0x00008000      /* single step mode */
-#define DBG_STEP                0x00004000      /* start single step */
-#define DBG_CONDITION_CODE      0x00003e00      /* condition code */
-#define DBG_SINGLE_STEP_ADDR    0x000001ff      /* single step address */
-
-
-#define REG53                  0x53            /* DO NOT PROGRAM THIS REGISTER!!! MAY DESTROY CHIP */
-
-#define A_DBG                   0x53
-#define A_DBG_SINGLE_STEP       0x00020000     /* Set to zero to start dsp */
-#define A_DBG_ZC                0x40000000     /* zero tram counter */
-#define A_DBG_STEP_ADDR                 0x000003ff
-#define A_DBG_SATURATION_OCCURED 0x20000000
-#define A_DBG_SATURATION_ADDR   0x0ffc0000
-
-#define SPCS0                  0x54            /* SPDIF output Channel Status 0 register       */
-
-#define SPCS1                  0x55            /* SPDIF output Channel Status 1 register       */
-
-#define SPCS2                  0x56            /* SPDIF output Channel Status 2 register       */
-
-#define SPCS_CLKACCYMASK       0x30000000      /* Clock accuracy                               */
-#define SPCS_CLKACCY_1000PPM   0x00000000      /* 1000 parts per million                       */
-#define SPCS_CLKACCY_50PPM     0x10000000      /* 50 parts per million                         */
-#define SPCS_CLKACCY_VARIABLE  0x20000000      /* Variable accuracy                            */
-#define SPCS_SAMPLERATEMASK    0x0f000000      /* Sample rate                                  */
-#define SPCS_SAMPLERATE_44     0x00000000      /* 44.1kHz sample rate                          */
-#define SPCS_SAMPLERATE_48     0x02000000      /* 48kHz sample rate                            */
-#define SPCS_SAMPLERATE_32     0x03000000      /* 32kHz sample rate                            */
-#define SPCS_CHANNELNUMMASK    0x00f00000      /* Channel number                               */
-#define SPCS_CHANNELNUM_UNSPEC 0x00000000      /* Unspecified channel number                   */
-#define SPCS_CHANNELNUM_LEFT   0x00100000      /* Left channel                                 */
-#define SPCS_CHANNELNUM_RIGHT  0x00200000      /* Right channel                                */
-#define SPCS_SOURCENUMMASK     0x000f0000      /* Source number                                */
-#define SPCS_SOURCENUM_UNSPEC  0x00000000      /* Unspecified source number                    */
-#define SPCS_GENERATIONSTATUS  0x00008000      /* Originality flag (see IEC-958 spec)          */
-#define SPCS_CATEGORYCODEMASK  0x00007f00      /* Category code (see IEC-958 spec)             */
-#define SPCS_MODEMASK          0x000000c0      /* Mode (see IEC-958 spec)                      */
-#define SPCS_EMPHASISMASK      0x00000038      /* Emphasis                                     */
-#define SPCS_EMPHASIS_NONE     0x00000000      /* No emphasis                                  */
-#define SPCS_EMPHASIS_50_15    0x00000008      /* 50/15 usec 2 channel                         */
-#define SPCS_COPYRIGHT         0x00000004      /* Copyright asserted flag -- do not modify     */
-#define SPCS_NOTAUDIODATA      0x00000002      /* 0 = Digital audio, 1 = not audio             */
-#define SPCS_PROFESSIONAL      0x00000001      /* 0 = Consumer (IEC-958), 1 = pro (AES3-1992)  */
-
-/* The 32-bit CLIx and SOLx registers all have one bit per channel control/status                      */
-#define CLIEL                  0x58            /* Channel loop interrupt enable low register   */
-
-#define CLIEH                  0x59            /* Channel loop interrupt enable high register  */
-
-#define CLIPL                  0x5a            /* Channel loop interrupt pending low register  */
-
-#define CLIPH                  0x5b            /* Channel loop interrupt pending high register */
-
-#define SOLEL                  0x5c            /* Stop on loop enable low register             */
-
-#define SOLEH                  0x5d            /* Stop on loop enable high register            */
-
-#define SPBYPASS               0x5e            /* SPDIF BYPASS mode register                   */
-#define SPBYPASS_ENABLE                0x00000001      /* Enable SPDIF bypass mode                     */
-
-#define AC97SLOT               0x5f            /* additional AC97 slots enable bits */
-#define AC97SLOT_CNTR          0x10            /* Center enable */
-#define AC97SLOT_LFE           0x20            /* LFE enable */
-
-#define CDSRCS                 0x60            /* CD-ROM Sample Rate Converter status register */
-
-#define GPSRCS                 0x61            /* General Purpose SPDIF sample rate cvt status */
-
-#define ZVSRCS                 0x62            /* ZVideo sample rate converter status          */
-                                               /* NOTE: This one has no SPDIFLOCKED field      */
-                                               /* Assumes sample lock                          */
-
-/* These three bitfields apply to CDSRCS, GPSRCS, and (except as noted) ZVSRCS.                        */
-#define SRCS_SPDIFLOCKED       0x02000000      /* SPDIF stream locked                          */
-#define SRCS_RATELOCKED                0x01000000      /* Sample rate locked                           */
-#define SRCS_ESTSAMPLERATE     0x0007ffff      /* Do not modify this field.                    */
-
-
-/* Note that these values can vary +/- by a small amount                                        */
-#define SRCS_SPDIFRATE_44      0x0003acd9
-#define SRCS_SPDIFRATE_48      0x00040000
-#define SRCS_SPDIFRATE_96      0x00080000
-
-#define MICIDX                  0x63            /* Microphone recording buffer index register   */
-#define MICIDX_MASK             0x0000ffff      /* 16-bit value                                 */
-#define MICIDX_IDX             0x10000063
-
-#define A_ADCIDX               0x63
-#define A_ADCIDX_IDX           0x10000063
-
-#define ADCIDX                 0x64            /* ADC recording buffer index register          */
-#define ADCIDX_MASK            0x0000ffff      /* 16 bit index field                           */
-#define ADCIDX_IDX             0x10000064
-
-#define FXIDX                  0x65            /* FX recording buffer index register           */
-#define FXIDX_MASK             0x0000ffff      /* 16-bit value                                 */
-#define FXIDX_IDX              0x10000065
-
-/* This is the MPU port on the card (via the game port)                                                */
-#define A_MUDATA1              0x70
-#define A_MUCMD1               0x71
-#define A_MUSTAT1              A_MUCMD1
-
-/* This is the MPU port on the Audigy Drive                                                    */
-#define A_MUDATA2              0x72
-#define A_MUCMD2               0x73
-#define A_MUSTAT2              A_MUCMD2        
-
-/* The next two are the Audigy equivalent of FXWC                                              */
-/* the Audigy can record any output (16bit, 48kHz, up to 64 channel simultaneously)            */
-/* Each bit selects a channel for recording */
-#define A_FXWC1                        0x74            /* Selects 0x7f-0x60 for FX recording           */
-#define A_FXWC2                        0x75            /* Selects 0x9f-0x80 for FX recording           */
-
-#define A_SPDIF_SAMPLERATE     0x76            /* Set the sample rate of SPDIF output          */
-#define A_SPDIF_48000          0x00000080
-#define A_SPDIF_44100          0x00000000
-#define A_SPDIF_96000          0x00000040
-
-#define A_FXRT2                        0x7c
-#define A_FXRT_CHANNELE                0x0000003f      /* Effects send bus number for channel's effects send E */
-#define A_FXRT_CHANNELF                0x00003f00      /* Effects send bus number for channel's effects send F */
-#define A_FXRT_CHANNELG                0x003f0000      /* Effects send bus number for channel's effects send G */
-#define A_FXRT_CHANNELH                0x3f000000      /* Effects send bus number for channel's effects send H */
-
-#define A_SENDAMOUNTS          0x7d
-#define A_FXSENDAMOUNT_E_MASK  0xff000000
-#define A_FXSENDAMOUNT_F_MASK  0x00ff0000
-#define A_FXSENDAMOUNT_G_MASK  0x0000ff00
-#define A_FXSENDAMOUNT_H_MASK  0x000000ff
-
-/* The send amounts for this one are the same as used with the emu10k1 */
-#define A_FXRT1                        0x7e
-#define A_FXRT_CHANNELA                0x0000003f
-#define A_FXRT_CHANNELB                0x00003f00
-#define A_FXRT_CHANNELC                0x003f0000
-#define A_FXRT_CHANNELD                0x3f000000
-
-
-/* Each FX general purpose register is 32 bits in length, all bits are used                    */
-#define FXGPREGBASE            0x100           /* FX general purpose registers base            */
-#define A_FXGPREGBASE          0x400           /* Audigy GPRs, 0x400 to 0x5ff                  */
-/* Tank audio data is logarithmically compressed down to 16 bits before writing to TRAM and is */
-/* decompressed back to 20 bits on a read.  There are a total of 160 locations, the last 32    */
-/* locations are for external TRAM.                                                            */
-#define TANKMEMDATAREGBASE     0x200           /* Tank memory data registers base              */
-#define TANKMEMDATAREG_MASK    0x000fffff      /* 20 bit tank audio data field                 */
-
-/* Combined address field and memory opcode or flag field.  160 locations, last 32 are external        */
-#define TANKMEMADDRREGBASE     0x300           /* Tank memory address registers base           */
-#define TANKMEMADDRREG_ADDR_MASK 0x000fffff    /* 20 bit tank address field                    */
-#define TANKMEMADDRREG_CLEAR   0x00800000      /* Clear tank memory                            */
-#define TANKMEMADDRREG_ALIGN   0x00400000      /* Align read or write relative to tank access  */
-#define TANKMEMADDRREG_WRITE   0x00200000      /* Write to tank memory                         */
-#define TANKMEMADDRREG_READ    0x00100000      /* Read from tank memory                        */
-
-#define MICROCODEBASE          0x400           /* Microcode data base address                  */
-
-/* Each DSP microcode instruction is mapped into 2 doublewords                                         */
-/* NOTE: When writing, always write the LO doubleword first.  Reads can be in either order.    */
-#define LOWORD_OPX_MASK                0x000ffc00      /* Instruction operand X                        */
-#define LOWORD_OPY_MASK                0x000003ff      /* Instruction operand Y                        */
-#define HIWORD_OPCODE_MASK     0x00f00000      /* Instruction opcode                           */
-#define HIWORD_RESULT_MASK     0x000ffc00      /* Instruction result                           */
-#define HIWORD_OPA_MASK                0x000003ff      /* Instruction operand A                        */
-
-
-/* Audigy Soundcard have a different instruction format */
-#define AUDIGY_CODEBASE                0x600
-#define A_LOWORD_OPY_MASK      0x000007ff              
-#define A_LOWORD_OPX_MASK      0x007ff000
-#define A_HIWORD_OPCODE_MASK   0x0f000000
-#define A_HIWORD_RESULT_MASK   0x007ff000
-#define A_HIWORD_OPA_MASK      0x000007ff
-
-
-#endif /* _8010_H */
diff --git a/sound/oss/emu10k1/Makefile b/sound/oss/emu10k1/Makefile
deleted file mode 100644 (file)
index b3af9cc..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-# Makefile for Creative Labs EMU10K1 
-#
-# 12 Apr 2000 Rui Sousa
-
-obj-$(CONFIG_SOUND_EMU10K1) += emu10k1.o
-
-emu10k1-objs := audio.o cardmi.o cardmo.o cardwi.o cardwo.o ecard.o \
-                efxmgr.o emuadxmg.o hwaccess.o irqmgr.o main.o midi.o \
-                mixer.o passthrough.o recmgr.o timer.o voicemgr.o
-
-ifdef DEBUG
-    EXTRA_CFLAGS += -DEMU10K1_DEBUG
-endif
-
-ifdef CONFIG_MIDI_EMU10K1
-    EXTRA_CFLAGS += -DEMU10K1_SEQUENCER
-endif
diff --git a/sound/oss/emu10k1/audio.c b/sound/oss/emu10k1/audio.c
deleted file mode 100644 (file)
index e75ea21..0000000
+++ /dev/null
@@ -1,1595 +0,0 @@
-/*
- **********************************************************************
- *     audio.c -- /dev/dsp interface for emu10k1 driver
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *     November 2, 1999            Alan Cox        cleaned up types/leaks
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#include <linux/module.h>
-#include <linux/poll.h>
-#include <linux/slab.h>
-#include <linux/bitops.h>
-#include <asm/io.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/smp_lock.h>
-
-#include "hwaccess.h"
-#include "cardwo.h"
-#include "cardwi.h"
-#include "recmgr.h"
-#include "irqmgr.h"
-#include "audio.h"
-#include "8010.h"
-
-static void calculate_ofrag(struct woinst *);
-static void calculate_ifrag(struct wiinst *);
-
-static void emu10k1_waveout_bh(unsigned long refdata);
-static void emu10k1_wavein_bh(unsigned long refdata);
-
-/* Audio file operations */
-static ssize_t emu10k1_audio_read(struct file *file, char __user *buffer, size_t count, loff_t * ppos)
-{
-       struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
-       struct wiinst *wiinst = wave_dev->wiinst;
-       ssize_t ret = 0;
-       unsigned long flags;
-
-       DPD(3, "emu10k1_audio_read(), buffer=%p, count=%d\n", buffer, (u32) count);
-
-       if (!access_ok(VERIFY_WRITE, buffer, count))
-               return -EFAULT;
-
-       spin_lock_irqsave(&wiinst->lock, flags);
-
-       if (wiinst->mmapped) {
-               spin_unlock_irqrestore(&wiinst->lock, flags);
-               return -ENXIO;
-       }
-
-       if (wiinst->state == WAVE_STATE_CLOSED) {
-               calculate_ifrag(wiinst);
-
-               while (emu10k1_wavein_open(wave_dev) < 0) {
-                       spin_unlock_irqrestore(&wiinst->lock, flags);
-
-                       if (file->f_flags & O_NONBLOCK)
-                               return -EAGAIN;
-
-                       interruptible_sleep_on(&wave_dev->card->open_wait);
-
-                       if (signal_pending(current))
-                               return -ERESTARTSYS;
-
-                       spin_lock_irqsave(&wiinst->lock, flags);
-               }
-       }
-
-       spin_unlock_irqrestore(&wiinst->lock, flags);
-
-       while (count > 0) {
-               u32 bytestocopy;
-
-               spin_lock_irqsave(&wiinst->lock, flags);
-
-               if (!(wiinst->state & WAVE_STATE_STARTED)
-                   && (wave_dev->enablebits & PCM_ENABLE_INPUT))
-                       emu10k1_wavein_start(wave_dev);
-
-               emu10k1_wavein_update(wave_dev->card, wiinst);
-               emu10k1_wavein_getxfersize(wiinst, &bytestocopy);
-
-               spin_unlock_irqrestore(&wiinst->lock, flags);
-
-               DPD(3, "bytestocopy --> %d\n", bytestocopy);
-
-               if ((bytestocopy >= wiinst->buffer.fragment_size)
-                   || (bytestocopy >= count)) {
-                       int rc;
-
-                       bytestocopy = min_t(u32, bytestocopy, count);
-
-                       rc = emu10k1_wavein_xferdata(wiinst,
-                                                    (u8 __user *)buffer,
-                                                    &bytestocopy);
-                       if (rc)
-                               return rc;
-
-                       count -= bytestocopy;
-                       buffer += bytestocopy;
-                       ret += bytestocopy;
-               }
-
-               if (count > 0) {
-                       if ((file->f_flags & O_NONBLOCK)
-                           || (!(wave_dev->enablebits & PCM_ENABLE_INPUT)))
-                               return (ret ? ret : -EAGAIN);
-
-                       interruptible_sleep_on(&wiinst->wait_queue);
-
-                       if (signal_pending(current))
-                               return (ret ? ret : -ERESTARTSYS);
-
-               }
-       }
-
-       DPD(3, "bytes copied -> %d\n", (u32) ret);
-
-       return ret;
-}
-
-static ssize_t emu10k1_audio_write(struct file *file, const char __user *buffer, size_t count, loff_t * ppos)
-{
-       struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
-       struct woinst *woinst = wave_dev->woinst;
-       ssize_t ret;
-       unsigned long flags;
-
-       DPD(3, "emu10k1_audio_write(), buffer=%p, count=%d\n", buffer, (u32) count);
-
-       if (!access_ok(VERIFY_READ, buffer, count))
-               return -EFAULT;
-
-       spin_lock_irqsave(&woinst->lock, flags);
-
-       if (woinst->mmapped) {
-               spin_unlock_irqrestore(&woinst->lock, flags);
-               return -ENXIO;
-       }
-       // This is for emu10k1 revs less than 7, we need to go through tram
-       if (woinst->format.passthrough == 1) {
-               int r;
-               
-               woinst->buffer.ossfragshift = PT_BLOCKSIZE_LOG2;
-               woinst->buffer.numfrags = PT_BLOCKCOUNT;
-               calculate_ofrag(woinst);
-               
-               r = emu10k1_pt_write(file, buffer, count);
-               spin_unlock_irqrestore(&woinst->lock, flags);
-               return r;
-       }
-
-       if (woinst->state == WAVE_STATE_CLOSED) {
-               calculate_ofrag(woinst);
-
-               while (emu10k1_waveout_open(wave_dev) < 0) {
-                       spin_unlock_irqrestore(&woinst->lock, flags);
-
-                       if (file->f_flags & O_NONBLOCK)
-                               return -EAGAIN;
-
-                       interruptible_sleep_on(&wave_dev->card->open_wait);
-
-                       if (signal_pending(current))
-                               return -ERESTARTSYS;
-
-                       spin_lock_irqsave(&woinst->lock, flags);
-               }
-       }
-
-       spin_unlock_irqrestore(&woinst->lock, flags);
-
-       ret = 0;
-       if (count % woinst->format.bytespersample)
-                return -EINVAL;
-
-       count /= woinst->num_voices;
-
-       while (count > 0) {
-               u32 bytestocopy;
-
-               spin_lock_irqsave(&woinst->lock, flags);
-               emu10k1_waveout_update(woinst);
-               emu10k1_waveout_getxfersize(woinst, &bytestocopy);
-               spin_unlock_irqrestore(&woinst->lock, flags);
-
-               DPD(3, "bytestocopy --> %d\n", bytestocopy);
-
-               if ((bytestocopy >= woinst->buffer.fragment_size)
-                   || (bytestocopy >= count)) {
-
-                       bytestocopy = min_t(u32, bytestocopy, count);
-
-                       emu10k1_waveout_xferdata(woinst, (u8 __user *) buffer, &bytestocopy);
-
-                       count -= bytestocopy;
-                       buffer += bytestocopy * woinst->num_voices;
-                       ret += bytestocopy * woinst->num_voices;
-
-                       spin_lock_irqsave(&woinst->lock, flags);
-                       woinst->total_copied += bytestocopy;
-
-                       if (!(woinst->state & WAVE_STATE_STARTED)
-                           && (wave_dev->enablebits & PCM_ENABLE_OUTPUT)
-                           && (woinst->total_copied >= woinst->buffer.fragment_size))
-                               emu10k1_waveout_start(wave_dev);
-
-                       spin_unlock_irqrestore(&woinst->lock, flags);
-               }
-
-               if (count > 0) {
-                       if ((file->f_flags & O_NONBLOCK)
-                           || (!(wave_dev->enablebits & PCM_ENABLE_OUTPUT)))
-                               return (ret ? ret : -EAGAIN);
-
-                       interruptible_sleep_on(&woinst->wait_queue);
-
-                       if (signal_pending(current))
-                               return (ret ? ret : -ERESTARTSYS);
-               }
-       }
-
-       DPD(3, "bytes copied -> %d\n", (u32) ret);
-
-       return ret;
-}
-
-static int emu10k1_audio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
-{
-       struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
-       struct woinst *woinst = NULL;
-       struct wiinst *wiinst = NULL;
-       int val = 0;
-       u32 bytestocopy;
-       unsigned long flags;
-       int __user *p = (int __user *)arg;
-
-       DPF(4, "emu10k1_audio_ioctl()\n");
-
-       if (file->f_mode & FMODE_WRITE)
-               woinst = wave_dev->woinst;
-
-       if (file->f_mode & FMODE_READ)
-               wiinst = wave_dev->wiinst;
-
-       switch (cmd) {
-       case OSS_GETVERSION:
-               DPF(2, "OSS_GETVERSION:\n");
-               return put_user(SOUND_VERSION, p);
-
-       case SNDCTL_DSP_RESET:
-               DPF(2, "SNDCTL_DSP_RESET:\n");
-               wave_dev->enablebits = PCM_ENABLE_OUTPUT | PCM_ENABLE_INPUT;
-
-               if (file->f_mode & FMODE_WRITE) {
-                       spin_lock_irqsave(&woinst->lock, flags);
-
-                       if (woinst->state & WAVE_STATE_OPEN) {
-                               emu10k1_waveout_close(wave_dev);
-                       }
-
-                       woinst->mmapped = 0;
-                       woinst->total_copied = 0;
-                       woinst->total_played = 0;
-                       woinst->blocks = 0;
-
-                       spin_unlock_irqrestore(&woinst->lock, flags);
-               }
-
-               if (file->f_mode & FMODE_READ) {
-                       spin_lock_irqsave(&wiinst->lock, flags);
-
-                       if (wiinst->state & WAVE_STATE_OPEN) {
-                               emu10k1_wavein_close(wave_dev);
-                       }
-
-                       wiinst->mmapped = 0;
-                       wiinst->total_recorded = 0;
-                       wiinst->blocks = 0;
-                       spin_unlock_irqrestore(&wiinst->lock, flags);
-               }
-
-               break;
-
-       case SNDCTL_DSP_SYNC:
-               DPF(2, "SNDCTL_DSP_SYNC:\n");
-
-               if (file->f_mode & FMODE_WRITE) {
-
-                       spin_lock_irqsave(&woinst->lock, flags);
-
-                       if (woinst->state & WAVE_STATE_OPEN) {
-
-                               if (woinst->state & WAVE_STATE_STARTED)
-                                       while ((woinst->total_played < woinst->total_copied)
-                                              && !signal_pending(current)) {
-                                               spin_unlock_irqrestore(&woinst->lock, flags);
-                                               interruptible_sleep_on(&woinst->wait_queue);
-                                               spin_lock_irqsave(&woinst->lock, flags);
-                                       }
-                               emu10k1_waveout_close(wave_dev);
-                       }
-
-                       woinst->mmapped = 0;
-                       woinst->total_copied = 0;
-                       woinst->total_played = 0;
-                       woinst->blocks = 0;
-
-                       spin_unlock_irqrestore(&woinst->lock, flags);
-               }
-
-               if (file->f_mode & FMODE_READ) {
-                       spin_lock_irqsave(&wiinst->lock, flags);
-
-                       if (wiinst->state & WAVE_STATE_OPEN) {
-                               emu10k1_wavein_close(wave_dev);
-                       }
-
-                       wiinst->mmapped = 0;
-                       wiinst->total_recorded = 0;
-                       wiinst->blocks = 0;
-                       spin_unlock_irqrestore(&wiinst->lock, flags);
-               }
-
-               break;
-
-       case SNDCTL_DSP_SETDUPLEX:
-               DPF(2, "SNDCTL_DSP_SETDUPLEX:\n");
-               break;
-
-       case SNDCTL_DSP_GETCAPS:
-               DPF(2, "SNDCTL_DSP_GETCAPS:\n");
-               return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME |
-                               DSP_CAP_TRIGGER | DSP_CAP_MMAP |
-                               DSP_CAP_COPROC| DSP_CAP_MULTI, p);
-       case SNDCTL_DSP_SPEED:
-               DPF(2, "SNDCTL_DSP_SPEED:\n");
-
-               if (get_user(val, p))
-                       return -EFAULT;
-
-               DPD(2, "val is %d\n", val);
-
-               if (val > 0) {
-                       if (file->f_mode & FMODE_READ) {
-                               struct wave_format format;
-
-                               spin_lock_irqsave(&wiinst->lock, flags);
-
-                               format = wiinst->format;
-                               format.samplingrate = val;
-
-                               if (emu10k1_wavein_setformat(wave_dev, &format) < 0) {
-                                       spin_unlock_irqrestore(&wiinst->lock, flags);
-                                       return -EINVAL;
-                               }
-
-                               val = wiinst->format.samplingrate;
-
-                               spin_unlock_irqrestore(&wiinst->lock, flags);
-
-                               DPD(2, "set recording sampling rate -> %d\n", val);
-                       }
-
-                       if (file->f_mode & FMODE_WRITE) {
-                               struct wave_format format;
-
-                               spin_lock_irqsave(&woinst->lock, flags);
-
-                               format = woinst->format;
-                               format.samplingrate = val;
-
-                               if (emu10k1_waveout_setformat(wave_dev, &format) < 0) {
-                                       spin_unlock_irqrestore(&woinst->lock, flags);
-                                       return -EINVAL;
-                               }
-
-                               val = woinst->format.samplingrate;
-
-                               spin_unlock_irqrestore(&woinst->lock, flags);
-
-                               DPD(2, "set playback sampling rate -> %d\n", val);
-                       }
-
-                       return put_user(val, p);
-               } else {
-                       if (file->f_mode & FMODE_READ)
-                               val = wiinst->format.samplingrate;
-                       else if (file->f_mode & FMODE_WRITE)
-                               val = woinst->format.samplingrate;
-
-                       return put_user(val, p);
-               }
-               break;
-
-       case SNDCTL_DSP_STEREO:
-               DPF(2, "SNDCTL_DSP_STEREO:\n");
-
-               if (get_user(val, p))
-                       return -EFAULT;
-
-               DPD(2, " val is %d\n", val);
-
-               if (file->f_mode & FMODE_READ) {
-                       struct wave_format format;
-
-                       spin_lock_irqsave(&wiinst->lock, flags);
-
-                       format = wiinst->format;
-                       format.channels = val ? 2 : 1;
-
-                       if (emu10k1_wavein_setformat(wave_dev, &format) < 0) {
-                               spin_unlock_irqrestore(&wiinst->lock, flags);
-                               return -EINVAL;
-                       }
-
-                       val = wiinst->format.channels - 1;
-
-                       spin_unlock_irqrestore(&wiinst->lock, flags);
-                       DPD(2, "set recording stereo -> %d\n", val);
-               }
-
-               if (file->f_mode & FMODE_WRITE) {
-                       struct wave_format format;
-
-                       spin_lock_irqsave(&woinst->lock, flags);
-
-                       format = woinst->format;
-                       format.channels = val ? 2 : 1;
-
-                       if (emu10k1_waveout_setformat(wave_dev, &format) < 0) {
-                               spin_unlock_irqrestore(&woinst->lock, flags);
-                               return -EINVAL;
-                       }
-
-                       val = woinst->format.channels - 1;
-
-                       spin_unlock_irqrestore(&woinst->lock, flags);
-
-                       DPD(2, "set playback stereo -> %d\n", val);
-               }
-
-               return put_user(val, p);
-
-               break;
-
-       case SNDCTL_DSP_CHANNELS:
-               DPF(2, "SNDCTL_DSP_CHANNELS:\n");
-
-               if (get_user(val, p))
-                       return -EFAULT;
-
-               DPD(2, " val is %d\n", val);
-
-               if (val > 0) {
-                       if (file->f_mode & FMODE_READ) {
-                               struct wave_format format;
-
-                               spin_lock_irqsave(&wiinst->lock, flags);
-
-                               format = wiinst->format;
-                               format.channels = val;
-
-                               if (emu10k1_wavein_setformat(wave_dev, &format) < 0) {
-                                       spin_unlock_irqrestore(&wiinst->lock, flags);
-                                       return -EINVAL;
-                               }
-                               val = wiinst->format.channels;
-
-                               spin_unlock_irqrestore(&wiinst->lock, flags);
-                               DPD(2, "set recording number of channels -> %d\n", val);
-                       }
-
-                       if (file->f_mode & FMODE_WRITE) {
-                               struct wave_format format;
-
-                               spin_lock_irqsave(&woinst->lock, flags);
-
-                               format = woinst->format;
-                               format.channels = val;
-
-                               if (emu10k1_waveout_setformat(wave_dev, &format) < 0) {
-                                       spin_unlock_irqrestore(&woinst->lock, flags);
-                                       return -EINVAL;
-                               }
-
-                               val = woinst->format.channels;
-
-                               spin_unlock_irqrestore(&woinst->lock, flags);
-                               DPD(2, "set playback number of channels -> %d\n", val);
-                       }
-
-                       return put_user(val, p);
-               } else {
-                       if (file->f_mode & FMODE_READ)
-                               val = wiinst->format.channels;
-                       else if (file->f_mode & FMODE_WRITE)
-                               val = woinst->format.channels;
-
-                       return put_user(val, p);
-               }
-               break;
-
-       case SNDCTL_DSP_GETFMTS:
-               DPF(2, "SNDCTL_DSP_GETFMTS:\n");
-
-               if (file->f_mode & FMODE_READ)
-                       val = AFMT_S16_LE;
-               else if (file->f_mode & FMODE_WRITE) {
-                       val = AFMT_S16_LE | AFMT_U8;
-                       if (emu10k1_find_control_gpr(&wave_dev->card->mgr,
-                                                    wave_dev->card->pt.patch_name, 
-                                                    wave_dev->card->pt.enable_gpr_name) >= 0)
-                               val |= AFMT_AC3;
-               }
-               return put_user(val, p);
-
-       case SNDCTL_DSP_SETFMT: /* Same as SNDCTL_DSP_SAMPLESIZE */
-               DPF(2, "SNDCTL_DSP_SETFMT:\n");
-
-               if (get_user(val, p))
-                       return -EFAULT;
-
-               DPD(2, " val is %d\n", val);
-
-               if (val != AFMT_QUERY) {
-                       if (file->f_mode & FMODE_READ) {
-                               struct wave_format format;
-
-                               spin_lock_irqsave(&wiinst->lock, flags);
-
-                               format = wiinst->format;
-                               format.id = val;
-
-                               if (emu10k1_wavein_setformat(wave_dev, &format) < 0) {
-                                       spin_unlock_irqrestore(&wiinst->lock, flags);
-                                       return -EINVAL;
-                               }
-
-                               val = wiinst->format.id;
-
-                               spin_unlock_irqrestore(&wiinst->lock, flags);
-                               DPD(2, "set recording format -> %d\n", val);
-                       }
-
-                       if (file->f_mode & FMODE_WRITE) {
-                               struct wave_format format;
-
-                               spin_lock_irqsave(&woinst->lock, flags);
-
-                               format = woinst->format;
-                               format.id = val;
-
-                               if (emu10k1_waveout_setformat(wave_dev, &format) < 0) {
-                                       spin_unlock_irqrestore(&woinst->lock, flags);
-                                       return -EINVAL;
-                               }
-
-                               val = woinst->format.id;
-
-                               spin_unlock_irqrestore(&woinst->lock, flags);
-                               DPD(2, "set playback format -> %d\n", val);
-                       }
-
-                       return put_user(val, p);
-               } else {
-                       if (file->f_mode & FMODE_READ)
-                               val = wiinst->format.id;
-                       else if (file->f_mode & FMODE_WRITE)
-                               val = woinst->format.id;
-
-                       return put_user(val, p);
-               }
-               break;
-
-       case SOUND_PCM_READ_BITS:
-
-               if (file->f_mode & FMODE_READ)
-                       val = wiinst->format.bitsperchannel;
-               else if (file->f_mode & FMODE_WRITE)
-                       val = woinst->format.bitsperchannel;
-
-               return put_user(val, p);
-
-       case SOUND_PCM_READ_RATE:
-
-               if (file->f_mode & FMODE_READ)
-                       val = wiinst->format.samplingrate;
-               else if (file->f_mode & FMODE_WRITE)
-                       val = woinst->format.samplingrate;
-
-               return put_user(val, p);
-
-       case SOUND_PCM_READ_CHANNELS:
-
-               if (file->f_mode & FMODE_READ)
-                       val = wiinst->format.channels;
-               else if (file->f_mode & FMODE_WRITE)
-                       val = woinst->format.channels;
-
-               return put_user(val, p);
-
-       case SOUND_PCM_WRITE_FILTER:
-               DPF(2, "SOUND_PCM_WRITE_FILTER: not implemented\n");
-               break;
-
-       case SOUND_PCM_READ_FILTER:
-               DPF(2, "SOUND_PCM_READ_FILTER: not implemented\n");
-               break;
-
-       case SNDCTL_DSP_SETSYNCRO:
-               DPF(2, "SNDCTL_DSP_SETSYNCRO: not implemented\n");
-               break;
-
-       case SNDCTL_DSP_GETTRIGGER:
-               DPF(2, "SNDCTL_DSP_GETTRIGGER:\n");
-
-               if (file->f_mode & FMODE_WRITE && (wave_dev->enablebits & PCM_ENABLE_OUTPUT))
-                       val |= PCM_ENABLE_OUTPUT;
-
-               if (file->f_mode & FMODE_READ && (wave_dev->enablebits & PCM_ENABLE_INPUT))
-                       val |= PCM_ENABLE_INPUT;
-
-               return put_user(val, p);
-
-       case SNDCTL_DSP_SETTRIGGER:
-               DPF(2, "SNDCTL_DSP_SETTRIGGER:\n");
-
-               if (get_user(val, p))
-                       return -EFAULT;
-
-               if (file->f_mode & FMODE_WRITE) {
-                       spin_lock_irqsave(&woinst->lock, flags);
-
-                       if (val & PCM_ENABLE_OUTPUT) {
-                               wave_dev->enablebits |= PCM_ENABLE_OUTPUT;
-                               if (woinst->state & WAVE_STATE_OPEN)
-                                       emu10k1_waveout_start(wave_dev);
-                       } else {
-                               wave_dev->enablebits &= ~PCM_ENABLE_OUTPUT;
-                               if (woinst->state & WAVE_STATE_STARTED)
-                                       emu10k1_waveout_stop(wave_dev);
-                       }
-
-                       spin_unlock_irqrestore(&woinst->lock, flags);
-               }
-
-               if (file->f_mode & FMODE_READ) {
-                       spin_lock_irqsave(&wiinst->lock, flags);
-
-                       if (val & PCM_ENABLE_INPUT) {
-                               wave_dev->enablebits |= PCM_ENABLE_INPUT;
-                               if (wiinst->state & WAVE_STATE_OPEN)
-                                       emu10k1_wavein_start(wave_dev);
-                       } else {
-                               wave_dev->enablebits &= ~PCM_ENABLE_INPUT;
-                               if (wiinst->state & WAVE_STATE_STARTED)
-                                       emu10k1_wavein_stop(wave_dev);
-                       }
-
-                       spin_unlock_irqrestore(&wiinst->lock, flags);
-               }
-               break;
-
-       case SNDCTL_DSP_GETOSPACE:
-               {
-                       audio_buf_info info;
-
-                       DPF(4, "SNDCTL_DSP_GETOSPACE:\n");
-
-                       if (!(file->f_mode & FMODE_WRITE))
-                               return -EINVAL;
-
-                       spin_lock_irqsave(&woinst->lock, flags);
-
-                       if (woinst->state & WAVE_STATE_OPEN) {
-                               emu10k1_waveout_update(woinst);
-                               emu10k1_waveout_getxfersize(woinst, &bytestocopy);
-                               info.bytes = bytestocopy;
-                       } else {
-                               calculate_ofrag(woinst);
-                               info.bytes = woinst->buffer.size;
-                       }
-                       spin_unlock_irqrestore(&woinst->lock, flags);
-
-                       info.bytes *= woinst->num_voices;
-                       info.fragsize = woinst->buffer.fragment_size * woinst->num_voices;
-                       info.fragstotal = woinst->buffer.numfrags * woinst->num_voices;
-                       info.fragments = info.bytes / info.fragsize;
-
-                       if (copy_to_user(p, &info, sizeof(info)))
-                               return -EFAULT;
-               }
-               break;
-
-       case SNDCTL_DSP_GETISPACE:
-               {
-                       audio_buf_info info;
-
-                       DPF(4, "SNDCTL_DSP_GETISPACE:\n");
-
-                       if (!(file->f_mode & FMODE_READ))
-                               return -EINVAL;
-
-                       spin_lock_irqsave(&wiinst->lock, flags);
-                       if (wiinst->state & WAVE_STATE_OPEN) {
-                               emu10k1_wavein_update(wave_dev->card, wiinst);
-                               emu10k1_wavein_getxfersize(wiinst, &bytestocopy);
-                               info.bytes = bytestocopy;
-                       } else {
-                               calculate_ifrag(wiinst);
-                               info.bytes = 0;
-                       }
-                       spin_unlock_irqrestore(&wiinst->lock, flags);
-
-                       info.fragstotal = wiinst->buffer.numfrags;
-                       info.fragments = info.bytes / wiinst->buffer.fragment_size;
-                       info.fragsize = wiinst->buffer.fragment_size;
-
-                       if (copy_to_user(p, &info, sizeof(info)))
-                               return -EFAULT;
-               }
-               break;
-
-       case SNDCTL_DSP_NONBLOCK:
-               DPF(2, "SNDCTL_DSP_NONBLOCK:\n");
-
-               file->f_flags |= O_NONBLOCK;
-               break;
-
-       case SNDCTL_DSP_GETODELAY:
-               DPF(4, "SNDCTL_DSP_GETODELAY:\n");
-
-               if (!(file->f_mode & FMODE_WRITE))
-                       return -EINVAL;
-
-               spin_lock_irqsave(&woinst->lock, flags);
-               if (woinst->state & WAVE_STATE_OPEN) {
-                       emu10k1_waveout_update(woinst);
-                       emu10k1_waveout_getxfersize(woinst, &bytestocopy);
-                       val = woinst->buffer.size - bytestocopy;
-               } else
-                       val = 0;
-
-               val *= woinst->num_voices;
-               spin_unlock_irqrestore(&woinst->lock, flags);
-
-               return put_user(val, p);
-
-       case SNDCTL_DSP_GETIPTR:
-               {
-                       count_info cinfo;
-
-                       DPF(4, "SNDCTL_DSP_GETIPTR: \n");
-
-                       if (!(file->f_mode & FMODE_READ))
-                               return -EINVAL;
-
-                       spin_lock_irqsave(&wiinst->lock, flags);
-
-                       if (wiinst->state & WAVE_STATE_OPEN) {
-                               emu10k1_wavein_update(wave_dev->card, wiinst);
-                               cinfo.ptr = wiinst->buffer.hw_pos;
-                               cinfo.bytes = cinfo.ptr + wiinst->total_recorded - wiinst->total_recorded % wiinst->buffer.size;
-                               cinfo.blocks = cinfo.bytes / wiinst->buffer.fragment_size - wiinst->blocks;
-                               wiinst->blocks = cinfo.bytes / wiinst->buffer.fragment_size;
-                       } else {
-                               cinfo.ptr = 0;
-                               cinfo.bytes = 0;
-                               cinfo.blocks = 0;
-                       }
-
-                       if (wiinst->mmapped)
-                               wiinst->buffer.bytestocopy %= wiinst->buffer.fragment_size;
-
-                       spin_unlock_irqrestore(&wiinst->lock, flags);
-
-                       if (copy_to_user(p, &cinfo, sizeof(cinfo)))
-                               return -EFAULT;
-               }
-               break;
-
-       case SNDCTL_DSP_GETOPTR:
-               {
-                       count_info cinfo;
-
-                       DPF(4, "SNDCTL_DSP_GETOPTR:\n");
-
-                       if (!(file->f_mode & FMODE_WRITE))
-                               return -EINVAL;
-
-                       spin_lock_irqsave(&woinst->lock, flags);
-
-                       if (woinst->state & WAVE_STATE_OPEN || 
-                           ((woinst->format.passthrough == 1) && wave_dev->card->pt.state)) {
-                               int num_fragments;
-
-                               if (woinst->format.passthrough == 1) {
-                                       emu10k1_pt_waveout_update(wave_dev);
-                                       cinfo.bytes = woinst->total_played;
-                               } else {
-                                       emu10k1_waveout_update(woinst);
-                                       cinfo.bytes = woinst->total_played;
-                               }
-
-                               cinfo.ptr = woinst->buffer.hw_pos;
-                               num_fragments = cinfo.bytes / woinst->buffer.fragment_size;
-                               cinfo.blocks = num_fragments - woinst->blocks;
-                               woinst->blocks = num_fragments;
-
-                               cinfo.bytes *= woinst->num_voices;
-                               cinfo.ptr *= woinst->num_voices;
-                       } else {
-                               cinfo.ptr = 0;
-                               cinfo.bytes = 0;
-                               cinfo.blocks = 0;
-                       }
-
-                       if (woinst->mmapped)
-                               woinst->buffer.free_bytes %= woinst->buffer.fragment_size;
-
-                       spin_unlock_irqrestore(&woinst->lock, flags);
-
-                       if (copy_to_user(p, &cinfo, sizeof(cinfo)))
-                               return -EFAULT;
-               }
-               break;
-
-       case SNDCTL_DSP_GETBLKSIZE:
-               DPF(2, "SNDCTL_DSP_GETBLKSIZE:\n");
-
-               if (file->f_mode & FMODE_WRITE) {
-                       spin_lock_irqsave(&woinst->lock, flags);
-
-                       calculate_ofrag(woinst);
-                       val = woinst->buffer.fragment_size * woinst->num_voices;
-
-                       spin_unlock_irqrestore(&woinst->lock, flags);
-               }
-
-               if (file->f_mode & FMODE_READ) {
-                       spin_lock_irqsave(&wiinst->lock, flags);
-
-                       calculate_ifrag(wiinst);
-                       val = wiinst->buffer.fragment_size;
-
-                       spin_unlock_irqrestore(&wiinst->lock, flags);
-               }
-
-               return put_user(val, p);
-
-               break;
-
-       case SNDCTL_DSP_POST:
-               if (file->f_mode & FMODE_WRITE) {
-                       spin_lock_irqsave(&woinst->lock, flags);
-
-                       if (!(woinst->state & WAVE_STATE_STARTED)
-                           && (wave_dev->enablebits & PCM_ENABLE_OUTPUT)
-                           && (woinst->total_copied > 0))
-                               emu10k1_waveout_start(wave_dev);
-
-                       spin_unlock_irqrestore(&woinst->lock, flags);
-               }
-
-               break;
-
-       case SNDCTL_DSP_SUBDIVIDE:
-               DPF(2, "SNDCTL_DSP_SUBDIVIDE: not implemented\n");
-               break;
-
-       case SNDCTL_DSP_SETFRAGMENT:
-               DPF(2, "SNDCTL_DSP_SETFRAGMENT:\n");
-
-               if (get_user(val, p))
-                       return -EFAULT;
-
-               DPD(2, "val is %#x\n", val);
-
-               if (val == 0)
-                       return -EIO;
-
-               if (file->f_mode & FMODE_WRITE) {
-                       /* digital pass-through fragment count and size are fixed values */
-                       if (woinst->state & WAVE_STATE_OPEN || (woinst->format.passthrough == 1))
-                               return -EINVAL; /* too late to change */
-
-                       woinst->buffer.ossfragshift = val & 0xffff;
-                       woinst->buffer.numfrags = (val >> 16) & 0xffff;
-               }
-
-               if (file->f_mode & FMODE_READ) {
-                       if (wiinst->state & WAVE_STATE_OPEN)
-                               return -EINVAL; /* too late to change */
-
-                       wiinst->buffer.ossfragshift = val & 0xffff;
-                       wiinst->buffer.numfrags = (val >> 16) & 0xffff;
-               }
-
-               break;
-
-       case SNDCTL_COPR_LOAD:
-               {
-                       copr_buffer *buf;
-                       u32 i;
-
-                       DPF(4, "SNDCTL_COPR_LOAD:\n");
-
-                       buf = kmalloc(sizeof(copr_buffer), GFP_KERNEL);
-                       if (!buf)
-                               return -ENOMEM;
-
-                       if (copy_from_user(buf, p, sizeof(copr_buffer))) {
-                               kfree (buf);
-                               return -EFAULT;
-                       }
-
-                       if ((buf->command != CMD_READ) && (buf->command != CMD_WRITE)) {
-                               kfree (buf);
-                               return -EINVAL;
-                       }
-
-                       if (buf->command == CMD_WRITE) {
-                               
-#ifdef DBGEMU
-                               if ((buf->offs < 0) || (buf->offs + buf->len > 0xe00) || (buf->len > 1000)) {
-#else
-                               if (((buf->offs < 0x100) || (buf->offs + buf->len > (wave_dev->card->is_audigy ? 0xe00 : 0x800)) || (buf->len > 1000)
-                               ) && !(
-                                       //any register allowed raw access to users goes here:
-                                       (buf->offs == DBG ||
-                                         buf->offs == A_DBG)
-                                       && (buf->len == 1))) {
-#endif         
-                                       kfree(buf);
-                                       return -EINVAL;
-                               }
-                       } else {
-                               if ((buf->offs < 0) || (buf->offs + buf->len > 0xe00) || (buf->len > 1000)) {
-                                       kfree(buf);
-                                       return -EINVAL;
-                               }
-                       }                       
-                               
-                       if (((unsigned)buf->flags) > 0x3f)
-                               buf->flags = 0;
-
-                       if (buf->command == CMD_READ) {
-                               for (i = 0; i < buf->len; i++)
-                                       ((u32 *) buf->data)[i] = sblive_readptr(wave_dev->card, buf->offs + i, buf->flags);
-
-                               if (copy_to_user(p, buf, sizeof(copr_buffer))) {
-                                       kfree(buf);
-                                       return -EFAULT;
-                               }
-                       } else {
-                               for (i = 0; i < buf->len; i++)
-                                       sblive_writeptr(wave_dev->card, buf->offs + i, buf->flags, ((u32 *) buf->data)[i]);
-                       }
-
-                       kfree (buf);
-                       break;
-               }
-
-       default:                /* Default is unrecognized command */
-               DPD(2, "default: %#x\n", cmd);
-               return -EINVAL;
-       }
-       return 0;
-}
-
-static struct page *emu10k1_mm_nopage (struct vm_area_struct * vma, unsigned long address, int *type)
-{
-       struct emu10k1_wavedevice *wave_dev = vma->vm_private_data;
-       struct woinst *woinst = wave_dev->woinst;
-       struct wiinst *wiinst = wave_dev->wiinst;
-       struct page *dmapage;
-       unsigned long pgoff;
-       int rd, wr;
-
-       DPF(3, "emu10k1_mm_nopage()\n");
-       DPD(3, "addr: %#lx\n", address);
-
-       if (address > vma->vm_end) {
-               DPF(1, "EXIT, returning NOPAGE_SIGBUS\n");
-               return NOPAGE_SIGBUS; /* Disallow mremap */
-       }
-
-       pgoff = vma->vm_pgoff + ((address - vma->vm_start) >> PAGE_SHIFT);
-       if (woinst != NULL)
-               wr = woinst->mmapped;
-       else
-               wr = 0;
-
-       if (wiinst != NULL)
-               rd = wiinst->mmapped;
-       else
-               rd = 0;
-
-       /* if full-duplex (read+write) and we have two sets of bufs,
-       * then the playback buffers come first, sez soundcard.c */
-       if (wr) {
-               if (pgoff >= woinst->buffer.pages) {
-                       pgoff -= woinst->buffer.pages;
-                       dmapage = virt_to_page ((u8 *) wiinst->buffer.addr + pgoff * PAGE_SIZE);
-               } else
-                       dmapage = virt_to_page (woinst->voice[0].mem.addr[pgoff]);
-       } else {
-               dmapage = virt_to_page ((u8 *) wiinst->buffer.addr + pgoff * PAGE_SIZE);
-       }
-
-       get_page (dmapage);
-
-       DPD(3, "page: %#lx\n", (unsigned long) dmapage);
-       if (type)
-               *type = VM_FAULT_MINOR;
-       return dmapage;
-}
-
-static struct vm_operations_struct emu10k1_mm_ops = {
-       .nopage         = emu10k1_mm_nopage,
-};
-
-static int emu10k1_audio_mmap(struct file *file, struct vm_area_struct *vma)
-{
-       struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
-       unsigned long max_pages, n_pages, pgoffset;
-       struct woinst *woinst = NULL;
-       struct wiinst *wiinst = NULL;
-       unsigned long flags;
-
-       DPF(2, "emu10k1_audio_mmap()\n");
-
-       max_pages = 0;
-       if (vma->vm_flags & VM_WRITE) {
-               woinst = wave_dev->woinst;
-
-               spin_lock_irqsave(&woinst->lock, flags);
-
-               /* No m'mapping possible for multichannel */
-               if (woinst->num_voices > 1) {
-                       spin_unlock_irqrestore(&woinst->lock, flags);
-                       return -EINVAL;
-               }
-
-               if (woinst->state == WAVE_STATE_CLOSED) {
-                       calculate_ofrag(woinst);
-
-                       if (emu10k1_waveout_open(wave_dev) < 0) {
-                               spin_unlock_irqrestore(&woinst->lock, flags);
-                               ERROR();
-                               return -EINVAL;
-                       }
-               }
-
-               woinst->mmapped = 1;
-               max_pages += woinst->buffer.pages;
-               spin_unlock_irqrestore(&woinst->lock, flags);
-       }
-
-       if (vma->vm_flags & VM_READ) {
-               wiinst = wave_dev->wiinst;
-
-               spin_lock_irqsave(&wiinst->lock, flags);
-               if (wiinst->state == WAVE_STATE_CLOSED) {
-                       calculate_ifrag(wiinst);
-
-                       if (emu10k1_wavein_open(wave_dev) < 0) {
-                               spin_unlock_irqrestore(&wiinst->lock, flags);
-                               ERROR();
-                               return -EINVAL;
-                       }
-               }
-
-               wiinst->mmapped = 1;
-               max_pages += wiinst->buffer.pages;
-               spin_unlock_irqrestore(&wiinst->lock, flags);
-       }
-
-       n_pages = ((vma->vm_end - vma->vm_start) + PAGE_SIZE - 1) >> PAGE_SHIFT;
-       pgoffset = vma->vm_pgoff;
-
-       DPD(2, "vma_start: %#lx, vma_end: %#lx, vma_offset: %ld\n", vma->vm_start, vma->vm_end, pgoffset);
-       DPD(2, "n_pages: %ld, max_pages: %ld\n", n_pages, max_pages);
-
-       if (pgoffset + n_pages > max_pages)
-               return -EINVAL;
-
-       vma->vm_flags |= VM_RESERVED;
-       vma->vm_ops = &emu10k1_mm_ops;
-       vma->vm_private_data = wave_dev;
-       return 0;
-}
-
-static int emu10k1_audio_open(struct inode *inode, struct file *file)
-{
-       int minor = iminor(inode);
-       struct emu10k1_card *card = NULL;
-       struct list_head *entry;
-       struct emu10k1_wavedevice *wave_dev;
-
-       DPF(2, "emu10k1_audio_open()\n");
-
-       /* Check for correct device to open */
-
-       list_for_each(entry, &emu10k1_devs) {
-               card = list_entry(entry, struct emu10k1_card, list);
-
-               if (!((card->audio_dev ^ minor) & ~0xf) || !((card->audio_dev1 ^ minor) & ~0xf))
-                       goto match;
-       }
-
-       return -ENODEV;
-
-match:
-
-       wave_dev = kmalloc(sizeof(struct emu10k1_wavedevice), GFP_KERNEL);
-
-       if (wave_dev == NULL) { 
-               ERROR();
-               return -ENOMEM;
-       }
-
-       wave_dev->card = card;
-       wave_dev->wiinst = NULL;
-       wave_dev->woinst = NULL;
-       wave_dev->enablebits = PCM_ENABLE_OUTPUT | PCM_ENABLE_INPUT;    /* Default */
-
-       if (file->f_mode & FMODE_READ) {
-               /* Recording */
-               struct wiinst *wiinst;
-
-               if ((wiinst = kmalloc(sizeof(struct wiinst), GFP_KERNEL)) == NULL) {
-                       ERROR();
-                       kfree(wave_dev);
-                       return -ENOMEM;
-               }
-
-               wiinst->recsrc = card->wavein.recsrc;
-                wiinst->fxwc = card->wavein.fxwc;
-
-               switch (wiinst->recsrc) {
-               case WAVERECORD_AC97:
-                       wiinst->format.id = AFMT_S16_LE;
-                       wiinst->format.samplingrate = 8000;
-                       wiinst->format.bitsperchannel = 16;
-                       wiinst->format.channels = 1;
-                       break;
-               case WAVERECORD_MIC:
-                       wiinst->format.id = AFMT_S16_LE;
-                       wiinst->format.samplingrate = 8000;
-                       wiinst->format.bitsperchannel = 16;
-                       wiinst->format.channels = 1;
-                       break;
-               case WAVERECORD_FX:
-                       wiinst->format.id = AFMT_S16_LE;
-                       wiinst->format.samplingrate = 48000;
-                       wiinst->format.bitsperchannel = 16;
-                       wiinst->format.channels = hweight32(wiinst->fxwc);
-                       break;
-               default:
-                       kfree(wave_dev);
-                       kfree(wiinst);
-                       BUG();
-                       break;
-               }
-
-               wiinst->state = WAVE_STATE_CLOSED;
-
-               wiinst->buffer.ossfragshift = 0;
-               wiinst->buffer.fragment_size = 0;
-               wiinst->buffer.numfrags = 0;
-
-               init_waitqueue_head(&wiinst->wait_queue);
-
-               wiinst->mmapped = 0;
-               wiinst->total_recorded = 0;
-               wiinst->blocks = 0;
-               spin_lock_init(&wiinst->lock);
-               tasklet_init(&wiinst->timer.tasklet, emu10k1_wavein_bh, (unsigned long) wave_dev);
-               wave_dev->wiinst = wiinst;
-               emu10k1_wavein_setformat(wave_dev, &wiinst->format);
-       }
-
-       if (file->f_mode & FMODE_WRITE) {
-               struct woinst *woinst;
-               int i;
-
-               if ((woinst = kmalloc(sizeof(struct woinst), GFP_KERNEL)) == NULL) {
-                       ERROR();
-                       kfree(wave_dev);
-                       return -ENOMEM;
-               }
-
-               if (wave_dev->wiinst != NULL) {
-                       woinst->format = wave_dev->wiinst->format;
-               } else {
-                       woinst->format.id = AFMT_U8;
-                       woinst->format.samplingrate = 8000;
-                       woinst->format.bitsperchannel = 8;
-                       woinst->format.channels = 1;
-               }
-
-               woinst->state = WAVE_STATE_CLOSED;
-
-               woinst->buffer.fragment_size = 0;
-               woinst->buffer.ossfragshift = 0;
-               woinst->buffer.numfrags = 0;
-               woinst->device = (card->audio_dev1 == minor);
-               woinst->timer.state = TIMER_STATE_UNINSTALLED;
-               woinst->num_voices = 1;
-               for (i = 0; i < WAVEOUT_MAXVOICES; i++) {
-                       woinst->voice[i].usage = VOICE_USAGE_FREE;
-                       woinst->voice[i].mem.emupageindex = -1;
-               }
-
-               init_waitqueue_head(&woinst->wait_queue);
-
-               woinst->mmapped = 0;
-               woinst->total_copied = 0;
-               woinst->total_played = 0;
-               woinst->blocks = 0;
-               spin_lock_init(&woinst->lock);
-               tasklet_init(&woinst->timer.tasklet, emu10k1_waveout_bh, (unsigned long) wave_dev);
-               wave_dev->woinst = woinst;
-               emu10k1_waveout_setformat(wave_dev, &woinst->format);
-       }
-
-       file->private_data = (void *) wave_dev;
-
-       return nonseekable_open(inode, file);
-}
-
-static int emu10k1_audio_release(struct inode *inode, struct file *file)
-{
-       struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
-       struct emu10k1_card *card;
-       unsigned long flags;
-
-       card = wave_dev->card;
-
-       DPF(2, "emu10k1_audio_release()\n");
-
-       if (file->f_mode & FMODE_WRITE) {
-               struct woinst *woinst = wave_dev->woinst;
-
-               spin_lock_irqsave(&woinst->lock, flags);
-               if(woinst->format.passthrough==2)
-                       card->pt.state=PT_STATE_PLAYING;
-               if (woinst->format.passthrough && card->pt.state != PT_STATE_INACTIVE){
-                       spin_lock(&card->pt.lock);
-                        emu10k1_pt_stop(card);
-                       spin_unlock(&card->pt.lock);
-               }
-               if (woinst->state & WAVE_STATE_OPEN) {
-                       if (woinst->state & WAVE_STATE_STARTED) {
-                               if (!(file->f_flags & O_NONBLOCK)) {
-                                       while (!signal_pending(current)
-                                              && (woinst->total_played < woinst->total_copied)) {
-                                               DPF(4, "Buffer hasn't been totally played, sleep....\n");
-                                               spin_unlock_irqrestore(&woinst->lock, flags);
-                                               interruptible_sleep_on(&woinst->wait_queue);
-                                               spin_lock_irqsave(&woinst->lock, flags);
-                                       }
-                               }
-                       }
-                       emu10k1_waveout_close(wave_dev);
-               }
-
-               spin_unlock_irqrestore(&woinst->lock, flags);
-               /* remove the tasklet */
-               tasklet_kill(&woinst->timer.tasklet);
-               kfree(wave_dev->woinst);
-       }
-
-       if (file->f_mode & FMODE_READ) {
-               struct wiinst *wiinst = wave_dev->wiinst;
-
-               spin_lock_irqsave(&wiinst->lock, flags);
-
-               if (wiinst->state & WAVE_STATE_OPEN) {
-                       emu10k1_wavein_close(wave_dev);
-               }
-
-               spin_unlock_irqrestore(&wiinst->lock, flags);
-               tasklet_kill(&wiinst->timer.tasklet);
-               kfree(wave_dev->wiinst);
-       }
-
-       kfree(wave_dev);
-
-       if (waitqueue_active(&card->open_wait))
-               wake_up_interruptible(&card->open_wait);
-
-       return 0;
-}
-
-/* FIXME sort out poll() + mmap() */
-static unsigned int emu10k1_audio_poll(struct file *file, struct poll_table_struct *wait)
-{
-       struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
-       struct woinst *woinst = wave_dev->woinst;
-       struct wiinst *wiinst = wave_dev->wiinst;
-       unsigned int mask = 0;
-       u32 bytestocopy;
-       unsigned long flags;
-
-       DPF(4, "emu10k1_audio_poll()\n");
-
-       if (file->f_mode & FMODE_WRITE)
-               poll_wait(file, &woinst->wait_queue, wait);
-
-       if (file->f_mode & FMODE_READ)
-               poll_wait(file, &wiinst->wait_queue, wait);
-
-       if (file->f_mode & FMODE_WRITE) {
-               spin_lock_irqsave(&woinst->lock, flags);
-
-               if (woinst->state & WAVE_STATE_OPEN) {
-                       emu10k1_waveout_update(woinst);
-                       emu10k1_waveout_getxfersize(woinst, &bytestocopy);
-
-                       if (bytestocopy >= woinst->buffer.fragment_size)
-                               mask |= POLLOUT | POLLWRNORM;
-               } else
-                       mask |= POLLOUT | POLLWRNORM;
-
-               spin_unlock_irqrestore(&woinst->lock, flags);
-       }
-
-       if (file->f_mode & FMODE_READ) {
-               spin_lock_irqsave(&wiinst->lock, flags);
-
-               if (wiinst->state & WAVE_STATE_OPEN) {
-                       emu10k1_wavein_update(wave_dev->card, wiinst);
-                       emu10k1_wavein_getxfersize(wiinst, &bytestocopy);
-
-                       if (bytestocopy >= wiinst->buffer.fragment_size)
-                               mask |= POLLIN | POLLRDNORM;
-               }
-
-               spin_unlock_irqrestore(&wiinst->lock, flags);
-       }
-
-       return mask;
-}
-
-static void calculate_ofrag(struct woinst *woinst)
-{
-       struct waveout_buffer *buffer = &woinst->buffer;
-       u32 fragsize;
-
-       if (buffer->fragment_size)
-               return;
-
-       if (!buffer->ossfragshift) {
-               fragsize = (woinst->format.bytespervoicesample * woinst->format.samplingrate * WAVEOUT_DEFAULTFRAGLEN) / 1000 - 1;
-
-               while (fragsize) {
-                       fragsize >>= 1;
-                       buffer->ossfragshift++;
-               }
-       }
-
-       if (buffer->ossfragshift < WAVEOUT_MINFRAGSHIFT)
-               buffer->ossfragshift = WAVEOUT_MINFRAGSHIFT;
-
-       buffer->fragment_size = 1 << buffer->ossfragshift;
-
-       while (buffer->fragment_size * WAVEOUT_MINFRAGS > WAVEOUT_MAXBUFSIZE)
-               buffer->fragment_size >>= 1;
-
-       /* now we are sure that:
-        (2^WAVEOUT_MINFRAGSHIFT) <= (fragment_size = 2^n) <= (WAVEOUT_MAXBUFSIZE / WAVEOUT_MINFRAGS)
-       */
-
-       if (!buffer->numfrags) {
-               u32 numfrags;
-
-               numfrags = (woinst->format.bytespervoicesample * woinst->format.samplingrate * WAVEOUT_DEFAULTBUFLEN) /
-                          (buffer->fragment_size * 1000) - 1;
-
-               buffer->numfrags = 1;
-
-               while (numfrags) {
-                       numfrags >>= 1;
-                       buffer->numfrags <<= 1;
-               }
-       }
-
-       if (buffer->numfrags < WAVEOUT_MINFRAGS)
-               buffer->numfrags = WAVEOUT_MINFRAGS;
-
-       if (buffer->numfrags * buffer->fragment_size > WAVEOUT_MAXBUFSIZE)
-               buffer->numfrags = WAVEOUT_MAXBUFSIZE / buffer->fragment_size;
-
-       if (buffer->numfrags < WAVEOUT_MINFRAGS)
-               BUG();
-
-       buffer->size = buffer->fragment_size * buffer->numfrags;
-       buffer->pages = buffer->size / PAGE_SIZE + ((buffer->size % PAGE_SIZE) ? 1 : 0);
-
-       DPD(2, " calculated playback fragment_size -> %d\n", buffer->fragment_size);
-       DPD(2, " calculated playback numfrags -> %d\n", buffer->numfrags);
-
-       return;
-}
-
-static void calculate_ifrag(struct wiinst *wiinst)
-{
-       struct wavein_buffer *buffer = &wiinst->buffer;
-       u32 fragsize, bufsize, size[4];
-       int i, j;
-
-       if (buffer->fragment_size)
-               return;
-
-       if (!buffer->ossfragshift) {
-               fragsize = (wiinst->format.bytespersec * WAVEIN_DEFAULTFRAGLEN) / 1000 - 1;
-
-               while (fragsize) {
-                       fragsize >>= 1;
-                       buffer->ossfragshift++;
-               }
-       }
-
-       if (buffer->ossfragshift < WAVEIN_MINFRAGSHIFT)
-               buffer->ossfragshift = WAVEIN_MINFRAGSHIFT;
-
-       buffer->fragment_size = 1 << buffer->ossfragshift;
-
-       while (buffer->fragment_size * WAVEIN_MINFRAGS > WAVEIN_MAXBUFSIZE)
-               buffer->fragment_size >>= 1;
-
-       /* now we are sure that:
-          (2^WAVEIN_MINFRAGSHIFT) <= (fragment_size = 2^n) <= (WAVEIN_MAXBUFSIZE / WAVEIN_MINFRAGS)
-        */
-
-
-       if (!buffer->numfrags)
-               buffer->numfrags = (wiinst->format.bytespersec * WAVEIN_DEFAULTBUFLEN) / (buffer->fragment_size * 1000) - 1;
-
-       if (buffer->numfrags < WAVEIN_MINFRAGS)
-               buffer->numfrags = WAVEIN_MINFRAGS;
-
-       if (buffer->numfrags * buffer->fragment_size > WAVEIN_MAXBUFSIZE)
-               buffer->numfrags = WAVEIN_MAXBUFSIZE / buffer->fragment_size;
-
-       if (buffer->numfrags < WAVEIN_MINFRAGS)
-               BUG();
-
-       bufsize = buffer->fragment_size * buffer->numfrags;
-
-       /* the buffer size for recording is restricted to certain values, adjust it now */
-       if (bufsize >= 0x10000) {
-               buffer->size = 0x10000;
-               buffer->sizeregval = 0x1f;
-       } else {
-               buffer->size = 0;
-               size[0] = 384;
-               size[1] = 448;
-               size[2] = 512;
-               size[3] = 640;
-
-               for (i = 0; i < 8; i++)
-                       for (j = 0; j < 4; j++)
-                               if (bufsize >= size[j]) {
-                                       buffer->size = size[j];
-                                       size[j] *= 2;
-                                       buffer->sizeregval = i * 4 + j + 1;
-                               } else
-                                       goto exitloop;
-             exitloop:
-               if (buffer->size == 0) {
-                       buffer->size = 384;
-                       buffer->sizeregval = 0x01;
-               }
-       }
-
-       /* adjust the fragment size so that buffer size is an integer multiple */
-       while (buffer->size % buffer->fragment_size)
-               buffer->fragment_size >>= 1;
-
-       buffer->numfrags = buffer->size / buffer->fragment_size;
-       buffer->pages =  buffer->size / PAGE_SIZE + ((buffer->size % PAGE_SIZE) ? 1 : 0);
-
-       DPD(2, " calculated recording fragment_size -> %d\n", buffer->fragment_size);
-       DPD(2, " calculated recording numfrags -> %d\n", buffer->numfrags);
-       DPD(2, " buffer size register -> %#04x\n", buffer->sizeregval);
-
-       return;
-}
-
-static void emu10k1_wavein_bh(unsigned long refdata)
-{
-       struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) refdata;
-       struct wiinst *wiinst = wave_dev->wiinst;
-       u32 bytestocopy;
-       unsigned long flags;
-
-       if (!wiinst)
-               return;
-
-       spin_lock_irqsave(&wiinst->lock, flags);
-
-       if (!(wiinst->state & WAVE_STATE_STARTED)) {
-               spin_unlock_irqrestore(&wiinst->lock, flags);
-               return;
-       }
-
-       emu10k1_wavein_update(wave_dev->card, wiinst);
-       emu10k1_wavein_getxfersize(wiinst, &bytestocopy);
-
-       spin_unlock_irqrestore(&wiinst->lock, flags);
-
-       if (bytestocopy >= wiinst->buffer.fragment_size) {
-               if (waitqueue_active(&wiinst->wait_queue))
-                       wake_up_interruptible(&wiinst->wait_queue);
-       } else
-               DPD(3, "Not enough transfer size, %d\n", bytestocopy);
-
-       return;
-}
-
-static void emu10k1_waveout_bh(unsigned long refdata)
-{
-       struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) refdata;
-       struct woinst *woinst = wave_dev->woinst;
-       u32 bytestocopy;
-       unsigned long flags;
-
-       if (!woinst)
-               return;
-
-       spin_lock_irqsave(&woinst->lock, flags);
-
-       if (!(woinst->state & WAVE_STATE_STARTED)) {
-               spin_unlock_irqrestore(&woinst->lock, flags);
-               return;
-       }
-
-       emu10k1_waveout_update(woinst);
-       emu10k1_waveout_getxfersize(woinst, &bytestocopy);
-
-       if (woinst->buffer.fill_silence) {
-               spin_unlock_irqrestore(&woinst->lock, flags);
-               emu10k1_waveout_fillsilence(woinst);
-       } else
-               spin_unlock_irqrestore(&woinst->lock, flags);
-
-       if (bytestocopy >= woinst->buffer.fragment_size) {
-               if (waitqueue_active(&woinst->wait_queue))
-                       wake_up_interruptible(&woinst->wait_queue);
-       } else
-               DPD(3, "Not enough transfer size -> %d\n", bytestocopy);
-
-       return;
-}
-
-const struct file_operations emu10k1_audio_fops = {
-       .owner          = THIS_MODULE,
-       .llseek         = no_llseek,
-       .read           = emu10k1_audio_read,
-       .write          = emu10k1_audio_write,
-       .poll           = emu10k1_audio_poll,
-       .ioctl          = emu10k1_audio_ioctl,
-       .mmap           = emu10k1_audio_mmap,
-       .open           = emu10k1_audio_open,
-       .release        = emu10k1_audio_release,
-};
diff --git a/sound/oss/emu10k1/audio.h b/sound/oss/emu10k1/audio.h
deleted file mode 100644 (file)
index 26ee81b..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- **********************************************************************
- *     audio.c -- /dev/dsp interface for emu10k1 driver
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *     November 2, 1999            Alan Cox        cleaned up types/leaks
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#ifndef _AUDIO_H
-#define _AUDIO_H
-
-struct emu10k1_wavedevice
-{
-        struct emu10k1_card *card;
-        struct wiinst *wiinst;
-        struct woinst *woinst;
-        u16 enablebits;
-};
-
-#endif /* _AUDIO_H */
diff --git a/sound/oss/emu10k1/cardmi.c b/sound/oss/emu10k1/cardmi.c
deleted file mode 100644 (file)
index 57674f8..0000000
+++ /dev/null
@@ -1,832 +0,0 @@
-/*
- **********************************************************************
- *     sblive_mi.c - MIDI UART input HAL for emu10k1 driver
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *     November 2, 1999     Alan Cox        clean up
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#include <linux/slab.h>
-#include <linux/jiffies.h>
-
-#include "hwaccess.h"
-#include "8010.h"
-#include "cardmi.h"
-#include "irqmgr.h"
-
-
-static int emu10k1_mpuin_callback(struct emu10k1_mpuin *card_mpuin, u32 msg, unsigned long data, u32 bytesvalid);
-
-static int sblive_miStateInit(struct emu10k1_mpuin *);
-static int sblive_miStateEntry(struct emu10k1_mpuin *, u8);
-static int sblive_miStateParse(struct emu10k1_mpuin *, u8);
-static int sblive_miState3Byte(struct emu10k1_mpuin *, u8);
-static int sblive_miState3ByteKey(struct emu10k1_mpuin *, u8);
-static int sblive_miState3ByteVel(struct emu10k1_mpuin *, u8);
-static int sblive_miState2Byte(struct emu10k1_mpuin *, u8);
-static int sblive_miState2ByteKey(struct emu10k1_mpuin *, u8);
-static int sblive_miStateSysCommon2(struct emu10k1_mpuin *, u8);
-static int sblive_miStateSysCommon2Key(struct emu10k1_mpuin *, u8);
-static int sblive_miStateSysCommon3(struct emu10k1_mpuin *, u8);
-static int sblive_miStateSysCommon3Key(struct emu10k1_mpuin *, u8);
-static int sblive_miStateSysCommon3Vel(struct emu10k1_mpuin *, u8);
-static int sblive_miStateSysExNorm(struct emu10k1_mpuin *, u8);
-static int sblive_miStateSysReal(struct emu10k1_mpuin *, u8);
-
-
-static struct {
-       int (*Fn) (struct emu10k1_mpuin *, u8);
-} midistatefn[] = {
-
-       {
-       sblive_miStateParse}, {
-       sblive_miState3Byte},   /* 0x8n, 0x9n, 0xAn, 0xBn, 0xEn */
-       {
-       sblive_miState3ByteKey},        /* Byte 1                       */
-       {
-       sblive_miState3ByteVel},        /* Byte 2                       */
-       {
-       sblive_miState2Byte},   /* 0xCn, 0xDn                   */
-       {
-       sblive_miState2ByteKey},        /* Byte 1                       */
-       {
-       sblive_miStateSysCommon2},      /* 0xF1 , 0xF3                  */
-       {
-       sblive_miStateSysCommon2Key},   /* 0xF1 , 0xF3, Byte 1          */
-       {
-       sblive_miStateSysCommon3},      /* 0xF2                         */
-       {
-       sblive_miStateSysCommon3Key},   /* 0xF2 , Byte 1                */
-       {
-       sblive_miStateSysCommon3Vel},   /* 0xF2 , Byte 2                */
-       {
-       sblive_miStateSysExNorm},       /* 0xF0, 0xF7, Normal mode      */
-       {
-       sblive_miStateSysReal}  /* 0xF4 - 0xF6 ,0xF8 - 0xFF     */
-};
-
-
-/* Installs the IRQ handler for the MPU in port                 */
-
-/* and initialize parameters                                    */
-
-int emu10k1_mpuin_open(struct emu10k1_card *card, struct midi_openinfo *openinfo)
-{
-       struct emu10k1_mpuin *card_mpuin = card->mpuin;
-
-       DPF(2, "emu10k1_mpuin_open\n");
-
-       if (!(card_mpuin->status & FLAGS_AVAILABLE))
-               return -1;
-
-       /* Copy open info and mark channel as in use */
-       card_mpuin->openinfo = *openinfo;
-       card_mpuin->status &= ~FLAGS_AVAILABLE; /* clear */
-       card_mpuin->status |= FLAGS_READY;      /* set */
-       card_mpuin->status &= ~FLAGS_MIDM_STARTED;      /* clear */
-       card_mpuin->firstmidiq = NULL;
-       card_mpuin->lastmidiq = NULL;
-       card_mpuin->qhead = 0;
-       card_mpuin->qtail = 0;
-
-       sblive_miStateInit(card_mpuin);
-
-       emu10k1_mpu_reset(card);
-       emu10k1_mpu_acquire(card);
-
-       return 0;
-}
-
-int emu10k1_mpuin_close(struct emu10k1_card *card)
-{
-       struct emu10k1_mpuin *card_mpuin = card->mpuin;
-
-       DPF(2, "emu10k1_mpuin_close()\n");
-
-       /* Check if there are pending input SysEx buffers */
-       if (card_mpuin->firstmidiq != NULL) {
-               ERROR();
-               return -1;
-       }
-
-       /* Disable RX interrupt */
-       emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDIRXENABLE : INTE_MIDIRXENABLE);
-
-       emu10k1_mpu_release(card);
-
-       card_mpuin->status |= FLAGS_AVAILABLE;  /* set */
-       card_mpuin->status &= ~FLAGS_MIDM_STARTED;      /* clear */
-
-       return 0;
-}
-
-/* Adds MIDI buffer to local queue list                         */
-
-int emu10k1_mpuin_add_buffer(struct emu10k1_mpuin *card_mpuin, struct midi_hdr *midihdr)
-{
-       struct midi_queue *midiq;
-       unsigned long flags;
-
-       DPF(2, "emu10k1_mpuin_add_buffer()\n");
-
-       /* Update MIDI buffer flags */
-       midihdr->flags |= MIDIBUF_INQUEUE;      /* set */
-       midihdr->flags &= ~MIDIBUF_DONE;        /* clear */
-
-       if ((midiq = kmalloc(sizeof(struct midi_queue), GFP_ATOMIC)) == NULL) {
-               /* Message lost */
-               return -1;
-       }
-
-       midiq->next = NULL;
-       midiq->qtype = 1;
-       midiq->length = midihdr->bufferlength;
-       midiq->sizeLeft = midihdr->bufferlength;
-       midiq->midibyte = midihdr->data;
-       midiq->refdata = (unsigned long) midihdr;
-
-       spin_lock_irqsave(&card_mpuin->lock, flags);
-
-       if (card_mpuin->firstmidiq == NULL) {
-               card_mpuin->firstmidiq = midiq;
-               card_mpuin->lastmidiq = midiq;
-       } else {
-               (card_mpuin->lastmidiq)->next = midiq;
-               card_mpuin->lastmidiq = midiq;
-       }
-
-       spin_unlock_irqrestore(&card_mpuin->lock, flags);
-
-       return 0;
-}
-
-/* First set the Time Stamp if MIDI IN has not started.         */
-
-/* Then enable RX Irq.                                          */
-
-int emu10k1_mpuin_start(struct emu10k1_card *card)
-{
-       struct emu10k1_mpuin *card_mpuin = card->mpuin;
-       u8 dummy;
-
-       DPF(2, "emu10k1_mpuin_start()\n");
-
-       /* Set timestamp if not set */
-       if (card_mpuin->status & FLAGS_MIDM_STARTED) {
-               DPF(2, "Time Stamp not changed\n");
-       } else {
-               while (!emu10k1_mpu_read_data(card, &dummy));
-
-               card_mpuin->status |= FLAGS_MIDM_STARTED;       /* set */
-
-               /* Set new time stamp */
-               card_mpuin->timestart = (jiffies * 1000) / HZ;
-               DPD(2, "New Time Stamp = %d\n", card_mpuin->timestart);
-
-               card_mpuin->qhead = 0;
-               card_mpuin->qtail = 0;
-
-               emu10k1_irq_enable(card, card->is_audigy ? A_INTE_MIDIRXENABLE : INTE_MIDIRXENABLE);
-       }
-
-       return 0;
-}
-
-/* Disable the RX Irq.  If a partial recorded buffer            */
-
-/* exist, send it up to IMIDI level.                            */
-
-int emu10k1_mpuin_stop(struct emu10k1_card *card)
-{
-       struct emu10k1_mpuin *card_mpuin = card->mpuin;
-       struct midi_queue *midiq;
-       unsigned long flags;
-
-       DPF(2, "emu10k1_mpuin_stop()\n");
-
-       emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDIRXENABLE : INTE_MIDIRXENABLE);
-
-       card_mpuin->status &= ~FLAGS_MIDM_STARTED;      /* clear */
-
-       if (card_mpuin->firstmidiq) {
-               spin_lock_irqsave(&card_mpuin->lock, flags);
-
-               midiq = card_mpuin->firstmidiq;
-               if (midiq != NULL) {
-                       if (midiq->sizeLeft == midiq->length)
-                               midiq = NULL;
-                       else {
-                               card_mpuin->firstmidiq = midiq->next;
-                               if (card_mpuin->firstmidiq == NULL)
-                                       card_mpuin->lastmidiq = NULL;
-                       }
-               }
-
-               spin_unlock_irqrestore(&card_mpuin->lock, flags);
-
-               if (midiq) {
-                       emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INLONGERROR, (unsigned long) midiq, 0);
-                       kfree(midiq);
-               }
-       }
-
-       return 0;
-}
-
-/* Disable the RX Irq.  If any buffer                           */
-
-/* exist, send it up to IMIDI level.                            */
-int emu10k1_mpuin_reset(struct emu10k1_card *card)
-{
-       struct emu10k1_mpuin *card_mpuin = card->mpuin;
-       struct midi_queue *midiq;
-
-       DPF(2, "emu10k1_mpuin_reset()\n");
-
-       emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDIRXENABLE : INTE_MIDIRXENABLE);
-
-       while (card_mpuin->firstmidiq) {
-               midiq = card_mpuin->firstmidiq;
-               card_mpuin->firstmidiq = midiq->next;
-
-               if (midiq->sizeLeft == midiq->length)
-                       emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INLONGDATA, (unsigned long) midiq, 0);
-               else
-                       emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INLONGERROR, (unsigned long) midiq, 0);
-
-               kfree(midiq);
-       }
-
-       card_mpuin->lastmidiq = NULL;
-       card_mpuin->status &= ~FLAGS_MIDM_STARTED;
-
-       return 0;
-}
-
-/* Passes the message with the data back to the client          */
-
-/* via IRQ & DPC callbacks to Ring 3                            */
-static int emu10k1_mpuin_callback(struct emu10k1_mpuin *card_mpuin, u32 msg, unsigned long data, u32 bytesvalid)
-{
-       unsigned long timein;
-       struct midi_queue *midiq;
-       unsigned long callback_msg[3];
-       struct midi_hdr *midihdr;
-
-       /* Called during ISR. The data & code touched are:
-        * 1. card_mpuin
-        * 2. The function to be called
-        */
-
-       timein = card_mpuin->timein;
-       if (card_mpuin->timestart <= timein)
-               callback_msg[0] = timein - card_mpuin->timestart;
-       else
-               callback_msg[0] = (~0x0L - card_mpuin->timestart) + timein;
-
-       if (msg == ICARDMIDI_INDATA || msg == ICARDMIDI_INDATAERROR) {
-               callback_msg[1] = data;
-               callback_msg[2] = bytesvalid;
-               DPD(2, "emu10k1_mpuin_callback: midimsg = %#lx\n", data);
-       } else {
-               midiq = (struct midi_queue *) data;
-               midihdr = (struct midi_hdr *) midiq->refdata;
-
-               callback_msg[1] = midiq->length - midiq->sizeLeft;
-               callback_msg[2] = midiq->refdata;
-               midihdr->flags &= ~MIDIBUF_INQUEUE;
-               midihdr->flags |= MIDIBUF_DONE;
-
-               midihdr->bytesrecorded = midiq->length - midiq->sizeLeft;
-       }
-
-       /* Notify client that Sysex buffer has been sent */
-       emu10k1_midi_callback(msg, card_mpuin->openinfo.refdata, callback_msg);
-
-       return 0;
-}
-
-void emu10k1_mpuin_bh(unsigned long refdata)
-{
-       u8 data;
-       unsigned idx;
-       struct emu10k1_mpuin *card_mpuin = (struct emu10k1_mpuin *) refdata;
-       unsigned long flags;
-
-       while (card_mpuin->qhead != card_mpuin->qtail) {
-               spin_lock_irqsave(&card_mpuin->lock, flags);
-               idx = card_mpuin->qhead;
-               data = card_mpuin->midiq[idx].data;
-               card_mpuin->timein = card_mpuin->midiq[idx].timein;
-               idx = (idx + 1) % MIDIIN_MAX_BUFFER_SIZE;
-               card_mpuin->qhead = idx;
-               spin_unlock_irqrestore(&card_mpuin->lock, flags);
-
-               sblive_miStateEntry(card_mpuin, data);
-       }
-
-       return;
-}
-
-/* IRQ callback handler routine for the MPU in port */
-
-int emu10k1_mpuin_irqhandler(struct emu10k1_card *card)
-{
-       unsigned idx;
-       unsigned count;
-       u8 MPUIvalue;
-       struct emu10k1_mpuin *card_mpuin = card->mpuin;
-
-       /* IRQ service routine. The data and code touched are:
-        * 1. card_mpuin
-        */
-
-       count = 0;
-       idx = card_mpuin->qtail;
-
-       while (1) {
-               if (emu10k1_mpu_read_data(card, &MPUIvalue) < 0) {
-                       break;
-               } else {
-                       ++count;
-                       card_mpuin->midiq[idx].data = MPUIvalue;
-                       card_mpuin->midiq[idx].timein = (jiffies * 1000) / HZ;
-                       idx = (idx + 1) % MIDIIN_MAX_BUFFER_SIZE;
-               }
-       }
-
-       if (count) {
-               card_mpuin->qtail = idx;
-
-               tasklet_hi_schedule(&card_mpuin->tasklet);
-       }
-
-       return 0;
-}
-
-/*****************************************************************************/
-
-/*   Supporting functions for Midi-In Interpretation State Machine           */
-
-/*****************************************************************************/
-
-/* FIXME: This should be a macro */
-static int sblive_miStateInit(struct emu10k1_mpuin *card_mpuin)
-{
-       card_mpuin->status = 0; /* For MIDI running status */
-       card_mpuin->fstatus = 0;        /* For 0xFn status only */
-       card_mpuin->curstate = STIN_PARSE;
-       card_mpuin->laststate = STIN_PARSE;
-       card_mpuin->data = 0;
-       card_mpuin->timestart = 0;
-       card_mpuin->timein = 0;
-
-       return 0;
-}
-
-/* FIXME: This should be a macro */
-static int sblive_miStateEntry(struct emu10k1_mpuin *card_mpuin, u8 data)
-{
-       return midistatefn[card_mpuin->curstate].Fn(card_mpuin, data);
-}
-
-static int sblive_miStateParse(struct emu10k1_mpuin *card_mpuin, u8 data)
-{
-       switch (data & 0xf0) {
-       case 0x80:
-       case 0x90:
-       case 0xA0:
-       case 0xB0:
-       case 0xE0:
-               card_mpuin->curstate = STIN_3BYTE;
-               break;
-
-       case 0xC0:
-       case 0xD0:
-               card_mpuin->curstate = STIN_2BYTE;
-               break;
-
-       case 0xF0:
-               /* System messages do not affect the previous running status! */
-               switch (data & 0x0f) {
-               case 0x0:
-                       card_mpuin->laststate = card_mpuin->curstate;
-                       card_mpuin->curstate = STIN_SYS_EX_NORM;
-
-                       if (card_mpuin->firstmidiq) {
-                               struct midi_queue *midiq;
-
-                               midiq = card_mpuin->firstmidiq;
-                               *midiq->midibyte = data;
-                               --midiq->sizeLeft;
-                               ++midiq->midibyte;
-                       }
-
-                       return CTSTATUS_NEXT_BYTE;
-
-               case 0x7:
-                       emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, 0xf7, 0);
-                       return -1;
-
-               case 0x2:
-                       card_mpuin->laststate = card_mpuin->curstate;
-                       card_mpuin->curstate = STIN_SYS_COMMON_3;
-                       break;
-
-               case 0x1:
-               case 0x3:
-                       card_mpuin->laststate = card_mpuin->curstate;
-                       card_mpuin->curstate = STIN_SYS_COMMON_2;
-                       break;
-
-               default:
-                       /* includes 0xF4 - 0xF6, 0xF8 - 0xFF */
-                       return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data);
-               }
-
-               break;
-
-       default:
-               DPF(2, "BUG: default case hit\n");
-               return -1;
-       }
-
-       return midistatefn[card_mpuin->curstate].Fn(card_mpuin, data);
-}
-
-static int sblive_miState3Byte(struct emu10k1_mpuin *card_mpuin, u8 data)
-{
-       u8 temp = data & 0xf0;
-
-       if (temp < 0x80) {
-               return midistatefn[STIN_3BYTE_KEY].Fn(card_mpuin, data);
-       } else if (temp <= 0xe0 && temp != 0xc0 && temp != 0xd0) {
-               card_mpuin->status = data;
-               card_mpuin->curstate = STIN_3BYTE_KEY;
-
-               return CTSTATUS_NEXT_BYTE;
-       }
-
-       return midistatefn[STIN_PARSE].Fn(card_mpuin, data);
-}
-
-static int sblive_miState3ByteKey(struct emu10k1_mpuin *card_mpuin, u8 data)
-/* byte 1 */
-{
-       unsigned long tmp;
-
-       if (data > 0x7f) {
-               /* Real-time messages check */
-               if (data > 0xf7)
-                       return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data);
-
-               /* Invalid data! */
-               DPF(2, "Invalid data!\n");
-
-               card_mpuin->curstate = STIN_PARSE;
-               tmp = ((unsigned long) data) << 8;
-               tmp |= (unsigned long) card_mpuin->status;
-
-               emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0);
-
-               return -1;
-       }
-
-       card_mpuin->data = data;
-       card_mpuin->curstate = STIN_3BYTE_VEL;
-
-       return CTSTATUS_NEXT_BYTE;
-}
-
-static int sblive_miState3ByteVel(struct emu10k1_mpuin *card_mpuin, u8 data)
-/* byte 2 */
-{
-       unsigned long tmp;
-
-       if (data > 0x7f) {
-               /* Real-time messages check */
-               if (data > 0xf7)
-                       return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data);
-
-               /* Invalid data! */
-               DPF(2, "Invalid data!\n");
-
-               card_mpuin->curstate = STIN_PARSE;
-               tmp = ((unsigned long) data) << 8;
-               tmp |= card_mpuin->data;
-               tmp = tmp << 8;
-               tmp |= (unsigned long) card_mpuin->status;
-
-               emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0);
-
-               return -1;
-       }
-
-       card_mpuin->curstate = STIN_3BYTE;
-       tmp = (unsigned long) data;
-       tmp = tmp << 8;
-       tmp |= (unsigned long) card_mpuin->data;
-       tmp = tmp << 8;
-       tmp |= (unsigned long) card_mpuin->status;
-
-       emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATA, tmp, 3);
-
-       return 0;
-}
-
-static int sblive_miState2Byte(struct emu10k1_mpuin *card_mpuin, u8 data)
-{
-       u8 temp = data & 0xf0;
-
-       if ((temp == 0xc0) || (temp == 0xd0)) {
-               card_mpuin->status = data;
-               card_mpuin->curstate = STIN_2BYTE_KEY;
-
-               return CTSTATUS_NEXT_BYTE;
-       }
-
-       if (temp < 0x80)
-               return midistatefn[STIN_2BYTE_KEY].Fn(card_mpuin, data);
-
-       return midistatefn[STIN_PARSE].Fn(card_mpuin, data);
-}
-
-static int sblive_miState2ByteKey(struct emu10k1_mpuin *card_mpuin, u8 data)
-/* byte 1 */
-{
-       unsigned long tmp;
-
-       if (data > 0x7f) {
-               /* Real-time messages check */
-               if (data > 0xf7)
-                       return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data);
-
-               /* Invalid data! */
-               DPF(2, "Invalid data!\n");
-
-               card_mpuin->curstate = STIN_PARSE;
-               tmp = (unsigned long) data;
-               tmp = tmp << 8;
-               tmp |= (unsigned long) card_mpuin->status;
-
-               emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0);
-
-               return -1;
-       }
-
-       card_mpuin->curstate = STIN_2BYTE;
-       tmp = (unsigned long) data;
-       tmp = tmp << 8;
-       tmp |= (unsigned long) card_mpuin->status;
-
-       emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATA, tmp, 2);
-
-       return 0;
-}
-
-static int sblive_miStateSysCommon2(struct emu10k1_mpuin *card_mpuin, u8 data)
-{
-       card_mpuin->fstatus = data;
-       card_mpuin->curstate = STIN_SYS_COMMON_2_KEY;
-
-       return CTSTATUS_NEXT_BYTE;
-}
-
-static int sblive_miStateSysCommon2Key(struct emu10k1_mpuin *card_mpuin, u8 data)
-/* byte 1 */
-{
-       unsigned long tmp;
-
-       if (data > 0x7f) {
-               /* Real-time messages check */
-               if (data > 0xf7)
-                       return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data);
-
-               /* Invalid data! */
-               DPF(2, "Invalid data!\n");
-
-               card_mpuin->curstate = card_mpuin->laststate;
-               tmp = (unsigned long) data;
-               tmp = tmp << 8;
-               tmp |= (unsigned long) card_mpuin->fstatus;
-
-               emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0);
-
-               return -1;
-       }
-
-       card_mpuin->curstate = card_mpuin->laststate;
-       tmp = (unsigned long) data;
-       tmp = tmp << 8;
-       tmp |= (unsigned long) card_mpuin->fstatus;
-
-       emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATA, tmp, 2);
-
-       return 0;
-}
-
-static int sblive_miStateSysCommon3(struct emu10k1_mpuin *card_mpuin, u8 data)
-{
-       card_mpuin->fstatus = data;
-       card_mpuin->curstate = STIN_SYS_COMMON_3_KEY;
-
-       return CTSTATUS_NEXT_BYTE;
-}
-
-static int sblive_miStateSysCommon3Key(struct emu10k1_mpuin *card_mpuin, u8 data)
-/* byte 1 */
-{
-       unsigned long tmp;
-
-       if (data > 0x7f) {
-               /* Real-time messages check */
-               if (data > 0xf7)
-                       return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data);
-
-               /* Invalid data! */
-               DPF(2, "Invalid data!\n");
-
-               card_mpuin->curstate = card_mpuin->laststate;
-               tmp = (unsigned long) data;
-               tmp = tmp << 8;
-               tmp |= (unsigned long) card_mpuin->fstatus;
-
-               emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0);
-
-               return -1;
-       }
-
-       card_mpuin->data = data;
-       card_mpuin->curstate = STIN_SYS_COMMON_3_VEL;
-
-       return CTSTATUS_NEXT_BYTE;
-}
-
-static int sblive_miStateSysCommon3Vel(struct emu10k1_mpuin *card_mpuin, u8 data)
-/* byte 2 */
-{
-       unsigned long tmp;
-
-       if (data > 0x7f) {
-               /* Real-time messages check */
-               if (data > 0xf7)
-                       return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data);
-
-               /* Invalid data! */
-               DPF(2, "Invalid data!\n");
-
-               card_mpuin->curstate = card_mpuin->laststate;
-               tmp = (unsigned long) data;
-               tmp = tmp << 8;
-               tmp |= (unsigned long) card_mpuin->data;
-               tmp = tmp << 8;
-               tmp |= (unsigned long) card_mpuin->fstatus;
-
-               emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0);
-
-               return -1;
-       }
-
-       card_mpuin->curstate = card_mpuin->laststate;
-       tmp = (unsigned long) data;
-       tmp = tmp << 8;
-       tmp |= (unsigned long) card_mpuin->data;
-       tmp = tmp << 8;
-       tmp |= (unsigned long) card_mpuin->fstatus;
-
-       emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATA, tmp, 3);
-
-       return 0;
-}
-
-static int sblive_miStateSysExNorm(struct emu10k1_mpuin *card_mpuin, u8 data)
-{
-       unsigned long flags;
-
-       if ((data > 0x7f) && (data != 0xf7)) {
-               /* Real-time messages check */
-               if (data > 0xf7)
-                       return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data);
-
-               /* Invalid Data! */
-               DPF(2, "Invalid data!\n");
-
-               card_mpuin->curstate = card_mpuin->laststate;
-
-               if (card_mpuin->firstmidiq) {
-                       struct midi_queue *midiq;
-
-                       midiq = card_mpuin->firstmidiq;
-                       *midiq->midibyte = data;
-                       --midiq->sizeLeft;
-                       ++midiq->midibyte;
-
-                       spin_lock_irqsave(&card_mpuin->lock, flags);
-
-                       card_mpuin->firstmidiq = midiq->next;
-                       if (card_mpuin->firstmidiq == NULL)
-                               card_mpuin->lastmidiq = NULL;
-
-                       spin_unlock_irqrestore(&card_mpuin->lock, flags);
-
-                       emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INLONGERROR, (unsigned long) midiq, 0);
-
-                       kfree(midiq);
-               }
-
-               return -1;
-       }
-
-       if (card_mpuin->firstmidiq) {
-               struct midi_queue *midiq;
-
-               midiq = card_mpuin->firstmidiq;
-               *midiq->midibyte = data;
-               --midiq->sizeLeft;
-               ++midiq->midibyte;
-       }
-
-       if (data == 0xf7) {
-               /* End of Sysex buffer */
-               /* Send down the buffer */
-
-               card_mpuin->curstate = card_mpuin->laststate;
-
-               if (card_mpuin->firstmidiq) {
-                       struct midi_queue *midiq;
-
-                       midiq = card_mpuin->firstmidiq;
-
-                       spin_lock_irqsave(&card_mpuin->lock, flags);
-
-                       card_mpuin->firstmidiq = midiq->next;
-                       if (card_mpuin->firstmidiq == NULL)
-                               card_mpuin->lastmidiq = NULL;
-
-                       spin_unlock_irqrestore(&card_mpuin->lock, flags);
-
-                       emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INLONGDATA, (unsigned long) midiq, 0);
-
-                       kfree(midiq);
-               }
-
-               return 0;
-       }
-
-       if (card_mpuin->firstmidiq) {
-               struct midi_queue *midiq;
-
-               midiq = card_mpuin->firstmidiq;
-
-               if (midiq->sizeLeft == 0) {
-                       /* Special case */
-
-                       spin_lock_irqsave(&card_mpuin->lock, flags);
-
-                       card_mpuin->firstmidiq = midiq->next;
-                       if (card_mpuin->firstmidiq == NULL)
-                               card_mpuin->lastmidiq = NULL;
-
-                       spin_unlock_irqrestore(&card_mpuin->lock, flags);
-
-                       emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INLONGDATA, (unsigned long) midiq, 0);
-
-                       kfree(midiq);
-
-                       return CTSTATUS_NEXT_BYTE;
-               }
-       }
-
-       return CTSTATUS_NEXT_BYTE;
-}
-
-static int sblive_miStateSysReal(struct emu10k1_mpuin *card_mpuin, u8 data)
-{
-       emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATA, data, 1);
-
-       return CTSTATUS_NEXT_BYTE;
-}
diff --git a/sound/oss/emu10k1/cardmi.h b/sound/oss/emu10k1/cardmi.h
deleted file mode 100644 (file)
index d12c241..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- **********************************************************************
- *     sblive_mi.h
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *     November 2, 1999     Alan Cox        cleaned up
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#ifndef _CARDMI_H
-#define _CARDMI_H
-
-#include "icardmid.h"
-#include <linux/interrupt.h>
-
-typedef enum
-{
-       STIN_PARSE = 0,
-       STIN_3BYTE,                     /* 0x80, 0x90, 0xA0, 0xB0, 0xE0 */
-       STIN_3BYTE_KEY,                 /* Byte 1 */
-       STIN_3BYTE_VEL,                 /* Byte 1 */
-       STIN_2BYTE,                     /* 0xC0, 0xD0 */
-       STIN_2BYTE_KEY,                 /* Byte 1 */
-       STIN_SYS_COMMON_2,              /* 0xF1, 0xF3  */
-       STIN_SYS_COMMON_2_KEY,
-       STIN_SYS_COMMON_3,              /* 0xF2 */
-       STIN_SYS_COMMON_3_KEY,
-       STIN_SYS_COMMON_3_VEL,
-       STIN_SYS_EX_NORM,               /* 0xF0, Normal mode */
-       STIN_SYS_REAL
-} midi_in_state;
-
-
-/* flags for card MIDI in object */
-#define FLAGS_MIDM_STARTED          0x00001000      // Data has started to come in after Midm Start
-#define MIDIIN_MAX_BUFFER_SIZE      200             // Definition for struct emu10k1_mpuin
-
-struct midi_data
-{
-       u8 data;
-       u32 timein;
-};
-
-struct emu10k1_mpuin
-{
-       spinlock_t        lock;
-       struct midi_queue *firstmidiq;
-       struct midi_queue *lastmidiq;
-       unsigned          qhead, qtail;
-       struct midi_data  midiq[MIDIIN_MAX_BUFFER_SIZE];
-       struct tasklet_struct tasklet;
-       struct midi_openinfo    openinfo;
-
-       /* For MIDI state machine */
-       u8              status;        /* For MIDI running status */
-       u8              fstatus;       /* For 0xFn status only */
-       midi_in_state   curstate;
-       midi_in_state   laststate;
-       u32             timestart;
-       u32             timein;
-       u8              data;
-};
-
-int emu10k1_mpuin_open(struct emu10k1_card *, struct midi_openinfo *);
-int emu10k1_mpuin_close(struct emu10k1_card *);
-int emu10k1_mpuin_add_buffer(struct emu10k1_mpuin *, struct midi_hdr *);
-int emu10k1_mpuin_start(struct emu10k1_card *);
-int emu10k1_mpuin_stop(struct emu10k1_card *);
-int emu10k1_mpuin_reset(struct emu10k1_card *);
-
-int emu10k1_mpuin_irqhandler(struct emu10k1_card *);
-void emu10k1_mpuin_bh(unsigned long);
-
-#endif  /* _CARDMI_H */
diff --git a/sound/oss/emu10k1/cardmo.c b/sound/oss/emu10k1/cardmo.c
deleted file mode 100644 (file)
index a8cc75d..0000000
+++ /dev/null
@@ -1,229 +0,0 @@
-/*     
- **********************************************************************
- *     cardmo.c - MIDI UART output HAL for emu10k1 driver 
- *     Copyright 1999, 2000 Creative Labs, Inc. 
- * 
- ********************************************************************** 
- * 
- *     Date                 Author          Summary of changes 
- *     ----                 ------          ------------------ 
- *     October 20, 1999     Bertrand Lee    base code release 
- *     November 2, 1999     Alan Cox        cleaned up
- * 
- ********************************************************************** 
- * 
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version. 
- * 
- *     This program is distributed in the hope that it will be useful, 
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of 
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
- *     GNU General Public License for more details. 
- * 
- *     You should have received a copy of the GNU General Public 
- *     License along with this program; if not, write to the Free 
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 
- *     USA. 
- * 
- ********************************************************************** 
- */
-
-#include <linux/slab.h>
-
-#include "hwaccess.h"
-#include "8010.h"
-#include "cardmo.h"
-#include "irqmgr.h"
-
-/* Installs the IRQ handler for the MPU out port               *
- * and initialize parameters                                    */
-
-int emu10k1_mpuout_open(struct emu10k1_card *card, struct midi_openinfo *openinfo)
-{
-       struct emu10k1_mpuout *card_mpuout = card->mpuout;
-
-       DPF(2, "emu10k1_mpuout_open()\n");
-
-       if (!(card_mpuout->status & FLAGS_AVAILABLE))
-               return -1;
-
-       /* Copy open info and mark channel as in use */
-       card_mpuout->intr = 0;
-       card_mpuout->openinfo = *openinfo;
-       card_mpuout->status &= ~FLAGS_AVAILABLE;
-       card_mpuout->laststatus = 0x80;
-       card_mpuout->firstmidiq = NULL;
-       card_mpuout->lastmidiq = NULL;
-
-       emu10k1_mpu_reset(card);
-       emu10k1_mpu_acquire(card);
-
-       return 0;
-}
-
-int emu10k1_mpuout_close(struct emu10k1_card *card)
-{
-       struct emu10k1_mpuout *card_mpuout = card->mpuout;
-       struct midi_queue *midiq;
-       struct midi_hdr *midihdr;
-       unsigned long flags;
-
-       DPF(2, "emu10k1_mpuout_close()\n");
-
-       emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDITXENABLE : INTE_MIDITXENABLE);
-
-       spin_lock_irqsave(&card_mpuout->lock, flags);
-
-       while (card_mpuout->firstmidiq != NULL) {
-               midiq = card_mpuout->firstmidiq;
-               midihdr = (struct midi_hdr *) midiq->refdata;
-
-               card_mpuout->firstmidiq = midiq->next;
-
-               kfree(midihdr->data);
-               kfree(midihdr);
-               kfree(midiq);
-       }
-
-       card_mpuout->lastmidiq = NULL;
-
-       emu10k1_mpu_release(card);
-
-       card_mpuout->status |= FLAGS_AVAILABLE;
-
-       spin_unlock_irqrestore(&card_mpuout->lock, flags);
-
-       return 0;
-}
-
-/* If there isn't enough buffer space, reject Midi Buffer.     *
-* Otherwise, disable TX, create object to hold Midi            *
-*  uffer, update buffer flags and other parameters             *
-* before enabling TX again.                                    */
-
-int emu10k1_mpuout_add_buffer(struct emu10k1_card *card, struct midi_hdr *midihdr)
-{
-       struct emu10k1_mpuout *card_mpuout = card->mpuout;
-       struct midi_queue *midiq;
-       unsigned long flags;
-
-       DPF(2, "emu10k1_mpuout_add_buffer()\n");
-
-       if (card_mpuout->state == CARDMIDIOUT_STATE_SUSPEND)
-               return 0;
-
-       midihdr->flags |= MIDIBUF_INQUEUE;
-       midihdr->flags &= ~MIDIBUF_DONE;
-
-       if ((midiq = kmalloc(sizeof(struct midi_queue), GFP_KERNEL)) == NULL) {
-               /* Message lost */
-               return -1;
-       }
-
-       midiq->next = NULL;
-       midiq->qtype = 1;
-       midiq->length = midihdr->bufferlength;
-       midiq->sizeLeft = midihdr->bufferlength;
-       midiq->midibyte = midihdr->data;
-
-       midiq->refdata = (unsigned long) midihdr;
-
-       spin_lock_irqsave(&card_mpuout->lock, flags);
-
-       if (card_mpuout->firstmidiq == NULL) {
-               card_mpuout->firstmidiq = midiq;
-               card_mpuout->lastmidiq = midiq;
-       } else {
-               (card_mpuout->lastmidiq)->next = midiq;
-               card_mpuout->lastmidiq = midiq;
-       }
-
-       card_mpuout->intr = 0;
-
-       emu10k1_irq_enable(card, card->is_audigy ? A_INTE_MIDITXENABLE : INTE_MIDITXENABLE);
-
-       spin_unlock_irqrestore(&card_mpuout->lock, flags);
-
-       return 0;
-}
-
-void emu10k1_mpuout_bh(unsigned long refdata)
-{
-       struct emu10k1_card *card = (struct emu10k1_card *) refdata;
-       struct emu10k1_mpuout *card_mpuout = card->mpuout;
-       int cByteSent = 0;
-       struct midi_queue *midiq;
-       struct midi_queue *doneq = NULL;
-       unsigned long flags;
-
-       spin_lock_irqsave(&card_mpuout->lock, flags);
-
-       while (card_mpuout->firstmidiq != NULL) {
-               midiq = card_mpuout->firstmidiq;
-
-               while (cByteSent < 4 && midiq->sizeLeft) {
-                       if (emu10k1_mpu_write_data(card, *midiq->midibyte) < 0) {
-                               DPF(2, "emu10k1_mpuoutDpcCallback error!!\n");
-                       } else {
-                               ++cByteSent;
-                               --midiq->sizeLeft;
-                               ++midiq->midibyte;
-                       }
-               }
-
-               if (midiq->sizeLeft == 0) {
-                       if (doneq == NULL)
-                               doneq = midiq;
-                       card_mpuout->firstmidiq = midiq->next;
-               } else
-                       break;
-       }
-
-       if (card_mpuout->firstmidiq == NULL)
-               card_mpuout->lastmidiq = NULL;
-
-       if (doneq != NULL) {
-               while (doneq != card_mpuout->firstmidiq) {
-                       unsigned long callback_msg[3];
-
-                       midiq = doneq;
-                       doneq = midiq->next;
-
-                       if (midiq->qtype) {
-                               callback_msg[0] = 0;
-                               callback_msg[1] = midiq->length;
-                               callback_msg[2] = midiq->refdata;
-
-                               emu10k1_midi_callback(ICARDMIDI_OUTLONGDATA, card_mpuout->openinfo.refdata, callback_msg);
-                       } else if (((u8) midiq->refdata) < 0xF0 && ((u8) midiq->refdata) > 0x7F)
-                               card_mpuout->laststatus = (u8) midiq->refdata;
-
-                       kfree(midiq);
-               }
-       }
-
-       if ((card_mpuout->firstmidiq != NULL) || cByteSent) {
-               card_mpuout->intr = 0;
-               emu10k1_irq_enable(card, card->is_audigy ? A_INTE_MIDITXENABLE : INTE_MIDITXENABLE);
-       }
-
-       spin_unlock_irqrestore(&card_mpuout->lock, flags);
-
-       return;
-}
-
-int emu10k1_mpuout_irqhandler(struct emu10k1_card *card)
-{
-       struct emu10k1_mpuout *card_mpuout = card->mpuout;
-
-       DPF(4, "emu10k1_mpuout_irqhandler\n");
-
-       card_mpuout->intr = 1;
-       emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDITXENABLE : INTE_MIDITXENABLE);
-
-       tasklet_hi_schedule(&card_mpuout->tasklet);
-
-       return 0;
-}
diff --git a/sound/oss/emu10k1/cardmo.h b/sound/oss/emu10k1/cardmo.h
deleted file mode 100644 (file)
index 7026eb3..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- **********************************************************************
- *     cardmo.h
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *     November 2, 1999     Alan Cox       cleaned up
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#ifndef _CARDMO_H
-#define _CARDMO_H
-
-#include "icardmid.h"
-#include <linux/interrupt.h>
-
-#define CARDMIDIOUT_STATE_DEFAULT    0x00000000
-#define CARDMIDIOUT_STATE_SUSPEND    0x00000001
-
-struct emu10k1_mpuout
-{
-       u32                     status;
-       u32                     state;
-       volatile int            intr;
-       struct midi_queue       *firstmidiq;
-       struct midi_queue       *lastmidiq;
-       u8                      laststatus;
-       struct tasklet_struct   tasklet;
-       spinlock_t              lock;
-       struct midi_openinfo    openinfo;
-};
-
-int emu10k1_mpuout_open(struct emu10k1_card *, struct midi_openinfo *);
-int emu10k1_mpuout_close(struct emu10k1_card *);
-int emu10k1_mpuout_add_buffer(struct emu10k1_card *, struct midi_hdr *);
-
-int emu10k1_mpuout_irqhandler(struct emu10k1_card *);
-void emu10k1_mpuout_bh(unsigned long);
-
-#endif  /* _CARDMO_H */
diff --git a/sound/oss/emu10k1/cardwi.c b/sound/oss/emu10k1/cardwi.c
deleted file mode 100644 (file)
index 060d1be..0000000
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
- **********************************************************************
- *     cardwi.c - PCM input HAL for emu10k1 driver
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#include <linux/poll.h>
-#include "hwaccess.h"
-#include "timer.h"
-#include "recmgr.h"
-#include "audio.h"
-#include "cardwi.h"
-
-/**
- * query_format - returns a valid sound format
- *
- * This function will return a valid sound format as close
- * to the requested one as possible. 
- */
-static void query_format(int recsrc, struct wave_format *wave_fmt)
-{
-
-       switch (recsrc) {
-       case WAVERECORD_AC97:
-
-               if ((wave_fmt->channels != 1) && (wave_fmt->channels != 2))
-                       wave_fmt->channels = 2;
-
-               if (wave_fmt->samplingrate >= (0xBB80 + 0xAC44) / 2)
-                       wave_fmt->samplingrate = 0xBB80;
-               else if (wave_fmt->samplingrate >= (0xAC44 + 0x7D00) / 2)
-                       wave_fmt->samplingrate = 0xAC44;
-               else if (wave_fmt->samplingrate >= (0x7D00 + 0x5DC0) / 2)
-                       wave_fmt->samplingrate = 0x7D00;
-               else if (wave_fmt->samplingrate >= (0x5DC0 + 0x5622) / 2)
-                       wave_fmt->samplingrate = 0x5DC0;
-               else if (wave_fmt->samplingrate >= (0x5622 + 0x3E80) / 2)
-                       wave_fmt->samplingrate = 0x5622;
-               else if (wave_fmt->samplingrate >= (0x3E80 + 0x2B11) / 2)
-                       wave_fmt->samplingrate = 0x3E80;
-               else if (wave_fmt->samplingrate >= (0x2B11 + 0x1F40) / 2)
-                       wave_fmt->samplingrate = 0x2B11;
-               else
-                       wave_fmt->samplingrate = 0x1F40;
-
-               switch (wave_fmt->id) {
-               case AFMT_S16_LE:
-                       wave_fmt->bitsperchannel = 16;
-                       break;
-               case AFMT_U8:
-                       wave_fmt->bitsperchannel = 8;
-                       break;
-               default:
-                       wave_fmt->id = AFMT_S16_LE;
-                       wave_fmt->bitsperchannel = 16;
-                       break;
-               }
-
-               break;
-
-       /* these can't be changed from the original values */
-       case WAVERECORD_MIC:
-       case WAVERECORD_FX:
-               break;
-
-       default:
-               BUG();
-               break;
-       }
-
-       wave_fmt->bytesperchannel = wave_fmt->bitsperchannel >> 3;
-       wave_fmt->bytespersample = wave_fmt->channels * wave_fmt->bytesperchannel;
-       wave_fmt->bytespersec = wave_fmt->bytespersample * wave_fmt->samplingrate;
-       wave_fmt->bytespervoicesample = wave_fmt->bytespersample;
-}
-
-static int alloc_buffer(struct emu10k1_card *card, struct wavein_buffer *buffer)
-{
-       buffer->addr = pci_alloc_consistent(card->pci_dev, buffer->size * buffer->cov,
-                                           &buffer->dma_handle);
-       if (buffer->addr == NULL)
-               return -1;
-
-       return 0;
-}
-
-static void free_buffer(struct emu10k1_card *card, struct wavein_buffer *buffer)
-{
-       if (buffer->addr != NULL)
-               pci_free_consistent(card->pci_dev, buffer->size * buffer->cov,
-                                   buffer->addr, buffer->dma_handle);
-}
-
-int emu10k1_wavein_open(struct emu10k1_wavedevice *wave_dev)
-{
-       struct emu10k1_card *card = wave_dev->card;
-       struct wiinst *wiinst = wave_dev->wiinst;
-       struct wiinst **wiinst_tmp = NULL;
-       u16 delay;
-       unsigned long flags;
-
-       DPF(2, "emu10k1_wavein_open()\n");
-
-       switch (wiinst->recsrc) {
-       case WAVERECORD_AC97:
-               wiinst_tmp = &card->wavein.ac97;
-               break;
-       case WAVERECORD_MIC:
-               wiinst_tmp = &card->wavein.mic;
-               break;
-       case WAVERECORD_FX:
-               wiinst_tmp = &card->wavein.fx;
-               break;
-       default:
-               BUG();
-               break;
-       }
-
-       spin_lock_irqsave(&card->lock, flags);
-       if (*wiinst_tmp != NULL) {
-               spin_unlock_irqrestore(&card->lock, flags);
-               return -1;
-       }
-
-       *wiinst_tmp = wiinst;
-       spin_unlock_irqrestore(&card->lock, flags);
-
-       /* handle 8 bit recording */
-       if (wiinst->format.bytesperchannel == 1) {
-               if (wiinst->buffer.size > 0x8000) {
-                       wiinst->buffer.size = 0x8000;
-                       wiinst->buffer.sizeregval = 0x1f;
-               } else
-                       wiinst->buffer.sizeregval += 4;
-
-               wiinst->buffer.cov = 2;
-       } else
-               wiinst->buffer.cov = 1;
-
-       if (alloc_buffer(card, &wiinst->buffer) < 0) {
-               ERROR();
-               return -1;
-       }
-
-       emu10k1_set_record_src(card, wiinst);
-
-       emu10k1_reset_record(card, &wiinst->buffer);
-
-       wiinst->buffer.hw_pos = 0;
-       wiinst->buffer.pos = 0;
-       wiinst->buffer.bytestocopy = 0;
-
-       delay = (48000 * wiinst->buffer.fragment_size) / wiinst->format.bytespersec;
-
-       emu10k1_timer_install(card, &wiinst->timer, delay / 2);
-
-       wiinst->state = WAVE_STATE_OPEN;
-
-       return 0;
-}
-
-void emu10k1_wavein_close(struct emu10k1_wavedevice *wave_dev)
-{
-       struct emu10k1_card *card = wave_dev->card;
-       struct wiinst *wiinst = wave_dev->wiinst;
-       unsigned long flags;
-
-       DPF(2, "emu10k1_wavein_close()\n");
-
-       emu10k1_wavein_stop(wave_dev);
-
-       emu10k1_timer_uninstall(card, &wiinst->timer);
-
-       free_buffer(card, &wiinst->buffer);
-
-       spin_lock_irqsave(&card->lock, flags);
-       switch (wave_dev->wiinst->recsrc) {
-       case WAVERECORD_AC97:
-               card->wavein.ac97 = NULL;
-               break;
-       case WAVERECORD_MIC:
-               card->wavein.mic = NULL;
-               break;
-       case WAVERECORD_FX:
-               card->wavein.fx = NULL;
-               break;
-       default:
-               BUG();
-               break;
-       }
-       spin_unlock_irqrestore(&card->lock, flags);
-
-       wiinst->state = WAVE_STATE_CLOSED;
-}
-
-void emu10k1_wavein_start(struct emu10k1_wavedevice *wave_dev)
-{
-       struct emu10k1_card *card = wave_dev->card;
-       struct wiinst *wiinst = wave_dev->wiinst;
-
-       DPF(2, "emu10k1_wavein_start()\n");
-
-       emu10k1_start_record(card, &wiinst->buffer);
-       emu10k1_timer_enable(wave_dev->card, &wiinst->timer);
-
-       wiinst->state |= WAVE_STATE_STARTED;
-}
-
-void emu10k1_wavein_stop(struct emu10k1_wavedevice *wave_dev)
-{
-       struct emu10k1_card *card = wave_dev->card;
-       struct wiinst *wiinst = wave_dev->wiinst;
-
-       DPF(2, "emu10k1_wavein_stop()\n");
-
-       if (!(wiinst->state & WAVE_STATE_STARTED))
-               return;
-
-       emu10k1_timer_disable(card, &wiinst->timer);
-       emu10k1_stop_record(card, &wiinst->buffer);
-
-       wiinst->state &= ~WAVE_STATE_STARTED;
-}
-
-int emu10k1_wavein_setformat(struct emu10k1_wavedevice *wave_dev, struct wave_format *format)
-{
-       struct emu10k1_card *card = wave_dev->card;
-       struct wiinst *wiinst = wave_dev->wiinst;
-       u16 delay;
-
-       DPF(2, "emu10k1_wavein_setformat()\n");
-
-       if (wiinst->state & WAVE_STATE_STARTED)
-               return -1;
-
-       query_format(wiinst->recsrc, format);
-
-       if ((wiinst->format.samplingrate != format->samplingrate)
-           || (wiinst->format.bitsperchannel != format->bitsperchannel)
-           || (wiinst->format.channels != format->channels)) {
-
-               wiinst->format = *format;
-
-               if (wiinst->state == WAVE_STATE_CLOSED)
-                       return 0;
-
-               wiinst->buffer.size *= wiinst->buffer.cov;
-
-               if (wiinst->format.bytesperchannel == 1) {
-                       wiinst->buffer.cov = 2;
-                       wiinst->buffer.size /= wiinst->buffer.cov;
-               } else
-                       wiinst->buffer.cov = 1;
-
-               emu10k1_timer_uninstall(card, &wiinst->timer);
-
-               delay = (48000 * wiinst->buffer.fragment_size) / wiinst->format.bytespersec;
-
-               emu10k1_timer_install(card, &wiinst->timer, delay / 2);
-       }
-
-       return 0;
-}
-
-void emu10k1_wavein_getxfersize(struct wiinst *wiinst, u32 * size)
-{
-       struct wavein_buffer *buffer = &wiinst->buffer;
-
-       *size = buffer->bytestocopy;
-
-       if (wiinst->mmapped)
-               return;
-
-       if (*size > buffer->size) {
-               *size = buffer->size;
-               buffer->pos = buffer->hw_pos;
-               buffer->bytestocopy = buffer->size;
-               DPF(1, "buffer overrun\n");
-       }
-}
-
-static int copy_block(u8 __user *dst, u8 * src, u32 str, u32 len, u8 cov)
-{
-       if (cov == 1) {
-               if (__copy_to_user(dst, src + str, len))
-                       return -EFAULT;
-       } else {
-               u8 byte;
-               u32 i;
-
-               src += 1 + 2 * str;
-
-               for (i = 0; i < len; i++) {
-                       byte = src[2 * i] ^ 0x80;
-                       if (__copy_to_user(dst + i, &byte, 1))
-                               return -EFAULT;
-               }
-       }
-
-       return 0;
-}
-
-int emu10k1_wavein_xferdata(struct wiinst *wiinst, u8 __user *data, u32 * size)
-{
-       struct wavein_buffer *buffer = &wiinst->buffer;
-       u32 sizetocopy, sizetocopy_now, start;
-       unsigned long flags;
-       int ret;
-
-       sizetocopy = min_t(u32, buffer->size, *size);
-       *size = sizetocopy;
-
-       if (!sizetocopy)
-               return 0;
-
-       spin_lock_irqsave(&wiinst->lock, flags);
-       start = buffer->pos;
-       buffer->pos += sizetocopy;
-       buffer->pos %= buffer->size;
-       buffer->bytestocopy -= sizetocopy;
-       sizetocopy_now = buffer->size - start;
-
-       spin_unlock_irqrestore(&wiinst->lock, flags);
-
-       if (sizetocopy > sizetocopy_now) {
-               sizetocopy -= sizetocopy_now;
-
-               ret = copy_block(data, buffer->addr, start, sizetocopy_now,
-                                buffer->cov);
-               if (ret == 0)
-                       ret = copy_block(data + sizetocopy_now, buffer->addr, 0,
-                                        sizetocopy, buffer->cov);
-       } else {
-               ret = copy_block(data, buffer->addr, start, sizetocopy,
-                                buffer->cov);
-       }
-
-       return ret;
-}
-
-void emu10k1_wavein_update(struct emu10k1_card *card, struct wiinst *wiinst)
-{
-       u32 hw_pos;
-       u32 diff;
-
-       /* There is no actual start yet */
-       if (!(wiinst->state & WAVE_STATE_STARTED)) {
-               hw_pos = wiinst->buffer.hw_pos;
-       } else {
-               /* hw_pos in byte units */
-               hw_pos = sblive_readptr(card, wiinst->buffer.idxreg, 0) / wiinst->buffer.cov;
-       }
-
-       diff = (wiinst->buffer.size + hw_pos - wiinst->buffer.hw_pos) % wiinst->buffer.size;
-       wiinst->total_recorded += diff;
-       wiinst->buffer.bytestocopy += diff;
-
-       wiinst->buffer.hw_pos = hw_pos;
-}
diff --git a/sound/oss/emu10k1/cardwi.h b/sound/oss/emu10k1/cardwi.h
deleted file mode 100644 (file)
index e82029b..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- **********************************************************************
- *     cardwi.h -- header file for card wave input functions
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-#ifndef _CARDWI_H
-#define _CARDWI_H
-
-#include "icardwav.h"
-#include "audio.h"
-#include "timer.h"
-
-struct wavein_buffer {
-       u16 ossfragshift;
-        u32 fragment_size;
-        u32 numfrags;
-       u32 hw_pos;             /* hardware cursor position */
-       u32 pos;                /* software cursor position */
-       u32 bytestocopy;        /* bytes of recorded data available */
-       u32 size;
-       u32 pages;
-       u32 sizereg;
-       u32 sizeregval;
-        u32 addrreg;
-        u32 idxreg;
-        u32 adcctl;
-       void *addr;
-       u8 cov;
-       dma_addr_t dma_handle;  
-};
-
-struct wiinst
-{
-       u8 state;
-       struct emu_timer timer;
-       struct wave_format format;
-       struct wavein_buffer buffer;
-       wait_queue_head_t wait_queue;
-       u8 mmapped;
-       u32 total_recorded;     /* total bytes read() from device */
-       u32 blocks;
-       spinlock_t lock;
-       u8 recsrc;
-       u16 fxwc;
-};
-
-#define WAVEIN_MAXBUFSIZE      65536
-#define WAVEIN_MINBUFSIZE      368
-
-#define WAVEIN_DEFAULTFRAGLEN  100 
-#define WAVEIN_DEFAULTBUFLEN   1000
-
-#define WAVEIN_MINFRAGSHIFT    8 
-#define WAVEIN_MINFRAGS                2
-
-int emu10k1_wavein_open(struct emu10k1_wavedevice *);
-void emu10k1_wavein_close(struct emu10k1_wavedevice *);
-void emu10k1_wavein_start(struct emu10k1_wavedevice *);
-void emu10k1_wavein_stop(struct emu10k1_wavedevice *);
-void emu10k1_wavein_getxfersize(struct wiinst *, u32 *);
-int emu10k1_wavein_xferdata(struct wiinst *, u8 __user *, u32 *);
-int emu10k1_wavein_setformat(struct emu10k1_wavedevice *, struct wave_format *);
-void emu10k1_wavein_update(struct emu10k1_card *, struct wiinst *);
-
-
-#endif /* _CARDWI_H */
diff --git a/sound/oss/emu10k1/cardwo.c b/sound/oss/emu10k1/cardwo.c
deleted file mode 100644 (file)
index 54daca4..0000000
+++ /dev/null
@@ -1,643 +0,0 @@
-/*
- **********************************************************************
- *     cardwo.c - PCM output HAL for emu10k1 driver
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#include <linux/poll.h>
-#include "hwaccess.h"
-#include "8010.h"
-#include "voicemgr.h"
-#include "cardwo.h"
-#include "audio.h"
-
-static u32 samplerate_to_linearpitch(u32 samplingrate)
-{
-       samplingrate = (samplingrate << 8) / 375;
-       return (samplingrate >> 1) + (samplingrate & 1);
-}
-
-static void query_format(struct emu10k1_wavedevice *wave_dev, struct wave_format *wave_fmt)
-{
-       int i, j, do_passthrough = 0, is_ac3 = 0;
-       struct emu10k1_card *card = wave_dev->card;
-       struct woinst *woinst = wave_dev->woinst;
-
-       if ((wave_fmt->channels > 2) && (wave_fmt->id != AFMT_S16_LE) && (wave_fmt->id != AFMT_U8))
-               wave_fmt->channels = 2;
-
-       if ((wave_fmt->channels < 1) || (wave_fmt->channels > WAVEOUT_MAXVOICES))
-               wave_fmt->channels = 2;
-
-       if (wave_fmt->channels == 2)
-               woinst->num_voices = 1;
-       else
-               woinst->num_voices = wave_fmt->channels;
-
-       if (wave_fmt->samplingrate >= 0x2ee00)
-               wave_fmt->samplingrate = 0x2ee00;
-
-       wave_fmt->passthrough = 0;
-       do_passthrough = is_ac3 = 0;
-
-       if (card->pt.selected)
-               do_passthrough = 1;
-
-       switch (wave_fmt->id) {
-       case AFMT_S16_LE:
-               wave_fmt->bitsperchannel = 16;
-               break;
-       case AFMT_U8:
-               wave_fmt->bitsperchannel = 8;
-               break;
-       case AFMT_AC3:
-               do_passthrough = 1;
-               is_ac3 = 1;
-               break;
-       default:
-               wave_fmt->id = AFMT_S16_LE;
-               wave_fmt->bitsperchannel = 16;
-               break;
-       }       
-       if (do_passthrough) {
-               /* currently only one waveout instance may use pass-through */
-               if (woinst->state != WAVE_STATE_CLOSED || 
-                   card->pt.state != PT_STATE_INACTIVE ||
-                   (wave_fmt->samplingrate != 48000 && !is_ac3)) {
-                       DPF(2, "unable to set pass-through mode\n");
-               } else if (USE_PT_METHOD1) {
-                       i = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name, card->pt.intr_gpr_name);
-                       j = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name, card->pt.enable_gpr_name);
-                       if (i < 0 || j < 0)
-                               DPF(2, "unable to set pass-through mode\n");
-                       else {
-                               wave_fmt->samplingrate = 48000;
-                               wave_fmt->channels = 2;
-                               card->pt.pos_gpr = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name,
-                                                                           card->pt.pos_gpr_name);
-                               wave_fmt->passthrough = 1;
-                               card->pt.intr_gpr = i;
-                               card->pt.enable_gpr = j;
-                               card->pt.state = PT_STATE_INACTIVE;
-                       
-                               DPD(2, "is_ac3 is %d\n", is_ac3);
-                               card->pt.ac3data = is_ac3;
-                               wave_fmt->bitsperchannel = 16;
-                       }
-               }else{
-                       DPF(2, "Using Passthrough Method 2\n");
-                       card->pt.enable_gpr = emu10k1_find_control_gpr(&card->mgr, card->pt.patch_name,
-                                                                      card->pt.enable_gpr_name);
-                       wave_fmt->passthrough = 2;
-                       wave_fmt->bitsperchannel = 16;
-               }
-       }
-
-       wave_fmt->bytesperchannel = wave_fmt->bitsperchannel >> 3;
-       wave_fmt->bytespersample = wave_fmt->channels * wave_fmt->bytesperchannel;
-       wave_fmt->bytespersec = wave_fmt->bytespersample * wave_fmt->samplingrate;
-
-       if (wave_fmt->channels == 2)
-               wave_fmt->bytespervoicesample = wave_fmt->channels * wave_fmt->bytesperchannel;
-       else
-               wave_fmt->bytespervoicesample = wave_fmt->bytesperchannel;
-}
-
-static int get_voice(struct emu10k1_card *card, struct woinst *woinst, unsigned int voicenum)
-{
-       struct emu_voice *voice = &woinst->voice[voicenum];
-
-       /* Allocate voices here, if no voices available, return error. */
-
-       voice->usage = VOICE_USAGE_PLAYBACK;
-
-       voice->flags = 0;
-
-       if (woinst->format.channels == 2)
-               voice->flags |= VOICE_FLAGS_STEREO;
-
-       if (woinst->format.bitsperchannel == 16)
-               voice->flags |= VOICE_FLAGS_16BIT;
-
-       if (emu10k1_voice_alloc(card, voice) < 0) {
-               voice->usage = VOICE_USAGE_FREE;
-               return -1;
-       }
-
-       /* Calculate pitch */
-       voice->initial_pitch = (u16) (srToPitch(woinst->format.samplingrate) >> 8);
-       voice->pitch_target = samplerate_to_linearpitch(woinst->format.samplingrate);
-
-       DPD(2, "Initial pitch --> %#x\n", voice->initial_pitch);
-
-       voice->startloop = (voice->mem.emupageindex << 12) /
-        woinst->format.bytespervoicesample;
-       voice->endloop = voice->startloop + woinst->buffer.size / woinst->format.bytespervoicesample;
-       voice->start = voice->startloop;
-
-       
-       voice->params[0].volume_target = 0xffff;
-       voice->params[0].initial_fc = 0xff;
-       voice->params[0].initial_attn = 0x00;
-       voice->params[0].byampl_env_sustain = 0x7f;
-       voice->params[0].byampl_env_decay = 0x7f;
-
-       
-       if (voice->flags & VOICE_FLAGS_STEREO) {
-               if (woinst->format.passthrough == 2) {
-                       voice->params[0].send_routing  = voice->params[1].send_routing  = card->waveout.send_routing[ROUTE_PT];
-                       voice->params[0].send_routing2 = voice->params[1].send_routing2 = card->waveout.send_routing2[ROUTE_PT];
-                       voice->params[0].send_dcba = 0xff;
-                       voice->params[1].send_dcba = 0xff00;
-                       voice->params[0].send_hgfe = voice->params[1].send_hgfe=0;
-               } else {
-                       voice->params[0].send_dcba = card->waveout.send_dcba[SEND_LEFT];
-                       voice->params[0].send_hgfe = card->waveout.send_hgfe[SEND_LEFT];
-                       voice->params[1].send_dcba = card->waveout.send_dcba[SEND_RIGHT];
-                       voice->params[1].send_hgfe = card->waveout.send_hgfe[SEND_RIGHT];
-
-                       if (woinst->device) {
-                               // /dev/dps1
-                               voice->params[0].send_routing  = voice->params[1].send_routing  = card->waveout.send_routing[ROUTE_PCM1];
-                               voice->params[0].send_routing2 = voice->params[1].send_routing2 = card->waveout.send_routing2[ROUTE_PCM1];
-                       } else {
-                               voice->params[0].send_routing  = voice->params[1].send_routing  = card->waveout.send_routing[ROUTE_PCM];
-                               voice->params[0].send_routing2 = voice->params[1].send_routing2 = card->waveout.send_routing2[ROUTE_PCM];
-                       }
-               }
-               
-               voice->params[1].volume_target = 0xffff;
-               voice->params[1].initial_fc = 0xff;
-               voice->params[1].initial_attn = 0x00;
-               voice->params[1].byampl_env_sustain = 0x7f;
-               voice->params[1].byampl_env_decay = 0x7f;
-       } else {
-               if (woinst->num_voices > 1) {
-                       // Multichannel pcm
-                       voice->params[0].send_dcba=0xff;
-                       voice->params[0].send_hgfe=0;
-                       if (card->is_audigy) {
-                               voice->params[0].send_routing = 0x3f3f3f00 + card->mchannel_fx + voicenum;
-                               voice->params[0].send_routing2 = 0x3f3f3f3f;
-                       } else {
-                               voice->params[0].send_routing = 0xfff0 + card->mchannel_fx + voicenum;
-                       }
-                       
-               } else {
-                       voice->params[0].send_dcba = card->waveout.send_dcba[SEND_MONO];
-                       voice->params[0].send_hgfe = card->waveout.send_hgfe[SEND_MONO];
-
-                       if (woinst->device) {
-                               voice->params[0].send_routing = card->waveout.send_routing[ROUTE_PCM1];
-                               voice->params[0].send_routing2 = card->waveout.send_routing2[ROUTE_PCM1];
-                       } else {
-                               voice->params[0].send_routing = card->waveout.send_routing[ROUTE_PCM];
-                               voice->params[0].send_routing2 = card->waveout.send_routing2[ROUTE_PCM];
-                       }
-               }
-       }
-
-       DPD(2, "voice: startloop=%#x, endloop=%#x\n", voice->startloop, voice->endloop);
-
-       emu10k1_voice_playback_setup(voice);
-
-       return 0;
-}
-
-int emu10k1_waveout_open(struct emu10k1_wavedevice *wave_dev)
-{
-       struct emu10k1_card *card = wave_dev->card;
-       struct woinst *woinst = wave_dev->woinst;
-       struct waveout_buffer *buffer = &woinst->buffer;
-       unsigned int voicenum;
-       u16 delay;
-
-       DPF(2, "emu10k1_waveout_open()\n");
-
-       for (voicenum = 0; voicenum < woinst->num_voices; voicenum++) {
-               if (emu10k1_voice_alloc_buffer(card, &woinst->voice[voicenum].mem, woinst->buffer.pages) < 0) {
-                       ERROR();
-                       emu10k1_waveout_close(wave_dev);
-                       return -1;
-               }
-
-               if (get_voice(card, woinst, voicenum) < 0) {
-                       ERROR();
-                       emu10k1_waveout_close(wave_dev);
-                       return -1;
-               }
-       }
-
-       buffer->fill_silence = 0;
-       buffer->silence_bytes = 0;
-       buffer->silence_pos = 0;
-       buffer->hw_pos = 0;
-       buffer->free_bytes = woinst->buffer.size;
-
-       delay = (48000 * woinst->buffer.fragment_size) /
-                (woinst->format.samplingrate * woinst->format.bytespervoicesample);
-
-       emu10k1_timer_install(card, &woinst->timer, delay);
-
-       woinst->state = WAVE_STATE_OPEN;
-
-       return 0;
-}
-
-void emu10k1_waveout_close(struct emu10k1_wavedevice *wave_dev)
-{
-       struct emu10k1_card *card = wave_dev->card;
-       struct woinst *woinst = wave_dev->woinst;
-       unsigned int voicenum;
-
-       DPF(2, "emu10k1_waveout_close()\n");
-
-       emu10k1_waveout_stop(wave_dev);
-
-       emu10k1_timer_uninstall(card, &woinst->timer);
-
-       for (voicenum = 0; voicenum < woinst->num_voices; voicenum++) {
-               emu10k1_voice_free(&woinst->voice[voicenum]);
-               emu10k1_voice_free_buffer(card, &woinst->voice[voicenum].mem);
-       }
-
-       woinst->state = WAVE_STATE_CLOSED;
-}
-
-void emu10k1_waveout_start(struct emu10k1_wavedevice *wave_dev)
-{
-       struct emu10k1_card *card = wave_dev->card;
-       struct woinst *woinst = wave_dev->woinst;
-       struct pt_data *pt = &card->pt;
-
-       DPF(2, "emu10k1_waveout_start()\n");
-
-       if (woinst->format.passthrough == 2) {
-               emu10k1_pt_setup(wave_dev);
-               sblive_writeptr(card, (card->is_audigy ? A_GPR_BASE : GPR_BASE) + pt->enable_gpr, 0, 1);
-               pt->state = PT_STATE_PLAYING;
-       }
-
-       /* Actual start */
-       emu10k1_voices_start(woinst->voice, woinst->num_voices, woinst->total_played);
-
-       emu10k1_timer_enable(card, &woinst->timer);
-
-       woinst->state |= WAVE_STATE_STARTED;
-}
-
-int emu10k1_waveout_setformat(struct emu10k1_wavedevice *wave_dev, struct wave_format *format)
-{
-       struct emu10k1_card *card = wave_dev->card;
-       struct woinst *woinst = wave_dev->woinst;
-       unsigned int voicenum;
-       u16 delay;
-
-       DPF(2, "emu10k1_waveout_setformat()\n");
-
-       if (woinst->state & WAVE_STATE_STARTED)
-               return -1;
-
-       query_format(wave_dev, format);
-
-       if (woinst->format.samplingrate != format->samplingrate ||
-           woinst->format.channels != format->channels ||
-           woinst->format.bitsperchannel != format->bitsperchannel) {
-
-               woinst->format = *format;
-
-               if (woinst->state == WAVE_STATE_CLOSED)
-                       return 0;
-
-               emu10k1_timer_uninstall(card, &woinst->timer);
-
-               for (voicenum = 0; voicenum < woinst->num_voices; voicenum++) {
-                       emu10k1_voice_free(&woinst->voice[voicenum]);
-
-                       if (get_voice(card, woinst, voicenum) < 0) {
-                               ERROR();
-                               emu10k1_waveout_close(wave_dev);
-                               return -1;
-                       }
-               }
-
-               delay = (48000 * woinst->buffer.fragment_size) /
-                        (woinst->format.samplingrate * woinst->format.bytespervoicesample);
-
-               emu10k1_timer_install(card, &woinst->timer, delay);
-       }
-
-       return 0;
-}
-
-void emu10k1_waveout_stop(struct emu10k1_wavedevice *wave_dev)
-{
-       struct emu10k1_card *card = wave_dev->card;
-       struct woinst *woinst = wave_dev->woinst;
-
-       DPF(2, "emu10k1_waveout_stop()\n");
-
-       if (!(woinst->state & WAVE_STATE_STARTED))
-               return;
-
-       emu10k1_timer_disable(card, &woinst->timer);
-
-       /* Stop actual voices */
-       emu10k1_voices_stop(woinst->voice, woinst->num_voices);
-
-       emu10k1_waveout_update(woinst);
-
-       woinst->state &= ~WAVE_STATE_STARTED;
-}
-
-/**
- * emu10k1_waveout_getxfersize -
- *
- * gives the total free bytes on the voice buffer, including silence bytes
- * (basically: total_free_bytes = free_bytes + silence_bytes).
- *
- */
-void emu10k1_waveout_getxfersize(struct woinst *woinst, u32 *total_free_bytes)
-{
-       struct waveout_buffer *buffer = &woinst->buffer;
-       int pending_bytes;
-
-       if (woinst->mmapped) {
-               *total_free_bytes = buffer->free_bytes;
-               return;
-       }
-
-       pending_bytes = buffer->size - buffer->free_bytes;
-
-       buffer->fill_silence = (pending_bytes < (signed) buffer->fragment_size * 2) ? 1 : 0;
-
-       if (pending_bytes > (signed) buffer->silence_bytes) {
-               *total_free_bytes = (buffer->free_bytes + buffer->silence_bytes);
-       } else {
-               *total_free_bytes = buffer->size;
-               buffer->silence_bytes = pending_bytes;
-               if (pending_bytes < 0) {
-                       buffer->silence_pos = buffer->hw_pos;
-                       buffer->silence_bytes = 0;
-                       buffer->free_bytes = buffer->size;
-                       DPF(1, "buffer underrun\n");
-               }
-       }
-}
-
-/**
- * copy_block -
- *
- * copies a block of pcm data to a voice buffer.
- * Notice that the voice buffer is actually a set of disjointed memory pages.
- *
- */
-static void copy_block(void **dst, u32 str, u8 __user *src, u32 len)
-{
-       unsigned int pg;
-       unsigned int pgoff;
-       unsigned int k;
-
-       pg = str / PAGE_SIZE;
-       pgoff = str % PAGE_SIZE;
-
-       if (len > PAGE_SIZE - pgoff) {
-               k = PAGE_SIZE - pgoff;
-               if (__copy_from_user((u8 *)dst[pg] + pgoff, src, k))
-                       return;
-               len -= k;
-               while (len > PAGE_SIZE) {
-                       if (__copy_from_user(dst[++pg], src + k, PAGE_SIZE))
-                               return;
-                       k += PAGE_SIZE;
-                       len -= PAGE_SIZE;
-               }
-               if (__copy_from_user(dst[++pg], src + k, len))
-                       return;
-
-       } else
-               __copy_from_user((u8 *)dst[pg] + pgoff, src, len);
-}
-
-/**
- * copy_ilv_block -
- *
- * copies a block of pcm data containing n interleaved channels to n mono voice buffers.
- * Notice that the voice buffer is actually a set of disjointed memory pages.
- *
- */
-static void copy_ilv_block(struct woinst *woinst, u32 str, u8 __user *src, u32 len) 
-{
-        unsigned int pg;
-       unsigned int pgoff;
-       unsigned int voice_num;
-       struct emu_voice *voice = woinst->voice;
-
-       pg = str / PAGE_SIZE;
-       pgoff = str % PAGE_SIZE;
-
-       while (len) { 
-               for (voice_num = 0; voice_num < woinst->num_voices; voice_num++) {
-                       if (__copy_from_user((u8 *)(voice[voice_num].mem.addr[pg]) + pgoff, src, woinst->format.bytespervoicesample))
-                               return;
-                       src += woinst->format.bytespervoicesample;
-               }
-
-               len -= woinst->format.bytespervoicesample;
-
-               pgoff += woinst->format.bytespervoicesample;
-               if (pgoff >= PAGE_SIZE) {
-                       pgoff = 0;
-                       pg++;
-               }
-       }
-}
-
-/**
- * fill_block -
- *
- * fills a set voice buffers with a block of a given sample.
- *
- */
-static void fill_block(struct woinst *woinst, u32 str, u8 data, u32 len)
-{
-       unsigned int pg;
-       unsigned int pgoff;
-       unsigned int voice_num;
-        struct emu_voice *voice = woinst->voice;
-       unsigned int  k;
-
-       pg = str / PAGE_SIZE;
-       pgoff = str % PAGE_SIZE;
-
-       if (len > PAGE_SIZE - pgoff) {
-               k = PAGE_SIZE - pgoff;
-               for (voice_num = 0; voice_num < woinst->num_voices; voice_num++)
-                       memset((u8 *)voice[voice_num].mem.addr[pg] + pgoff, data, k);
-               len -= k;
-               while (len > PAGE_SIZE) {
-                       pg++;
-                       for (voice_num = 0; voice_num < woinst->num_voices; voice_num++)
-                               memset(voice[voice_num].mem.addr[pg], data, PAGE_SIZE);
-
-                       len -= PAGE_SIZE;
-               }
-               pg++;
-               for (voice_num = 0; voice_num < woinst->num_voices; voice_num++)
-                       memset(voice[voice_num].mem.addr[pg], data, len);
-
-       } else {
-               for (voice_num = 0; voice_num < woinst->num_voices; voice_num++)
-                       memset((u8 *)voice[voice_num].mem.addr[pg] + pgoff, data, len);
-       }
-}
-
-/**
- * emu10k1_waveout_xferdata -
- *
- * copies pcm data to the voice buffer. Silence samples
- * previously added to the buffer are overwritten.
- *
- */
-void emu10k1_waveout_xferdata(struct woinst *woinst, u8 __user *data, u32 *size)
-{
-       struct waveout_buffer *buffer = &woinst->buffer;
-       struct voice_mem *mem = &woinst->voice[0].mem;
-       u32 sizetocopy, sizetocopy_now, start;
-       unsigned long flags;
-
-       sizetocopy = min_t(u32, buffer->size, *size);
-       *size = sizetocopy;
-
-       if (!sizetocopy)
-               return;
-       
-       spin_lock_irqsave(&woinst->lock, flags);
-       start = (buffer->size + buffer->silence_pos - buffer->silence_bytes) % buffer->size;
-
-       if (sizetocopy > buffer->silence_bytes) {
-               buffer->silence_pos += sizetocopy - buffer->silence_bytes;
-               buffer->free_bytes -= sizetocopy - buffer->silence_bytes;
-               buffer->silence_bytes = 0;
-       } else
-               buffer->silence_bytes -= sizetocopy;
-
-       spin_unlock_irqrestore(&woinst->lock, flags);
-
-       sizetocopy_now = buffer->size - start;
-       if (sizetocopy > sizetocopy_now) {
-               sizetocopy -= sizetocopy_now;
-               if (woinst->num_voices > 1) {
-                       copy_ilv_block(woinst, start, data, sizetocopy_now);
-                       copy_ilv_block(woinst, 0, data + sizetocopy_now * woinst->num_voices, sizetocopy);
-               } else {
-                       copy_block(mem->addr, start, data, sizetocopy_now);
-                       copy_block(mem->addr, 0, data + sizetocopy_now, sizetocopy);
-               }
-       } else {
-               if (woinst->num_voices > 1)
-                       copy_ilv_block(woinst, start, data, sizetocopy);
-               else
-                       copy_block(mem->addr, start, data, sizetocopy);
-       }
-}
-
-/**
- * emu10k1_waveout_fillsilence -
- *
- * adds samples of silence to the voice buffer so that we
- * don't loop over stale pcm data.
- *
- */
-void emu10k1_waveout_fillsilence(struct woinst *woinst)
-{
-       struct waveout_buffer *buffer = &woinst->buffer;
-       u32 sizetocopy, sizetocopy_now, start;
-       u8 filldata;
-       unsigned long flags;
-
-       sizetocopy = buffer->fragment_size;
-
-       if (woinst->format.bitsperchannel == 16)
-               filldata = 0x00;
-       else
-               filldata = 0x80;
-
-       spin_lock_irqsave(&woinst->lock, flags);
-       buffer->silence_bytes += sizetocopy;
-       buffer->free_bytes -= sizetocopy;
-       buffer->silence_pos %= buffer->size;
-       start = buffer->silence_pos;
-       buffer->silence_pos += sizetocopy;
-       spin_unlock_irqrestore(&woinst->lock, flags);
-
-       sizetocopy_now = buffer->size - start;
-
-       if (sizetocopy > sizetocopy_now) {
-               sizetocopy -= sizetocopy_now;
-               fill_block(woinst, start, filldata, sizetocopy_now);
-               fill_block(woinst, 0, filldata, sizetocopy);
-       } else {
-               fill_block(woinst, start, filldata, sizetocopy);
-       }
-}
-
-/**
- * emu10k1_waveout_update -
- *
- * updates the position of the voice buffer hardware pointer (hw_pos)
- * and the number of free bytes on the buffer (free_bytes).
- * The free bytes _don't_ include silence bytes that may have been
- * added to the buffer.
- *
- */
-void emu10k1_waveout_update(struct woinst *woinst)
-{
-       u32 hw_pos;
-       u32 diff;
-
-       /* There is no actual start yet */
-       if (!(woinst->state & WAVE_STATE_STARTED)) {
-               hw_pos = woinst->buffer.hw_pos;
-       } else {
-               /* hw_pos in sample units */
-               hw_pos = sblive_readptr(woinst->voice[0].card, CCCA_CURRADDR, woinst->voice[0].num);
-
-               if(hw_pos < woinst->voice[0].start)
-                       hw_pos += woinst->buffer.size / woinst->format.bytespervoicesample - woinst->voice[0].start;
-               else
-                       hw_pos -= woinst->voice[0].start;
-
-               hw_pos *= woinst->format.bytespervoicesample;
-       }
-
-       diff = (woinst->buffer.size + hw_pos - woinst->buffer.hw_pos) % woinst->buffer.size;
-       woinst->total_played += diff;
-       woinst->buffer.free_bytes += diff;
-       woinst->buffer.hw_pos = hw_pos;
-}
diff --git a/sound/oss/emu10k1/cardwo.h b/sound/oss/emu10k1/cardwo.h
deleted file mode 100644 (file)
index 1dece88..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-/*     
- **********************************************************************
- *     cardwo.h -- header file for card wave out functions
- *     Copyright 1999, 2000 Creative Labs, Inc. 
- * 
- ********************************************************************** 
- * 
- *     Date                 Author          Summary of changes 
- *     ----                 ------          ------------------ 
- *     October 20, 1999     Bertrand Lee    base code release 
- * 
- ********************************************************************** 
- * 
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version. 
- * 
- *     This program is distributed in the hope that it will be useful, 
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of 
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
- *     GNU General Public License for more details. 
- * 
- *     You should have received a copy of the GNU General Public 
- *     License along with this program; if not, write to the Free 
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 
- *     USA. 
- * 
- ********************************************************************** 
- */
-
-#ifndef _CARDWO_H
-#define _CARDWO_H
-
-#include "icardwav.h"
-#include "audio.h"
-#include "voicemgr.h"
-#include "timer.h"
-
-/* setting this to other than a power of two may break some applications */
-#define WAVEOUT_MAXBUFSIZE     MAXBUFSIZE
-
-#define WAVEOUT_DEFAULTFRAGLEN 20 /* Time to play a fragment in ms (latency) */
-#define WAVEOUT_DEFAULTBUFLEN  500 /* Time to play the entire buffer in ms */
-
-#define WAVEOUT_MINFRAGSHIFT   6 /* Minimum fragment size in bytes is 2^6 */
-#define WAVEOUT_MINFRAGS       3 /* _don't_ go bellow 3, it would break silence filling */
-#define WAVEOUT_MAXVOICES      6
-
-struct waveout_buffer {
-       u16 ossfragshift;
-       u32 numfrags;
-       u32 fragment_size;      /* in bytes units */
-       u32 size;               /* in bytes units */
-       u32 pages;              /* buffer size in page units*/
-       u32 silence_pos;        /* software cursor position (including silence bytes) */
-       u32 hw_pos;             /* hardware cursor position */
-       u32 free_bytes;         /* free bytes available on the buffer (not including silence bytes) */
-       u8 fill_silence;
-       u32 silence_bytes;      /* silence bytes on the buffer */
-};
-
-struct woinst 
-{
-       u8 state;
-       u8 num_voices;
-       struct emu_voice voice[WAVEOUT_MAXVOICES];
-       struct emu_timer timer;
-       struct wave_format format;
-       struct waveout_buffer buffer;
-       wait_queue_head_t wait_queue;
-       u8 mmapped;
-       u32 total_copied;       /* total number of bytes written() to the buffer (excluding silence) */
-       u32 total_played;       /* total number of bytes played including silence */
-       u32 blocks;
-       u8 device;
-       spinlock_t lock;
-};
-
-int emu10k1_waveout_open(struct emu10k1_wavedevice *);
-void emu10k1_waveout_close(struct emu10k1_wavedevice *);
-void emu10k1_waveout_start(struct emu10k1_wavedevice *);
-void emu10k1_waveout_stop(struct emu10k1_wavedevice *);
-void emu10k1_waveout_getxfersize(struct woinst*, u32 *);
-void emu10k1_waveout_xferdata(struct woinst*, u8 __user *, u32 *);
-void emu10k1_waveout_fillsilence(struct woinst*);
-int emu10k1_waveout_setformat(struct emu10k1_wavedevice*, struct wave_format*);
-void emu10k1_waveout_update(struct woinst*);
-
-#endif /* _CARDWO_H */
diff --git a/sound/oss/emu10k1/ecard.c b/sound/oss/emu10k1/ecard.c
deleted file mode 100644 (file)
index 4ae635f..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-/*     
- **********************************************************************
- *     ecard.c - E-card initialization code
- *     Copyright 1999, 2000 Creative Labs, Inc. 
- * 
- ********************************************************************** 
- * 
- *     Date                 Author          Summary of changes 
- *     ----                 ------          ------------------ 
- *     October 20, 1999     Bertrand Lee    base code release 
- * 
- ********************************************************************** 
- * 
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version. 
- * 
- *     This program is distributed in the hope that it will be useful, 
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of 
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
- *     GNU General Public License for more details. 
- * 
- *     You should have received a copy of the GNU General Public 
- *     License along with this program; if not, write to the Free 
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 
- *     USA. 
- * 
- ********************************************************************** 
- */ 
-
-#include "ecard.h"
-#include "hwaccess.h"
-
-/* Private routines */
-static void ecard_setadcgain(struct emu10k1_card *, struct ecard_state *, u16);
-static void ecard_write(struct emu10k1_card *, u32);
-
-/**************************************************************************
- * @func Set the gain of the ECARD's CS3310 Trim/gain controller.  The
- * trim value consists of a 16bit value which is composed of two
- * 8 bit gain/trim values, one for the left channel and one for the
- * right channel.  The following table maps from the Gain/Attenuation
- * value in decibels into the corresponding bit pattern for a single
- * channel.
- */
-
-static void ecard_setadcgain(struct emu10k1_card *card, struct ecard_state *ecard, u16 gain)
-{
-       u32 currbit;
-       ecard->adc_gain = gain;
-
-       /* Enable writing to the TRIM registers */
-       ecard_write(card, ecard->control_bits & ~EC_TRIM_CSN);
-
-       /* Do it again to insure that we meet hold time requirements */
-       ecard_write(card, ecard->control_bits & ~EC_TRIM_CSN);
-
-       for (currbit = (1L << 15); currbit; currbit >>= 1) {
-
-               u32 value = ecard->control_bits & ~(EC_TRIM_CSN|EC_TRIM_SDATA);
-
-               if (gain & currbit)
-                     value |= EC_TRIM_SDATA;
-
-               /* Clock the bit */
-               ecard_write(card, value);
-               ecard_write(card, value | EC_TRIM_SCLK);
-               ecard_write(card, value);
-       }
-
-       ecard_write(card, ecard->control_bits);
-}
-
-/**************************************************************************
- * @func Clock bits into the Ecard's control latch.  The Ecard uses a
- *  control latch will is loaded bit-serially by toggling the Modem control
- *  lines from function 2 on the E8010.  This function hides these details
- *  and presents the illusion that we are actually writing to a distinct
- *  register.
- */
-static void ecard_write(struct emu10k1_card *card, u32 value)
-{
-       u16 count;
-       u32 data, hcvalue;
-       unsigned long flags;
-
-       spin_lock_irqsave(&card->lock, flags);
-
-       hcvalue = inl(card->iobase + HCFG) & ~(HOOKN_BIT|HANDN_BIT|PULSEN_BIT);
-
-       outl(card->iobase + HCFG, hcvalue);
-
-       for (count = 0 ; count < EC_NUM_CONTROL_BITS; count++) {
-       
-               /* Set up the value */
-               data = ((value & 0x1) ? PULSEN_BIT : 0);
-               value >>= 1;
-
-               outl(card->iobase + HCFG, hcvalue | data);
-
-               /* Clock the shift register */
-               outl(card->iobase + HCFG, hcvalue | data | HANDN_BIT);
-               outl(card->iobase + HCFG, hcvalue | data);
-       }
-
-       /* Latch the bits */
-       outl(card->iobase + HCFG, hcvalue | HOOKN_BIT);
-       outl(card->iobase + HCFG, hcvalue);
-
-       spin_unlock_irqrestore(&card->lock, flags);
-}
-
-void __devinit emu10k1_ecard_init(struct emu10k1_card *card)
-{
-       u32 hcvalue;
-       struct ecard_state ecard;
-
-       /* Set up the initial settings */
-       ecard.mux0_setting = EC_DEFAULT_SPDIF0_SEL;
-       ecard.mux1_setting = EC_DEFAULT_SPDIF1_SEL;
-       ecard.mux2_setting = 0;
-       ecard.adc_gain = EC_DEFAULT_ADC_GAIN;
-       ecard.control_bits = EC_RAW_RUN_MODE | 
-                             EC_SPDIF0_SELECT(ecard.mux0_setting) |
-                            EC_SPDIF1_SELECT(ecard.mux1_setting);
-
-
-       /* Step 0: Set the codec type in the hardware control register 
-        * and enable audio output */
-       hcvalue = emu10k1_readfn0(card, HCFG);
-       emu10k1_writefn0(card, HCFG, hcvalue | HCFG_AUDIOENABLE | HCFG_CODECFORMAT_I2S);
-
-       /* Step 1: Turn off the led and deassert TRIM_CS */
-       ecard_write(card, EC_ADCCAL | EC_LEDN | EC_TRIM_CSN);
-
-       /* Step 2: Calibrate the ADC and DAC */
-       ecard_write(card, EC_DACCAL | EC_LEDN | EC_TRIM_CSN);
-
-       /* Step 3: Wait for awhile; FIXME: Is this correct? */
-
-       current->state = TASK_INTERRUPTIBLE;
-       schedule_timeout(HZ);
-
-       /* Step 4: Switch off the DAC and ADC calibration.  Note
-        * That ADC_CAL is actually an inverted signal, so we assert
-        * it here to stop calibration.  */
-       ecard_write(card, EC_ADCCAL | EC_LEDN | EC_TRIM_CSN);
-
-       /* Step 4: Switch into run mode */
-       ecard_write(card, ecard.control_bits);
-
-       /* Step 5: Set the analog input gain */
-       ecard_setadcgain(card, &ecard, ecard.adc_gain);
-}
-
-
diff --git a/sound/oss/emu10k1/ecard.h b/sound/oss/emu10k1/ecard.h
deleted file mode 100644 (file)
index 67aead1..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-/*     
- **********************************************************************
- *     ecard.h
- *     Copyright 1999, 2000 Creative Labs, Inc. 
- * 
- ********************************************************************** 
- * 
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version. 
- * 
- *     This program is distributed in the hope that it will be useful, 
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of 
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
- *     GNU General Public License for more details. 
- * 
- *     You should have received a copy of the GNU General Public 
- *     License along with this program; if not, write to the Free 
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 
- *     USA. 
- * 
- ********************************************************************** 
- */ 
-
-#ifndef _ECARD_H
-#define _ECARD_H
-
-#include "8010.h"
-#include "hwaccess.h"
-#include <linux/init.h>
-
-/* In A1 Silicon, these bits are in the HC register */
-#define HOOKN_BIT   (1L << 12)
-#define HANDN_BIT   (1L << 11)
-#define PULSEN_BIT  (1L << 10)
-
-#define EC_GDI1 (1 << 13)
-#define EC_GDI0 (1 << 14)
-
-#define EC_NUM_CONTROL_BITS 20
-
-#define EC_AC3_DATA_SELN  0x0001L
-#define EC_EE_DATA_SEL    0x0002L
-#define EC_EE_CNTRL_SELN  0x0004L
-#define EC_EECLK          0x0008L
-#define EC_EECS           0x0010L
-#define EC_EESDO          0x0020L
-#define EC_TRIM_CSN      0x0040L
-#define EC_TRIM_SCLK     0x0080L
-#define EC_TRIM_SDATA    0x0100L
-#define EC_TRIM_MUTEN    0x0200L
-#define EC_ADCCAL        0x0400L
-#define EC_ADCRSTN       0x0800L
-#define EC_DACCAL        0x1000L
-#define EC_DACMUTEN      0x2000L
-#define EC_LEDN                  0x4000L
-
-#define EC_SPDIF0_SEL_SHIFT    15
-#define EC_SPDIF1_SEL_SHIFT    17      
-#define EC_SPDIF0_SEL_MASK     (0x3L << EC_SPDIF0_SEL_SHIFT)
-#define EC_SPDIF1_SEL_MASK     (0x7L << EC_SPDIF1_SEL_SHIFT)
-#define EC_SPDIF0_SELECT(_x) (((_x) << EC_SPDIF0_SEL_SHIFT) & EC_SPDIF0_SEL_MASK)
-#define EC_SPDIF1_SELECT(_x) (((_x) << EC_SPDIF1_SEL_SHIFT) & EC_SPDIF1_SEL_MASK)
-#define EC_CURRENT_PROM_VERSION 0x01 /* Self-explanatory.  This should
-                                      * be incremented any time the EEPROM's
-                                      * format is changed.  */
-
-#define EC_EEPROM_SIZE         0x40 /* ECARD EEPROM has 64 16-bit words */
-
-/* Addresses for special values stored in to EEPROM */
-#define EC_PROM_VERSION_ADDR   0x20    /* Address of the current prom version */
-#define EC_BOARDREV0_ADDR      0x21    /* LSW of board rev */
-#define EC_BOARDREV1_ADDR      0x22    /* MSW of board rev */ 
-
-#define EC_LAST_PROMFILE_ADDR  0x2f
-
-#define EC_SERIALNUM_ADD       0x30    /* First word of serial number.  The number
-                                         * can be up to 30 characters in length
-                                         * and is stored as a NULL-terminated
-                                         * ASCII string.  Any unused bytes must be
-                                         * filled with zeros */
-#define EC_CHECKSUM_ADDR       0x3f    /* Location at which checksum is stored */
-
-
-
-/* Most of this stuff is pretty self-evident.  According to the hardware 
- * dudes, we need to leave the ADCCAL bit low in order to avoid a DC 
- * offset problem.  Weird.
- */
-#define EC_RAW_RUN_MODE        (EC_DACMUTEN | EC_ADCRSTN | EC_TRIM_MUTEN | EC_TRIM_CSN)
-
-
-#define EC_DEFAULT_ADC_GAIN   0xC4C4
-#define EC_DEFAULT_SPDIF0_SEL 0x0
-#define EC_DEFAULT_SPDIF1_SEL 0x4
-
-#define HC_EA 0x01L
-
-/* ECARD state structure.  This structure maintains the state
- * for various portions of the ECARD's onboard hardware.
- */
-struct ecard_state {
-       u32 control_bits;
-       u16 adc_gain;
-       u16 mux0_setting;
-       u16 mux1_setting;
-       u16 mux2_setting;
-};
-
-void emu10k1_ecard_init(struct emu10k1_card *) __devinit;
-
-#endif /* _ECARD_H */
diff --git a/sound/oss/emu10k1/efxmgr.c b/sound/oss/emu10k1/efxmgr.c
deleted file mode 100644 (file)
index 7d5865d..0000000
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- **********************************************************************
- *     efxmgr.c
- *     Copyright 1999, 2000 Creative Labs, Inc. 
- * 
- ********************************************************************** 
- * 
- *     Date                 Author          Summary of changes 
- *     ----                 ------          ------------------ 
- *     October 20, 1999     Bertrand Lee    base code release 
- * 
- ********************************************************************** 
- * 
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version. 
- * 
- *     This program is distributed in the hope that it will be useful, 
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of 
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
- *     GNU General Public License for more details. 
- * 
- *     You should have received a copy of the GNU General Public 
- *     License along with this program; if not, write to the Free 
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 
- *     USA. 
- * 
- ********************************************************************** 
- */
-
-#include <linux/bitops.h>
-#include "hwaccess.h"
-#include "efxmgr.h"
-
-int emu10k1_find_control_gpr(struct patch_manager *mgr, const char *patch_name, const char *gpr_name)
-{
-        struct dsp_patch *patch;
-       struct dsp_rpatch *rpatch;
-       char s[PATCH_NAME_SIZE + 4];
-       unsigned long *gpr_used;
-       int i;
-
-       DPD(2, "emu10k1_find_control_gpr(): %s %s\n", patch_name, gpr_name);
-
-       rpatch = &mgr->rpatch;
-       if (!strcmp(rpatch->name, patch_name)) {
-               gpr_used = rpatch->gpr_used;
-               goto match;
-       }
-
-       for (i = 0; i < mgr->current_pages * PATCHES_PER_PAGE; i++) {
-               patch = PATCH(mgr, i);
-                       sprintf(s,"%s", patch->name);
-
-               if (!strcmp(s, patch_name)) {
-                       gpr_used = patch->gpr_used;
-                       goto match;
-               }
-       }
-
-       return -1;
-
-  match:
-       for (i = 0; i < NUM_GPRS; i++)
-               if (mgr->gpr[i].type == GPR_TYPE_CONTROL &&
-                   test_bit(i, gpr_used) &&
-                   !strcmp(mgr->gpr[i].name, gpr_name))
-                       return i;
-
-       return -1;
-}
-
-void emu10k1_set_control_gpr(struct emu10k1_card *card, int addr, s32 val, int flag)
-{
-       struct patch_manager *mgr = &card->mgr;
-
-       DPD(2, "emu10k1_set_control_gpr(): %d %x\n", addr, val);
-
-       if (addr < 0 || addr >= NUM_GPRS)
-               return;
-
-       //fixme: once patch manager is up, remember to fix this for the audigy
-       if (card->is_audigy) {
-               sblive_writeptr(card, A_GPR_BASE + addr, 0, val);
-       } else {
-               if (flag)
-                       val += sblive_readptr(card, GPR_BASE + addr, 0);
-               if (val > mgr->gpr[addr].max)
-                       val = mgr->gpr[addr].max;
-               else if (val < mgr->gpr[addr].min)
-                       val = mgr->gpr[addr].min;
-               sblive_writeptr(card, GPR_BASE + addr, 0, val);
-       }
-       
-       
-}
-
-//TODO: make this configurable:
-#define VOLCTRL_CHANNEL SOUND_MIXER_VOLUME
-#define VOLCTRL_STEP_SIZE        5
-
-//An internal function for setting OSS mixer controls.
-static void emu10k1_set_oss_vol(struct emu10k1_card *card, int oss_mixer,
-                               unsigned int left, unsigned int right)
-{
-       extern char volume_params[SOUND_MIXER_NRDEVICES];
-
-       card->ac97->mixer_state[oss_mixer] = (right << 8) | left;
-
-       if (!card->is_aps)
-               card->ac97->write_mixer(card->ac97, oss_mixer, left, right);
-       
-       emu10k1_set_volume_gpr(card, card->mgr.ctrl_gpr[oss_mixer][0], left,
-                              volume_params[oss_mixer]);
-
-       emu10k1_set_volume_gpr(card, card->mgr.ctrl_gpr[oss_mixer][1], right,
-                              volume_params[oss_mixer]);
-}
-
-//FIXME: mute should unmute when pressed a second time
-void emu10k1_mute_irqhandler(struct emu10k1_card *card)
-{
-       int oss_channel = VOLCTRL_CHANNEL;
-       int left, right;
-       static int val;
-
-       if (val) {
-               left = val & 0xff;
-               right = (val >> 8) & 0xff;
-               val = 0;
-       } else {
-               val = card->ac97->mixer_state[oss_channel];
-               left = 0;
-               right = 0;
-       }
-
-       emu10k1_set_oss_vol(card, oss_channel, left, right);
-}
-
-void emu10k1_volincr_irqhandler(struct emu10k1_card *card)
-{
-       int oss_channel = VOLCTRL_CHANNEL;
-       int left, right;
-
-       left = card->ac97->mixer_state[oss_channel] & 0xff;
-       right = (card->ac97->mixer_state[oss_channel] >> 8) & 0xff;
-
-       if ((left += VOLCTRL_STEP_SIZE) > 100)
-               left = 100;
-
-       if ((right += VOLCTRL_STEP_SIZE) > 100)
-               right = 100;
-
-       emu10k1_set_oss_vol(card, oss_channel, left, right);
-}
-
-void emu10k1_voldecr_irqhandler(struct emu10k1_card *card)
-{
-       int oss_channel = VOLCTRL_CHANNEL;
-       int left, right;
-
-       left = card->ac97->mixer_state[oss_channel] & 0xff;
-       right = (card->ac97->mixer_state[oss_channel] >> 8) & 0xff;
-
-       if ((left -= VOLCTRL_STEP_SIZE) < 0)
-               left = 0;
-
-       if ((right -= VOLCTRL_STEP_SIZE) < 0)
-               right = 0;
-
-       emu10k1_set_oss_vol(card, oss_channel, left, right);
-}
-
-void emu10k1_set_volume_gpr(struct emu10k1_card *card, int addr, s32 vol, int scale)
-{
-       struct patch_manager *mgr = &card->mgr;
-       unsigned long flags;
-
-       static const s32 log2lin[4] ={           //  attenuation (dB)
-               0x7fffffff,                      //       0.0         
-               0x7fffffff * 0.840896415253715 , //       1.5          
-               0x7fffffff * 0.707106781186548,  //       3.0
-               0x7fffffff * 0.594603557501361 , //       4.5
-       };
-
-       if (addr < 0)
-               return;
-
-       vol = (100 - vol ) * scale / 100;
-
-       // Thanks to the comp.dsp newsgroup for this neat trick:
-       vol = (vol >= scale) ? 0 : (log2lin[vol & 3] >> (vol >> 2));
-
-       spin_lock_irqsave(&mgr->lock, flags);
-       emu10k1_set_control_gpr(card, addr, vol, 0);
-       spin_unlock_irqrestore(&mgr->lock, flags);
-}
-
-void emu10k1_dsp_irqhandler(struct emu10k1_card *card)
-{
-       unsigned long flags;
-
-       if (card->pt.state != PT_STATE_INACTIVE) {
-               u32 bc;
-               bc = sblive_readptr(card, GPR_BASE + card->pt.intr_gpr, 0);
-               if (bc != 0) {
-                       DPD(3, "pt interrupt, bc = %d\n", bc);
-                       spin_lock_irqsave(&card->pt.lock, flags);
-                       card->pt.blocks_played = bc;
-                       if (card->pt.blocks_played >= card->pt.blocks_copied) {
-                               DPF(1, "buffer underrun in passthrough playback\n");
-                               emu10k1_pt_stop(card);
-                       }
-                       wake_up_interruptible(&card->pt.wait);
-                       spin_unlock_irqrestore(&card->pt.lock, flags);
-               }
-       }
-}
-
diff --git a/sound/oss/emu10k1/efxmgr.h b/sound/oss/emu10k1/efxmgr.h
deleted file mode 100644 (file)
index ef48e5c..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-/*     
- **********************************************************************
- *     sblive_fx.h
- *     Copyright 1999, 2000 Creative Labs, Inc. 
- * 
- ********************************************************************** 
- * 
- *     Date                 Author          Summary of changes 
- *     ----                 ------          ------------------ 
- *     October 20, 1999     Bertrand Lee    base code release 
- * 
- ********************************************************************** 
- * 
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version. 
- * 
- *     This program is distributed in the hope that it will be useful, 
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of 
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
- *     GNU General Public License for more details. 
- * 
- *     You should have received a copy of the GNU General Public 
- *     License along with this program; if not, write to the Free 
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 
- *     USA. 
- * 
- ********************************************************************** 
- */
-
-#ifndef _EFXMGR_H
-#define _EFXMGR_H
-
-struct emu_efx_info_t{
-       int opcode_shift;
-       int high_operand_shift;
-       int instruction_start;
-       int gpr_base;
-       int output_base;
-};
-
-
-#define WRITE_EFX(a, b, c) sblive_writeptr((a), emu_efx_info[card->is_audigy].instruction_start + (b), 0, (c))
-
-#define OP(op, z, w, x, y) \
-       do { WRITE_EFX(card, (pc) * 2, ((x) << emu_efx_info[card->is_audigy].high_operand_shift) | (y)); \
-       WRITE_EFX(card, (pc) * 2 + 1, ((op) << emu_efx_info[card->is_audigy].opcode_shift ) | ((z) << emu_efx_info[card->is_audigy].high_operand_shift) | (w)); \
-       ++pc; } while (0)
-
-#define NUM_INPUTS 0x20
-#define NUM_OUTPUTS 0x20
-#define NUM_GPRS 0x100
-
-#define A_NUM_INPUTS 0x60
-#define A_NUM_OUTPUTS 0x60  //fixme: this may or may not be true
-#define A_NUM_GPRS 0x200
-
-#define GPR_NAME_SIZE   32
-#define PATCH_NAME_SIZE 32
-
-struct dsp_rpatch {
-       char name[PATCH_NAME_SIZE];
-       u16 code_start;
-       u16 code_size;
-
-       unsigned long gpr_used[NUM_GPRS / (sizeof(unsigned long) * 8) + 1];
-       unsigned long gpr_input[NUM_GPRS / (sizeof(unsigned long) * 8) + 1];
-       unsigned long route[NUM_OUTPUTS];
-       unsigned long route_v[NUM_OUTPUTS];
-};
-
-struct dsp_patch {
-       char name[PATCH_NAME_SIZE];
-       u8 id;
-       unsigned long input;    /* bitmap of the lines used as inputs */
-       unsigned long output;   /* bitmap of the lines used as outputs */
-       u16 code_start;
-       u16 code_size;
-
-       unsigned long gpr_used[NUM_GPRS / (sizeof(unsigned long) * 8) + 1];     /* bitmap of used gprs */
-       unsigned long gpr_input[NUM_GPRS / (sizeof(unsigned long) * 8) + 1];
-       u8 traml_istart;        /* starting address of the internal tram lines used */
-       u8 traml_isize;         /* number of internal tram lines used */
-
-       u8 traml_estart;
-       u8 traml_esize;
-
-       u16 tramb_istart;        /* starting address of the internal tram memory used */
-       u16 tramb_isize;         /* amount of internal memory used */
-       u32 tramb_estart;
-       u32 tramb_esize;
-};
-
-struct dsp_gpr {
-       u8 type;                        /* gpr type, STATIC, DYNAMIC, INPUT, OUTPUT, CONTROL */
-       char name[GPR_NAME_SIZE];       /* gpr value, only valid for control gprs */
-       s32 min, max;                   /* value range for this gpr, only valid for control gprs */
-       u8 line;                        /* which input/output line is the gpr attached, only valid for input/output gprs */
-       u8 usage;
-};
-
-enum {
-       GPR_TYPE_NULL = 0,
-       GPR_TYPE_IO,
-       GPR_TYPE_STATIC,
-       GPR_TYPE_DYNAMIC,
-       GPR_TYPE_CONTROL,
-       GPR_TYPE_CONSTANT
-};
-
-#define GPR_BASE 0x100
-#define OUTPUT_BASE 0x20
-
-#define A_GPR_BASE 0x400
-#define A_OUTPUT_BASE 0x60
-
-#define MAX_PATCHES_PAGES 32
-
-struct patch_manager {
-       void *patch[MAX_PATCHES_PAGES];
-       int current_pages;
-       struct dsp_rpatch rpatch;
-       struct dsp_gpr gpr[NUM_GPRS];   /* gpr usage table */
-       spinlock_t lock;
-       s16 ctrl_gpr[SOUND_MIXER_NRDEVICES][2];
-};
-
-#define PATCHES_PER_PAGE (PAGE_SIZE / sizeof(struct dsp_patch))
-
-#define PATCH(mgr, i) ((struct dsp_patch *) (mgr)->patch[(i) / PATCHES_PER_PAGE] + (i) % PATCHES_PER_PAGE)
-
-/* PCM volume control */
-#define TMP_PCM_L     0x100 //temp PCM L (after the vol control)       
-#define TMP_PCM_R     0x101
-#define VOL_PCM_L     0x102 //vol PCM
-#define VOL_PCM_R     0x103
-
-/* Routing patch */
-#define TMP_AC_L      0x104 //tmp ac97 out
-#define TMP_AC_R      0x105
-#define TMP_REAR_L    0x106 //output - Temp Rear
-#define TMP_REAR_R    0x107
-#define TMP_DIGI_L    0x108 //output - Temp digital
-#define TMP_DIGI_R    0x109
-#define DSP_VOL_L     0x10a // main dsp volume
-#define DSP_VOL_R     0x10b
-
-/* hw inputs */
-#define PCM_IN_L       0x00
-#define PCM_IN_R       0x01
-
-#define PCM1_IN_L        0x04
-#define PCM1_IN_R        0x05
-//mutilchannel playback stream appear here:
-
-#define MULTI_FRONT_L  0x08
-#define MULTI_FRONT_R  0x09
-#define MULTI_REAR_L   0x0a
-#define MULTI_REAR_R   0x0b
-#define MULTI_CENTER   0x0c
-#define MULTI_LFE      0x0d
-
-#define AC97_IN_L      0x10
-#define AC97_IN_R      0x11
-#define SPDIF_CD_L     0x12
-#define SPDIF_CD_R     0x13
-
-/* hw outputs */
-#define AC97_FRONT_L   0x20
-#define AC97_FRONT_R   0x21
-#define DIGITAL_OUT_L  0x22
-#define DIGITAL_OUT_R  0x23
-#define DIGITAL_CENTER 0x24
-#define DIGITAL_LFE    0x25
-
-#define ANALOG_REAR_L  0x28
-#define ANALOG_REAR_R  0x29
-#define ADC_REC_L      0x2a
-#define ADC_REC_R      0x2b
-
-#define ANALOG_CENTER  0x31
-#define ANALOG_LFE     0x32
-
-
-#define INPUT_PATCH_START(patch, nm, ln, i)            \
-do {                                                   \
-       patch = PATCH(mgr, patch_n);                    \
-       strcpy(patch->name, nm);                        \
-       patch->code_start = pc * 2;                     \
-       patch->input = (1<<(0x1f&ln));                  \
-       patch->output= (1<<(0x1f&ln));                  \
-       patch->id = i;                                  \
-} while(0)
-
-#define INPUT_PATCH_END(patch)                         \
-do {                                                   \
-       patch->code_size = pc * 2 - patch->code_start;  \
-       patch_n++;                                      \
-} while(0)
-
-
-#define ROUTING_PATCH_START(patch, nm) \
-do {                                   \
-       patch = &mgr->rpatch;           \
-       strcpy(patch->name, nm);        \
-       patch->code_start = pc * 2;     \
-} while(0)
-
-#define ROUTING_PATCH_END(patch)                       \
-do {                                                    \
-       patch->code_size = pc * 2 - patch->code_start;      \
-} while(0)
-
-#define CONNECT(input, output) set_bit(input, &rpatch->route[(output) - OUTPUT_BASE]);
-
-#define CONNECT_V(input, output) set_bit(input, &rpatch->route_v[(output) - OUTPUT_BASE]);
-
-#define OUTPUT_PATCH_START(patch, nm, ln, i)           \
-do {                                                   \
-       patch = PATCH(mgr, patch_n);                    \
-       strcpy(patch->name, nm);                        \
-       patch->code_start = pc * 2;                     \
-       patch->input = (1<<(0x1f&ln));                  \
-       patch->output= (1<<(0x1f&ln));                  \
-       patch->id = i;                                  \
-} while(0)
-
-#define OUTPUT_PATCH_END(patch)                                \
-do {                                                   \
-       patch->code_size = pc * 2 - patch->code_start;  \
-       patch_n++;                                      \
-} while(0)
-
-#define GET_OUTPUT_GPR(patch, g, ln)                   \
-do {                                                   \
-       mgr->gpr[(g) - GPR_BASE].type = GPR_TYPE_IO;    \
-       mgr->gpr[(g) - GPR_BASE].usage++;               \
-       mgr->gpr[(g) - GPR_BASE].line = ln;             \
-       set_bit((g) - GPR_BASE, patch->gpr_used);       \
-} while(0)
-
-#define GET_INPUT_GPR(patch, g, ln)                    \
-do {                                                   \
-       mgr->gpr[(g) - GPR_BASE].type = GPR_TYPE_IO;    \
-       mgr->gpr[(g) - GPR_BASE].usage++;               \
-       mgr->gpr[(g) - GPR_BASE].line = ln;             \
-       set_bit((g) - GPR_BASE, patch->gpr_used);       \
-       set_bit((g) - GPR_BASE, patch->gpr_input);      \
-} while(0)
-
-#define GET_DYNAMIC_GPR(patch, g)                              \
-do {                                                           \
-       mgr->gpr[(g) - GPR_BASE].type = GPR_TYPE_DYNAMIC;       \
-       mgr->gpr[(g) - GPR_BASE].usage++;                       \
-       set_bit((g) - GPR_BASE, patch->gpr_used);               \
-} while(0)
-
-#define GET_CONTROL_GPR(patch, g, nm, a, b)                    \
-do {                                                           \
-       strcpy(mgr->gpr[(g) - GPR_BASE].name, nm);              \
-       mgr->gpr[(g) - GPR_BASE].type = GPR_TYPE_CONTROL;       \
-       mgr->gpr[(g) - GPR_BASE].usage++;                       \
-       mgr->gpr[(g) - GPR_BASE].min = a;                       \
-       mgr->gpr[(g) - GPR_BASE].max = b;                       \
-       sblive_writeptr(card, g, 0, b);                         \
-       set_bit((g) - GPR_BASE, patch->gpr_used);               \
-} while(0)
-
-#endif /* _EFXMGR_H */
diff --git a/sound/oss/emu10k1/emuadxmg.c b/sound/oss/emu10k1/emuadxmg.c
deleted file mode 100644 (file)
index d7d2d4c..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-
-/*     
- **********************************************************************
- *     emuadxmg.c - Address space manager for emu10k1 driver 
- *     Copyright 1999, 2000 Creative Labs, Inc. 
- * 
- ********************************************************************** 
- * 
- *     Date                 Author          Summary of changes 
- *     ----                 ------          ------------------ 
- *     October 20, 1999     Bertrand Lee    base code release 
- * 
- ********************************************************************** 
- * 
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version. 
- * 
- *     This program is distributed in the hope that it will be useful, 
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of 
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
- *     GNU General Public License for more details. 
- * 
- *     You should have received a copy of the GNU General Public 
- *     License along with this program; if not, write to the Free 
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 
- *     USA. 
- * 
- ********************************************************************** 
- */
-
-#include "hwaccess.h"
-
-/* Allocates emu address space */
-
-int emu10k1_addxmgr_alloc(u32 size, struct emu10k1_card *card)
-{
-       u16 *pagetable = card->emupagetable;
-       u16 index = 0;
-       u16 numpages;
-       unsigned long flags;
-
-       /* Convert bytes to pages */
-       numpages = (size / EMUPAGESIZE) + ((size % EMUPAGESIZE) ? 1 : 0);
-
-       spin_lock_irqsave(&card->lock, flags);
-
-       while (index < (MAXPAGES - 1)) {
-               if (pagetable[index] & 0x8000) {
-                       /* This block of pages is in use, jump to the start of the next block. */
-                       index += (pagetable[index] & 0x7fff);
-               } else {
-                       /* Found free block */
-                       if (pagetable[index] >= numpages) {
-
-                               /* Block is large enough */
-
-                               /* If free block is larger than the block requested
-                                * then adjust the size of the block remaining */
-                               if (pagetable[index] > numpages)
-                                       pagetable[index + numpages] = pagetable[index] - numpages;
-
-                               pagetable[index] = (numpages | 0x8000); /* Mark block as used */
-
-                               spin_unlock_irqrestore(&card->lock, flags);
-
-                               return index;
-                       } else {
-                               /* Block too small, jump to the start of the next block */
-                               index += pagetable[index];
-                       }
-               }
-       }
-
-       spin_unlock_irqrestore(&card->lock, flags);
-
-       return -1;
-}
-
-/* Frees a previously allocated emu address space. */
-
-void emu10k1_addxmgr_free(struct emu10k1_card *card, int index)
-{
-       u16 *pagetable = card->emupagetable;
-       u16 origsize = 0;
-       unsigned long flags;
-
-       spin_lock_irqsave(&card->lock, flags);
-
-       if (pagetable[index] & 0x8000) {
-               /* Block is allocated - mark block as free */
-               origsize = pagetable[index] & 0x7fff;
-               pagetable[index] = origsize;
-
-               /* If next block is free, we concat both blocks */
-               if (!(pagetable[index + origsize] & 0x8000))
-                       pagetable[index] += pagetable[index + origsize] & 0x7fff;
-       }
-
-       spin_unlock_irqrestore(&card->lock, flags);
-
-       return;
-}
diff --git a/sound/oss/emu10k1/hwaccess.c b/sound/oss/emu10k1/hwaccess.c
deleted file mode 100644 (file)
index 2dc16a8..0000000
+++ /dev/null
@@ -1,507 +0,0 @@
-/*
- **********************************************************************
- *     hwaccess.c -- Hardware access layer
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *     December 9, 1999     Jon Taylor      rewrote the I/O subsystem
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#include <asm/io.h>
-
-#include "hwaccess.h"
-#include "8010.h"
-#include "icardmid.h"
-
-/*************************************************************************
-* Function : srToPitch                                                   *
-* Input    : sampleRate - sampling rate                                  *
-* Return   : pitch value                                                 *
-* About    : convert sampling rate to pitch                              *
-* Note     : for 8010, sampling rate is at 48kHz, this function should   *
-*            be changed.                                                 *
-*************************************************************************/
-u32 srToPitch(u32 sampleRate)
-{
-       int i;
-
-       /* FIXME: These tables should be defined in a headerfile */
-       static u32 logMagTable[128] = {
-               0x00000, 0x02dfc, 0x05b9e, 0x088e6, 0x0b5d6, 0x0e26f, 0x10eb3, 0x13aa2,
-               0x1663f, 0x1918a, 0x1bc84, 0x1e72e, 0x2118b, 0x23b9a, 0x2655d, 0x28ed5,
-               0x2b803, 0x2e0e8, 0x30985, 0x331db, 0x359eb, 0x381b6, 0x3a93d, 0x3d081,
-               0x3f782, 0x41e42, 0x444c1, 0x46b01, 0x49101, 0x4b6c4, 0x4dc49, 0x50191,
-               0x5269e, 0x54b6f, 0x57006, 0x59463, 0x5b888, 0x5dc74, 0x60029, 0x623a7,
-               0x646ee, 0x66a00, 0x68cdd, 0x6af86, 0x6d1fa, 0x6f43c, 0x7164b, 0x73829,
-               0x759d4, 0x77b4f, 0x79c9a, 0x7bdb5, 0x7dea1, 0x7ff5e, 0x81fed, 0x8404e,
-               0x86082, 0x88089, 0x8a064, 0x8c014, 0x8df98, 0x8fef1, 0x91e20, 0x93d26,
-               0x95c01, 0x97ab4, 0x9993e, 0x9b79f, 0x9d5d9, 0x9f3ec, 0xa11d8, 0xa2f9d,
-               0xa4d3c, 0xa6ab5, 0xa8808, 0xaa537, 0xac241, 0xadf26, 0xafbe7, 0xb1885,
-               0xb3500, 0xb5157, 0xb6d8c, 0xb899f, 0xba58f, 0xbc15e, 0xbdd0c, 0xbf899,
-               0xc1404, 0xc2f50, 0xc4a7b, 0xc6587, 0xc8073, 0xc9b3f, 0xcb5ed, 0xcd07c,
-               0xceaec, 0xd053f, 0xd1f73, 0xd398a, 0xd5384, 0xd6d60, 0xd8720, 0xda0c3,
-               0xdba4a, 0xdd3b4, 0xded03, 0xe0636, 0xe1f4e, 0xe384a, 0xe512c, 0xe69f3,
-               0xe829f, 0xe9b31, 0xeb3a9, 0xecc08, 0xee44c, 0xefc78, 0xf148a, 0xf2c83,
-               0xf4463, 0xf5c2a, 0xf73da, 0xf8b71, 0xfa2f0, 0xfba57, 0xfd1a7, 0xfe8df
-       };
-
-       static char logSlopeTable[128] = {
-               0x5c, 0x5c, 0x5b, 0x5a, 0x5a, 0x59, 0x58, 0x58,
-               0x57, 0x56, 0x56, 0x55, 0x55, 0x54, 0x53, 0x53,
-               0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f,
-               0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b,
-               0x4a, 0x4a, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47,
-               0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44,
-               0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41,
-               0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e,
-               0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c,
-               0x3b, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39,
-               0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x38, 0x37,
-               0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x35,
-               0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x34,
-               0x33, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x32,
-               0x32, 0x31, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30,
-               0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f
-       };
-
-       if (sampleRate == 0)
-               return 0;       /* Bail out if no leading "1" */
-
-       sampleRate *= 11185;    /* Scale 48000 to 0x20002380 */
-
-       for (i = 31; i > 0; i--) {
-               if (sampleRate & 0x80000000) {  /* Detect leading "1" */
-                       return (u32) (((s32) (i - 15) << 20) +
-                                     logMagTable[0x7f & (sampleRate >> 24)] +
-                                     (0x7f & (sampleRate >> 17)) * logSlopeTable[0x7f & (sampleRate >> 24)]);
-               }
-               sampleRate = sampleRate << 1;
-       }
-
-       DPF(2, "srToPitch: BUG!\n");
-       return 0;               /* Should never reach this point */
-}
-
-/*******************************************
-* write/read PCI function 0 registers      *
-********************************************/
-void emu10k1_writefn0(struct emu10k1_card *card, u32 reg, u32 data)
-{
-       unsigned long flags;
-
-       if (reg & 0xff000000) {
-               u32 mask;
-               u8 size, offset;
-
-               size = (reg >> 24) & 0x3f;
-               offset = (reg >> 16) & 0x1f;
-               mask = ((1 << size) - 1) << offset;
-               data = (data << offset) & mask;
-               reg &= 0x7f;
-
-               spin_lock_irqsave(&card->lock, flags);
-               data |= inl(card->iobase + reg) & ~mask;
-               outl(data, card->iobase + reg);
-               spin_unlock_irqrestore(&card->lock, flags);
-       } else {
-               spin_lock_irqsave(&card->lock, flags);
-               outl(data, card->iobase + reg);
-               spin_unlock_irqrestore(&card->lock, flags);
-       }
-
-       return;
-}
-
-#ifdef DBGEMU
-void emu10k1_writefn0_2(struct emu10k1_card *card, u32 reg, u32 data, int size)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&card->lock, flags);
-
-       if (size == 32)
-               outl(data, card->iobase + (reg & 0x1F));
-       else if (size == 16)
-               outw(data, card->iobase + (reg & 0x1F));
-       else
-               outb(data, card->iobase + (reg & 0x1F));
-
-       spin_unlock_irqrestore(&card->lock, flags);
-
-       return;
-}
-#endif  /*  DBGEMU  */
-
-u32 emu10k1_readfn0(struct emu10k1_card * card, u32 reg)
-{
-       u32 val;
-       unsigned long flags;
-
-       if (reg & 0xff000000) {
-               u32 mask;
-               u8 size, offset;
-
-               size = (reg >> 24) & 0x3f;
-               offset = (reg >> 16) & 0x1f;
-               mask = ((1 << size) - 1) << offset;
-               reg &= 0x7f;
-
-               spin_lock_irqsave(&card->lock, flags);
-               val = inl(card->iobase + reg);
-               spin_unlock_irqrestore(&card->lock, flags);
-
-               return (val & mask) >> offset;
-        } else {
-               spin_lock_irqsave(&card->lock, flags);
-               val = inl(card->iobase + reg);
-               spin_unlock_irqrestore(&card->lock, flags);
-               return val;
-       }
-}
-
-void emu10k1_timer_set(struct emu10k1_card * card, u16 data)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&card->lock, flags);
-       outw(data & TIMER_RATE_MASK, card->iobase + TIMER);
-       spin_unlock_irqrestore(&card->lock, flags);
-}
-
-/************************************************************************
-* write/read Emu10k1 pointer-offset register set, accessed through      *
-*  the PTR and DATA registers                                           *
-*************************************************************************/
-#define A_PTR_ADDRESS_MASK 0x0fff0000
-void sblive_writeptr(struct emu10k1_card *card, u32 reg, u32 channel, u32 data)
-{
-       u32 regptr;
-       unsigned long flags;
-
-       regptr = ((reg << 16) & A_PTR_ADDRESS_MASK) | (channel & PTR_CHANNELNUM_MASK);
-
-       if (reg & 0xff000000) {
-               u32 mask;
-               u8 size, offset;
-
-               size = (reg >> 24) & 0x3f;
-               offset = (reg >> 16) & 0x1f;
-               mask = ((1 << size) - 1) << offset;
-               data = (data << offset) & mask;
-
-               spin_lock_irqsave(&card->lock, flags);
-               outl(regptr, card->iobase + PTR);
-               data |= inl(card->iobase + DATA) & ~mask;
-               outl(data, card->iobase + DATA);
-               spin_unlock_irqrestore(&card->lock, flags);
-       } else {
-               spin_lock_irqsave(&card->lock, flags);
-               outl(regptr, card->iobase + PTR);
-               outl(data, card->iobase + DATA);
-               spin_unlock_irqrestore(&card->lock, flags);
-       }
-}
-
-/* ... :  data, reg, ... , TAGLIST_END */
-void sblive_writeptr_tag(struct emu10k1_card *card, u32 channel, ...)
-{
-       va_list args;
-
-       unsigned long flags;
-        u32 reg;
-
-       va_start(args, channel);
-
-       spin_lock_irqsave(&card->lock, flags);
-       while ((reg = va_arg(args, u32)) != TAGLIST_END) {
-               u32 data = va_arg(args, u32);
-               u32 regptr = (((reg << 16) & A_PTR_ADDRESS_MASK)
-                             | (channel & PTR_CHANNELNUM_MASK));
-               outl(regptr, card->iobase + PTR);
-               if (reg & 0xff000000) {
-                       int size = (reg >> 24) & 0x3f;
-                        int offset = (reg >> 16) & 0x1f;
-                       u32 mask = ((1 << size) - 1) << offset;
-                       data = (data << offset) & mask;
-
-                       data |= inl(card->iobase + DATA) & ~mask;
-               }
-               outl(data, card->iobase + DATA);
-       }
-       spin_unlock_irqrestore(&card->lock, flags);
-
-       va_end(args);
-
-       return;
-}
-
-u32 sblive_readptr(struct emu10k1_card * card, u32 reg, u32 channel)
-{
-       u32 regptr, val;
-       unsigned long flags;
-
-       regptr = ((reg << 16) & A_PTR_ADDRESS_MASK) | (channel & PTR_CHANNELNUM_MASK);
-
-       if (reg & 0xff000000) {
-               u32 mask;
-               u8 size, offset;
-
-               size = (reg >> 24) & 0x3f;
-               offset = (reg >> 16) & 0x1f;
-               mask = ((1 << size) - 1) << offset;
-
-               spin_lock_irqsave(&card->lock, flags);
-               outl(regptr, card->iobase + PTR);
-               val = inl(card->iobase + DATA);
-               spin_unlock_irqrestore(&card->lock, flags);
-
-               return (val & mask) >> offset;
-       } else {
-               spin_lock_irqsave(&card->lock, flags);
-               outl(regptr, card->iobase + PTR);
-               val = inl(card->iobase + DATA);
-               spin_unlock_irqrestore(&card->lock, flags);
-
-               return val;
-       }
-}
-
-void emu10k1_irq_enable(struct emu10k1_card *card, u32 irq_mask)
-{
-       u32 val;
-       unsigned long flags;
-
-       DPF(2,"emu10k1_irq_enable()\n");
-
-       spin_lock_irqsave(&card->lock, flags);
-        val = inl(card->iobase + INTE) | irq_mask;
-        outl(val, card->iobase + INTE);
-       spin_unlock_irqrestore(&card->lock, flags);
-       return;
-}
-
-void emu10k1_irq_disable(struct emu10k1_card *card, u32 irq_mask)
-{
-        u32 val;
-        unsigned long flags;
-
-        DPF(2,"emu10k1_irq_disable()\n");
-
-        spin_lock_irqsave(&card->lock, flags);
-        val = inl(card->iobase + INTE) & ~irq_mask;
-        outl(val, card->iobase + INTE);
-        spin_unlock_irqrestore(&card->lock, flags);
-        return;
-}
-
-void emu10k1_clear_stop_on_loop(struct emu10k1_card *card, u32 voicenum)
-{
-       /* Voice interrupt */
-       if (voicenum >= 32)
-               sblive_writeptr(card, SOLEH | ((0x0100 | (voicenum - 32)) << 16), 0, 0);
-       else
-               sblive_writeptr(card, SOLEL | ((0x0100 | voicenum) << 16), 0, 0);
-
-       return;
-}
-
-static void sblive_wcwait(struct emu10k1_card *card, u32 wait)
-{
-       volatile unsigned uCount;
-       u32 newtime = 0, curtime;
-
-       curtime = emu10k1_readfn0(card, WC_SAMPLECOUNTER);
-       while (wait--) {
-               uCount = 0;
-               while (uCount++ < TIMEOUT) {
-                       newtime = emu10k1_readfn0(card, WC_SAMPLECOUNTER);
-                       if (newtime != curtime)
-                               break;
-               }
-
-               if (uCount >= TIMEOUT)
-                       break;
-
-               curtime = newtime;
-       }
-}
-
-u16 emu10k1_ac97_read(struct ac97_codec *codec, u8 reg)
-{
-       struct emu10k1_card *card = codec->private_data;
-       u16 data;
-       unsigned long flags;
-
-       spin_lock_irqsave(&card->lock, flags);
-
-       outb(reg, card->iobase + AC97ADDRESS);
-       data = inw(card->iobase + AC97DATA);
-
-       spin_unlock_irqrestore(&card->lock, flags);
-
-       return data;
-}
-
-void emu10k1_ac97_write(struct ac97_codec *codec, u8 reg, u16 value)
-{
-       struct emu10k1_card *card = codec->private_data;
-       unsigned long flags;
-
-       spin_lock_irqsave(&card->lock, flags);
-
-       outb(reg, card->iobase + AC97ADDRESS);
-       outw(value, card->iobase + AC97DATA);
-       outb( AC97_EXTENDED_ID, card->iobase + AC97ADDRESS); 
-       spin_unlock_irqrestore(&card->lock, flags);
-}
-
-/*********************************************************
-*            MPU access functions                        *
-**********************************************************/
-
-int emu10k1_mpu_write_data(struct emu10k1_card *card, u8 data)
-{
-       unsigned long flags;
-       int ret;
-
-       if (card->is_audigy) {
-               if ((sblive_readptr(card, A_MUSTAT,0) & MUSTAT_ORDYN) == 0) {
-                       sblive_writeptr(card, A_MUDATA, 0, data);
-                       ret = 0;
-               } else
-                       ret = -1;
-       } else {
-               spin_lock_irqsave(&card->lock, flags);
-
-               if ((inb(card->iobase + MUSTAT) & MUSTAT_ORDYN) == 0) {
-                       outb(data, card->iobase + MUDATA);
-                       ret = 0;
-               } else
-                       ret = -1;
-
-               spin_unlock_irqrestore(&card->lock, flags);
-       }
-
-       return ret;
-}
-
-int emu10k1_mpu_read_data(struct emu10k1_card *card, u8 * data)
-{
-       unsigned long flags;
-       int ret;
-
-       if (card->is_audigy) {
-               if ((sblive_readptr(card, A_MUSTAT,0) & MUSTAT_IRDYN) == 0) {
-                       *data = sblive_readptr(card, A_MUDATA,0);
-                       ret = 0;
-               } else
-                       ret = -1;
-       } else {
-               spin_lock_irqsave(&card->lock, flags);
-
-               if ((inb(card->iobase + MUSTAT) & MUSTAT_IRDYN) == 0) {
-                       *data = inb(card->iobase + MUDATA);
-                       ret = 0;
-               } else
-                       ret = -1;
-
-               spin_unlock_irqrestore(&card->lock, flags);
-       }
-
-       return ret;
-}
-
-int emu10k1_mpu_reset(struct emu10k1_card *card)
-{
-       u8 status;
-       unsigned long flags;
-
-       DPF(2, "emu10k1_mpu_reset()\n");
-       if (card->is_audigy) {
-               if (card->mpuacqcount == 0) {
-                       sblive_writeptr(card, A_MUCMD, 0, MUCMD_RESET);
-                       sblive_wcwait(card, 8);
-                       sblive_writeptr(card, A_MUCMD, 0, MUCMD_RESET);
-                       sblive_wcwait(card, 8);
-                       sblive_writeptr(card, A_MUCMD, 0, MUCMD_ENTERUARTMODE);
-                       sblive_wcwait(card, 8);
-                       status = sblive_readptr(card, A_MUDATA, 0);
-                       if (status == 0xfe)
-                               return 0;
-                       else
-                               return -1;
-               }
-
-               return 0;
-       } else {
-               if (card->mpuacqcount == 0) {
-                       spin_lock_irqsave(&card->lock, flags);
-                       outb(MUCMD_RESET, card->iobase + MUCMD);
-                       spin_unlock_irqrestore(&card->lock, flags);
-
-                       sblive_wcwait(card, 8);
-
-                       spin_lock_irqsave(&card->lock, flags);
-                       outb(MUCMD_RESET, card->iobase + MUCMD);
-                       spin_unlock_irqrestore(&card->lock, flags);
-
-                       sblive_wcwait(card, 8);
-
-                       spin_lock_irqsave(&card->lock, flags);
-                       outb(MUCMD_ENTERUARTMODE, card->iobase + MUCMD);
-                       spin_unlock_irqrestore(&card->lock, flags);
-
-                       sblive_wcwait(card, 8);
-
-                       spin_lock_irqsave(&card->lock, flags);
-                       status = inb(card->iobase + MUDATA);
-                       spin_unlock_irqrestore(&card->lock, flags);
-
-                       if (status == 0xfe)
-                               return 0;
-                       else
-                               return -1;
-               }
-
-               return 0;
-       }
-}
-
-int emu10k1_mpu_acquire(struct emu10k1_card *card)
-{
-       /* FIXME: This should be a macro */
-       ++card->mpuacqcount;
-
-       return 0;
-}
-
-int emu10k1_mpu_release(struct emu10k1_card *card)
-{
-       /* FIXME: this should be a macro */
-       --card->mpuacqcount;
-
-       return 0;
-}
diff --git a/sound/oss/emu10k1/hwaccess.h b/sound/oss/emu10k1/hwaccess.h
deleted file mode 100644 (file)
index 85e27bd..0000000
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- **********************************************************************
- *     hwaccess.h
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                Author          Summary of changes
- *     ----                ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#ifndef _HWACCESS_H
-#define _HWACCESS_H
-
-#include <linux/fs.h>
-#include <linux/sound.h>
-#include <linux/soundcard.h>
-#include <linux/ac97_codec.h>
-#include <linux/pci.h>
-#include <linux/slab.h>
-#include <linux/sched.h>
-#include <asm/io.h>
-
-#include "efxmgr.h"
-#include "passthrough.h"
-#include "midi.h"
-
-#define EMUPAGESIZE     4096            /* don't change */
-#define NUM_G           64              /* use all channels */
-#define NUM_FXSENDS     4               /* don't change */
-/* setting this to other than a power of two may break some applications */
-#define MAXBUFSIZE     65536
-#define MAXPAGES       8192 
-#define BUFMAXPAGES     (MAXBUFSIZE / PAGE_SIZE)
-
-#define FLAGS_AVAILABLE     0x0001
-#define FLAGS_READY         0x0002
-
-struct memhandle
-{
-       dma_addr_t dma_handle;
-       void *addr;
-       u32 size;
-};
-
-#define DEBUG_LEVEL 2
-
-#ifdef EMU10K1_DEBUG
-# define DPD(level,x,y...) do {if(level <= DEBUG_LEVEL) printk( KERN_NOTICE "emu10k1: %s: %d: " x , __FILE__ , __LINE__ , y );} while(0)
-# define DPF(level,x)   do {if(level <= DEBUG_LEVEL) printk( KERN_NOTICE "emu10k1: %s: %d: " x , __FILE__ , __LINE__ );} while(0)
-#else
-# define DPD(level,x,y...) do { } while (0) /* not debugging: nothing */
-# define DPF(level,x) do { } while (0)
-#endif /* EMU10K1_DEBUG */
-
-#define ERROR() DPF(1,"error\n")
-
-/* DATA STRUCTURES */
-
-struct emu10k1_waveout
-{
-       u32 send_routing[3];
-       // audigy only:
-       u32 send_routing2[3];
-
-       u32 send_dcba[3];
-       // audigy only:
-       u32 send_hgfe[3];
-};
-#define ROUTE_PCM 0
-#define ROUTE_PT 1
-#define ROUTE_PCM1 2
-
-#define SEND_MONO 0
-#define SEND_LEFT 1
-#define SEND_RIGHT 2
-
-struct emu10k1_wavein
-{
-        struct wiinst *ac97;
-        struct wiinst *mic;
-        struct wiinst *fx;
-
-        u8 recsrc;
-        u32 fxwc;
-};
-
-#define CMD_READ 1
-#define CMD_WRITE 2
-
-struct mixer_private_ioctl {
-        u32 cmd;
-        u32 val[90];
-};
-
-/* bogus ioctls numbers to escape from OSS mixer limitations */
-#define CMD_WRITEFN0            _IOW('D', 0, struct mixer_private_ioctl)
-#define CMD_READFN0            _IOR('D', 1, struct mixer_private_ioctl) 
-#define CMD_WRITEPTR           _IOW('D', 2, struct mixer_private_ioctl) 
-#define CMD_READPTR            _IOR('D', 3, struct mixer_private_ioctl) 
-#define CMD_SETRECSRC          _IOW('D', 4, struct mixer_private_ioctl) 
-#define CMD_GETRECSRC          _IOR('D', 5, struct mixer_private_ioctl) 
-#define CMD_GETVOICEPARAM      _IOR('D', 6, struct mixer_private_ioctl) 
-#define CMD_SETVOICEPARAM      _IOW('D', 7, struct mixer_private_ioctl) 
-#define CMD_GETPATCH           _IOR('D', 8, struct mixer_private_ioctl) 
-#define CMD_GETGPR             _IOR('D', 9, struct mixer_private_ioctl) 
-#define CMD_GETCTLGPR           _IOR('D', 10, struct mixer_private_ioctl)
-#define CMD_SETPATCH           _IOW('D', 11, struct mixer_private_ioctl) 
-#define CMD_SETGPR             _IOW('D', 12, struct mixer_private_ioctl) 
-#define CMD_SETCTLGPR          _IOW('D', 13, struct mixer_private_ioctl)
-#define CMD_SETGPOUT           _IOW('D', 14, struct mixer_private_ioctl)
-#define CMD_GETGPR2OSS         _IOR('D', 15, struct mixer_private_ioctl)
-#define CMD_SETGPR2OSS         _IOW('D', 16, struct mixer_private_ioctl)
-#define CMD_SETMCH_FX          _IOW('D', 17, struct mixer_private_ioctl)
-#define CMD_SETPASSTHROUGH     _IOW('D', 18, struct mixer_private_ioctl)
-#define CMD_PRIVATE3_VERSION   _IOW('D', 19, struct mixer_private_ioctl)
-#define CMD_AC97_BOOST         _IOW('D', 20, struct mixer_private_ioctl)
-
-//up this number when breaking compatibility
-#define PRIVATE3_VERSION 2
-
-struct emu10k1_card 
-{
-       struct list_head list;
-
-       struct memhandle        virtualpagetable;
-       struct memhandle        tankmem;
-       struct memhandle        silentpage;
-
-       spinlock_t              lock;
-
-       u8                      voicetable[NUM_G];
-       u16                     emupagetable[MAXPAGES];
-
-       struct list_head        timers;
-       u16                     timer_delay;
-       spinlock_t              timer_lock;
-
-       struct pci_dev          *pci_dev;
-       unsigned long           iobase;
-       unsigned long           length;
-       unsigned short          model;
-       unsigned int irq; 
-
-       int     audio_dev;
-       int     audio_dev1;
-       int     midi_dev;
-#ifdef EMU10K1_SEQUENCER
-       int seq_dev;
-       struct emu10k1_mididevice *seq_mididev;
-#endif
-
-       struct ac97_codec *ac97;
-       int ac97_supported_mixers;
-       int ac97_stereo_mixers;
-
-       /* Number of first fx voice for multichannel output */
-       u8 mchannel_fx;
-       struct emu10k1_waveout  waveout;
-       struct emu10k1_wavein   wavein;
-       struct emu10k1_mpuout   *mpuout;
-       struct emu10k1_mpuin    *mpuin;
-
-       struct mutex            open_sem;
-       mode_t                  open_mode;
-       wait_queue_head_t       open_wait;
-
-       u32         mpuacqcount;          // Mpu acquire count
-       u32         has_toslink;               // TOSLink detection
-
-       u8 chiprev;                    /* Chip revision                */
-       u8 is_audigy;
-       u8 is_aps;
-
-       struct patch_manager mgr;
-       struct pt_data pt;
-};
-
-int emu10k1_addxmgr_alloc(u32, struct emu10k1_card *);
-void emu10k1_addxmgr_free(struct emu10k1_card *, int);
-
-int emu10k1_find_control_gpr(struct patch_manager *, const char *, const char *);
-void emu10k1_set_control_gpr(struct emu10k1_card *, int , s32, int );
-
-void emu10k1_set_volume_gpr(struct emu10k1_card *, int, s32, int);
-
-
-#define VOL_6BIT 0x40
-#define VOL_5BIT 0x20
-#define VOL_4BIT 0x10
-
-#define TIMEOUT                    16384
-
-u32 srToPitch(u32);
-
-extern struct list_head emu10k1_devs;
-
-/* Hardware Abstraction Layer access functions */
-
-void emu10k1_writefn0(struct emu10k1_card *, u32, u32);
-void emu10k1_writefn0_2(struct emu10k1_card *, u32, u32, int);
-u32 emu10k1_readfn0(struct emu10k1_card *, u32);
-
-void emu10k1_timer_set(struct emu10k1_card *, u16);
-
-void sblive_writeptr(struct emu10k1_card *, u32, u32, u32);
-void sblive_writeptr_tag(struct emu10k1_card *, u32, ...);
-#define TAGLIST_END    0
-
-u32 sblive_readptr(struct emu10k1_card *, u32 , u32 );
-
-void emu10k1_irq_enable(struct emu10k1_card *, u32);
-void emu10k1_irq_disable(struct emu10k1_card *, u32);
-void emu10k1_clear_stop_on_loop(struct emu10k1_card *, u32);
-
-/* AC97 Codec register access function */
-u16 emu10k1_ac97_read(struct ac97_codec *, u8);
-void emu10k1_ac97_write(struct ac97_codec *, u8, u16);
-
-/* MPU access function*/
-int emu10k1_mpu_write_data(struct emu10k1_card *, u8);
-int emu10k1_mpu_read_data(struct emu10k1_card *, u8 *);
-int emu10k1_mpu_reset(struct emu10k1_card *);
-int emu10k1_mpu_acquire(struct emu10k1_card *);
-int emu10k1_mpu_release(struct emu10k1_card *);
-
-#endif  /* _HWACCESS_H */
diff --git a/sound/oss/emu10k1/icardmid.h b/sound/oss/emu10k1/icardmid.h
deleted file mode 100644 (file)
index 6a6ef41..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- **********************************************************************
- *     isblive_mid.h
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#ifndef _ICARDMIDI_H
-#define _ICARDMIDI_H
-
-/* MIDI defines */
-#define MIDI_DATA_FIRST                 0x00
-#define MIDI_DATA_LAST                  0x7F
-#define MIDI_STATUS_FIRST               0x80
-#define MIDI_STATUS_LAST                0xFF
-
-/* Channel status bytes */
-#define MIDI_STATUS_CHANNEL_FIRST       0x80
-#define MIDI_STATUS_CHANNEL_LAST        0xE0
-#define MIDI_STATUS_CHANNEL_MASK        0xF0
-
-/* Channel voice messages */
-#define MIDI_VOICE_NOTE_OFF             0x80
-#define MIDI_VOICE_NOTE_ON              0x90
-#define MIDI_VOICE_POLY_PRESSURE        0xA0
-#define MIDI_VOICE_CONTROL_CHANGE       0xB0
-#define MIDI_VOICE_PROGRAM_CHANGE       0xC0
-#define MIDI_VOICE_CHANNEL_PRESSURE     0xD0
-#define MIDI_VOICE_PITCH_BEND           0xE0
-
-/* Channel mode messages */
-#define MIDI_MODE_CHANNEL               MIDI_VOICE_CONTROL_CHANGE
-
-/* System status bytes */
-#define MIDI_STATUS_SYSTEM_FIRST        0xF0
-#define MIDI_STATUS_SYSTEM_LAST         0xFF
-
-/* System exclusive messages */
-#define MIDI_SYSEX_BEGIN                0xF0
-#define MIDI_SYSEX_EOX                  0xF7
-
-/* System common messages */
-#define MIDI_COMMON_TCQF                0xF1   /* Time code quarter frame  */
-#define MIDI_COMMON_SONG_POSITION       0xF2
-#define MIDI_COMMON_SONG_SELECT         0xF3
-#define MIDI_COMMON_UNDEFINED_F4        0xF4
-#define MIDI_COMMON_UNDEFINED_F5        0xF5
-#define MIDI_COMMON_TUNE_REQUEST        0xF6
-
-/* System real-time messages */
-#define MIDI_RTIME_TIMING_CLOCK         0xF8
-#define MIDI_RTIME_UNDEFINED_F9         0xF9
-#define MIDI_RTIME_START                0xFA
-#define MIDI_RTIME_CONTINUE             0xFB
-#define MIDI_RTIME_STOP                 0xFC
-#define MIDI_RTIME_UNDEFINED_FD         0xFD
-#define MIDI_RTIME_ACTIVE_SENSING       0xFE
-#define MIDI_RTIME_SYSTEM_RESET         0xFF
-
-/* Flags for flags parm of midiOutCachePatches(), midiOutCacheDrumPatches() */
-#define MIDI_CACHE_ALL                  1
-#define MIDI_CACHE_BESTFIT              2
-#define MIDI_CACHE_QUERY                3
-#define MIDI_UNCACHE                    4
-
-/* Event declarations for MPU IRQ Callbacks */
-#define ICARDMIDI_INLONGDATA            0x00000001 /* MIM_LONGDATA */
-#define ICARDMIDI_INLONGERROR           0x00000002 /* MIM_LONGERROR */
-#define ICARDMIDI_OUTLONGDATA           0x00000004 /* MOM_DONE for MPU OUT buffer */
-#define ICARDMIDI_INDATA                0x00000010 /* MIM_DATA */
-#define ICARDMIDI_INDATAERROR           0x00000020 /* MIM_ERROR */
-
-/* Declaration for flags in CARDMIDIBUFFERHDR */
-/* Make it the same as MHDR_DONE, MHDR_INQUEUE in mmsystem.h */
-#define MIDIBUF_DONE                    0x00000001
-#define MIDIBUF_INQUEUE                 0x00000004
-
-/* Declaration for msg parameter in midiCallbackFn */
-#define ICARDMIDI_OUTBUFFEROK           0x00000001
-#define ICARDMIDI_INMIDIOK              0x00000002
-
-/* Declaration for technology in struct midi_caps */
-#define MT_MIDIPORT                     0x00000001     /* In original MIDIOUTCAPS structure */
-#define MT_FMSYNTH                      0x00000004     /* In original MIDIOUTCAPS structure */
-#define MT_AWESYNTH                     0x00001000
-#define MT_PCISYNTH                     0x00002000
-#define MT_PCISYNTH64                   0x00004000
-#define CARDMIDI_AWEMASK                0x0000F000
-
-enum LocalErrorCode
-{
-        CTSTATUS_NOTENABLED = 0x7000,
-        CTSTATUS_READY,
-        CTSTATUS_BUSY,
-        CTSTATUS_DATAAVAIL,
-        CTSTATUS_NODATA,
-        CTSTATUS_NEXT_BYTE
-};
-
-/* MIDI data block header */
-struct midi_hdr
-{
-       u8 *reserved;           /* Pointer to original locked data block */
-       u32 bufferlength;       /* Length of data in data block */
-       u32 bytesrecorded;      /* Used for input only */
-       u32 user;               /* For client's use */
-       u32 flags;              /* Assorted flags (see defines) */
-       struct list_head list;  /* Reserved for driver */
-       u8 *data;               /* Second copy of first pointer */
-};
-
-/* Enumeration for SetControl */
-enum
-{
-       MIDIOBJVOLUME = 0x1,
-       MIDIQUERYACTIVEINST
-};
-
-struct midi_queue
-{
-       struct midi_queue  *next;
-       u32 qtype;            /* 0 = short message, 1 = long data */
-       u32 length;
-       u32 sizeLeft;
-       u8 *midibyte;
-       unsigned long refdata;
-};
-
-struct midi_openinfo
-{
-       u32     cbsize;
-       u32     flags;
-       unsigned long  refdata;
-       u32     streamid;
-};
-
-int emu10k1_midi_callback(unsigned long , unsigned long, unsigned long *);
-
-#endif /* _ICARDMIDI_H */
diff --git a/sound/oss/emu10k1/icardwav.h b/sound/oss/emu10k1/icardwav.h
deleted file mode 100644 (file)
index 25be409..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*     
- **********************************************************************
- *     icardwav.h
- *     Copyright 1999, 2000 Creative Labs, Inc. 
- * 
- ********************************************************************** 
- * 
- *     Date                 Author          Summary of changes 
- *     ----                 ------          ------------------ 
- *     October 20, 1999     Bertrand Lee    base code release 
- * 
- ********************************************************************** 
- * 
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version. 
- * 
- *     This program is distributed in the hope that it will be useful, 
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of 
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
- *     GNU General Public License for more details. 
- * 
- *     You should have received a copy of the GNU General Public 
- *     License along with this program; if not, write to the Free 
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 
- *     USA. 
- * 
- ********************************************************************** 
- */
-
-#ifndef _ICARDWAV_H
-#define _ICARDWAV_H
-
-struct wave_format 
-{
-       int id;
-       int samplingrate;
-       u8 bitsperchannel;
-       u8 channels;            /* 1 = Mono, 2 = Stereo, 3, ... = Multichannel */
-       u8 bytesperchannel;
-       u8 bytespervoicesample;
-       u8 bytespersample;
-       int bytespersec;
-       u8 passthrough;
-};
-
-/* emu10k1_wave states */
-#define WAVE_STATE_OPEN                0x01    
-#define WAVE_STATE_STARTED     0x02
-#define WAVE_STATE_CLOSED      0x04
-
-#endif /* _ICARDWAV_H */
diff --git a/sound/oss/emu10k1/irqmgr.c b/sound/oss/emu10k1/irqmgr.c
deleted file mode 100644 (file)
index fb2ce63..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- **********************************************************************
- *     irqmgr.c - IRQ manager for emu10k1 driver
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#include "hwaccess.h"
-#include "8010.h"
-#include "cardmi.h"
-#include "cardmo.h"
-#include "irqmgr.h"
-
-/* Interrupt handler */
-
-irqreturn_t emu10k1_interrupt(int irq, void *dev_id)
-{
-       struct emu10k1_card *card = (struct emu10k1_card *) dev_id;
-       u32 irqstatus, irqstatus_tmp;
-       int handled = 0;
-
-       DPD(4, "emu10k1_interrupt called, irq =  %u\n", irq);
-
-       /*
-        ** NOTE :
-        ** We do a 'while loop' here cos on certain machines, with both
-        ** playback and recording going on at the same time, IRQs will
-        ** stop coming in after a while. Checking IPND indeed shows that
-        ** there are interrupts pending but the PIC says no IRQs pending.
-        ** I suspect that some boards need edge-triggered IRQs but are not
-        ** getting that condition if we don't completely clear the IPND
-        ** (make sure no more interrupts are pending).
-        ** - Eric
-        */
-
-       while ((irqstatus = inl(card->iobase + IPR))) {
-               DPD(4, "irq status %#x\n", irqstatus);
-
-               irqstatus_tmp = irqstatus;
-
-               if (irqstatus & IRQTYPE_TIMER) {
-                       emu10k1_timer_irqhandler(card);
-                       irqstatus &= ~IRQTYPE_TIMER;
-               }
-
-               if (irqstatus & IRQTYPE_DSP) {
-                       emu10k1_dsp_irqhandler(card);
-                       irqstatus &= ~IRQTYPE_DSP;
-               }
-
-               if (irqstatus & IRQTYPE_MPUIN) {
-                       emu10k1_mpuin_irqhandler(card);
-                       irqstatus &= ~IRQTYPE_MPUIN;
-               }
-
-               if (irqstatus & IRQTYPE_MPUOUT) {
-                       emu10k1_mpuout_irqhandler(card);
-                       irqstatus &= ~IRQTYPE_MPUOUT;
-               }
-
-               if (irqstatus & IPR_MUTE) {
-                       emu10k1_mute_irqhandler(card);
-                       irqstatus &=~IPR_MUTE;
-               }
-
-               if (irqstatus & IPR_VOLINCR) {
-                       emu10k1_volincr_irqhandler(card);
-                       irqstatus &=~IPR_VOLINCR;
-               }
-
-               if (irqstatus & IPR_VOLDECR) {
-                       emu10k1_voldecr_irqhandler(card);
-                       irqstatus &=~IPR_VOLDECR;
-               }
-
-               if (irqstatus){
-                       printk(KERN_ERR "emu10k1: Warning, unhandled interrupt: %#08x\n", irqstatus);
-                       //make sure any interrupts we don't handle are disabled:
-                       emu10k1_irq_disable(card, ~(INTE_MIDIRXENABLE | INTE_MIDITXENABLE | INTE_INTERVALTIMERENB |
-                                               INTE_VOLDECRENABLE | INTE_VOLINCRENABLE | INTE_MUTEENABLE |
-                                               INTE_FXDSPENABLE));
-               }
-
-               /* acknowledge interrupt */
-               outl(irqstatus_tmp, card->iobase + IPR);
-               handled = 1;
-       }
-       return IRQ_RETVAL(handled);
-}
diff --git a/sound/oss/emu10k1/irqmgr.h b/sound/oss/emu10k1/irqmgr.h
deleted file mode 100644 (file)
index 7e7c9ca..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- **********************************************************************
- *     irq.h
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#ifndef _IRQ_H
-#define _IRQ_H
-
-/* EMU Irq Types */
-#define IRQTYPE_PCIBUSERROR    IPR_PCIERROR
-#define IRQTYPE_MIXERBUTTON    (IPR_VOLINCR | IPR_VOLDECR | IPR_MUTE)
-#define IRQTYPE_VOICE          (IPR_CHANNELLOOP | IPR_CHANNELNUMBERMASK)
-#define IRQTYPE_RECORD         (IPR_ADCBUFFULL | IPR_ADCBUFHALFFULL | IPR_MICBUFFULL | IPR_MICBUFHALFFULL | IPR_EFXBUFFULL | IPR_EFXBUFHALFFULL)
-#define IRQTYPE_MPUOUT         (IPR_MIDITRANSBUFEMPTY | A_IPR_MIDITRANSBUFEMPTY2) 
-#define IRQTYPE_MPUIN          (IPR_MIDIRECVBUFEMPTY | A_IPR_MIDIRECVBUFEMPTY2)
-#define IRQTYPE_TIMER          IPR_INTERVALTIMER
-#define IRQTYPE_SPDIF          (IPR_GPSPDIFSTATUSCHANGE | IPR_CDROMSTATUSCHANGE)
-#define IRQTYPE_DSP            IPR_FXDSP
-
-void emu10k1_timer_irqhandler(struct emu10k1_card *);
-void emu10k1_dsp_irqhandler(struct emu10k1_card *);
-void emu10k1_mute_irqhandler(struct emu10k1_card *);
-void emu10k1_volincr_irqhandler(struct emu10k1_card *);
-void emu10k1_voldecr_irqhandler(struct emu10k1_card *);
-
-#endif /* _IRQ_H */
diff --git a/sound/oss/emu10k1/main.c b/sound/oss/emu10k1/main.c
deleted file mode 100644 (file)
index 5058411..0000000
+++ /dev/null
@@ -1,1471 +0,0 @@
- /*
- **********************************************************************
- *     main.c - Creative EMU10K1 audio driver
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *     November 2, 1999     Alan Cox        cleaned up stuff
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- *
- *      Supported devices:
- *      /dev/dsp:        Standard /dev/dsp device, OSS-compatible
- *      /dev/dsp1:       Routes to rear speakers only   
- *      /dev/mixer:      Standard /dev/mixer device, OSS-compatible
- *      /dev/midi:       Raw MIDI UART device, mostly OSS-compatible
- *     /dev/sequencer:  Sequencer Interface (requires sound.o)
- *
- *      Revision history:
- *      0.1 beta Initial release
- *      0.2 Lowered initial mixer vol. Improved on stuttering wave playback. Added MIDI UART support.
- *      0.3 Fixed mixer routing bug, added APS, joystick support.
- *      0.4 Added rear-channel, SPDIF support.
- *     0.5 Source cleanup, SMP fixes, multiopen support, 64 bit arch fixes,
- *         moved bh's to tasklets, moved to the new PCI driver initialization style.
- *     0.6 Make use of pci_alloc_consistent, improve compatibility layer for 2.2 kernels,
- *         code reorganization and cleanup.
- *     0.7 Support for the Emu-APS. Bug fixes for voice cache setup, mmaped sound + poll().
- *          Support for setting external TRAM size.
- *      0.8 Make use of the kernel ac97 interface. Support for a dsp patch manager.
- *      0.9 Re-enables rear speakers volume controls
- *     0.10 Initializes rear speaker volume.
- *         Dynamic patch storage allocation.
- *         New private ioctls to change control gpr values.
- *         Enable volume control interrupts.
- *         By default enable dsp routes to digital out. 
- *     0.11 Fixed fx / 4 problem.
- *     0.12 Implemented mmaped for recording.
- *         Fixed bug: not unreserving mmaped buffer pages.
- *         IRQ handler cleanup.
- *     0.13 Fixed problem with dsp1
- *          Simplified dsp patch writing (inside the driver)
- *         Fixed several bugs found by the Stanford tools
- *     0.14 New control gpr to oss mixer mapping feature (Chris Purnell)
- *          Added AC3 Passthrough Support (Juha Yrjola)
- *          Added Support for 5.1 cards (digital out and the third analog out)
- *     0.15 Added Sequencer Support (Daniel Mack)
- *          Support for multichannel pcm playback (Eduard Hasenleithner)
- *     0.16 Mixer improvements, added old treble/bass support (Daniel Bertrand)
- *          Small code format cleanup.
- *          Deadlock bug fix for emu10k1_volxxx_irqhandler().
- *     0.17 Fix for mixer SOUND_MIXER_INFO ioctl.
- *         Fix for HIGHMEM machines (emu10k1 can only do 31 bit bus master) 
- *         midi poll initial implementation.
- *         Small mixer fixes/cleanups.
- *         Improved support for 5.1 cards.
- *     0.18 Fix for possible leak in pci_alloc_consistent()
- *          Cleaned up poll() functions (audio and midi). Don't start input.
- *         Restrict DMA pages used to 512Mib range.
- *         New AC97_BOOST mixer ioctl.
- *    0.19a Added Support for Audigy Cards
- *         Real fix for kernel with highmem support (cast dma_handle to u32).
- *         Fix recording buffering parameters calculation.
- *         Use unsigned long for variables in bit ops.
- *    0.20a Fixed recording startup
- *         Fixed timer rate setting (it's a 16-bit register)
- *     0.21 Converted code to use pci_name() instead of accessing slot_name
- *         directly (Eugene Teo)
- *********************************************************************/
-
-/* These are only included once per module */
-#include <linux/module.h>
-#include <linux/slab.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/proc_fs.h>
-#include <linux/dma-mapping.h>
-
-#include "hwaccess.h"
-#include "8010.h"
-#include "efxmgr.h"
-#include "cardwo.h"
-#include "cardwi.h"
-#include "cardmo.h"
-#include "cardmi.h"
-#include "recmgr.h"
-#include "ecard.h"
-
-
-#ifdef EMU10K1_SEQUENCER
-#define MIDI_SYNTH_NAME "EMU10K1 MIDI"
-#define MIDI_SYNTH_CAPS SYNTH_CAP_INPUT
-#include "../sound_config.h"
-#include "../midi_synth.h"
-
-/* this should be in dev_table.h */
-#define SNDCARD_EMU10K1 46
-#endif
-
-/* the emu10k1 _seems_ to only supports 29 bit (512MiB) bit bus master */
-#define EMU10K1_DMA_MASK DMA_29BIT_MASK        /* DMA buffer mask for pci_alloc_consist */
-
-#ifndef PCI_VENDOR_ID_CREATIVE
-#define PCI_VENDOR_ID_CREATIVE 0x1102
-#endif
-
-#ifndef PCI_DEVICE_ID_CREATIVE_EMU10K1
-#define PCI_DEVICE_ID_CREATIVE_EMU10K1 0x0002
-#endif
-#ifndef PCI_DEVICE_ID_CREATIVE_AUDIGY
-#define PCI_DEVICE_ID_CREATIVE_AUDIGY 0x0004
-#endif
-
-#define EMU_APS_SUBID  0x40011102
-enum {
-       EMU10K1 = 0,
-       AUDIGY,
-};
-
-static char *card_names[] __devinitdata = {
-       "EMU10K1",
-       "Audigy",
-};
-
-static struct pci_device_id emu10k1_pci_tbl[] = {
-       {PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_EMU10K1,
-        PCI_ANY_ID, PCI_ANY_ID, 0, 0, EMU10K1},
-       {PCI_VENDOR_ID_CREATIVE, PCI_DEVICE_ID_CREATIVE_AUDIGY,
-        PCI_ANY_ID, PCI_ANY_ID, 0, 0, AUDIGY},
-       {0,}
-};
-
-MODULE_DEVICE_TABLE(pci, emu10k1_pci_tbl);
-
-/* Global var instantiation */
-
-LIST_HEAD(emu10k1_devs);
-
-extern struct file_operations emu10k1_audio_fops;
-extern struct file_operations emu10k1_mixer_fops;
-extern struct file_operations emu10k1_midi_fops;
-
-#ifdef EMU10K1_SEQUENCER
-static struct midi_operations emu10k1_midi_operations;
-#endif
-
-extern irqreturn_t emu10k1_interrupt(int, void *);
-
-static int __devinit emu10k1_audio_init(struct emu10k1_card *card)
-{
-       /* Assign default playback voice parameters */
-       if (card->is_audigy)
-               card->mchannel_fx = 0;
-       else
-               card->mchannel_fx = 8;
-
-
-       if (card->is_audigy) {
-               /* mono voice */
-               card->waveout.send_dcba[SEND_MONO] = 0xffffffff;
-               card->waveout.send_hgfe[SEND_MONO] = 0x0000ffff;
-       
-               /* stereo voice */
-               /* left */
-               card->waveout.send_dcba[SEND_LEFT] = 0x00ff00ff;
-               card->waveout.send_hgfe[SEND_LEFT] = 0x00007f7f;        
-               /* right */
-               card->waveout.send_dcba[SEND_RIGHT] = 0xff00ff00;
-               card->waveout.send_hgfe[SEND_RIGHT] = 0x00007f7f;
-
-               card->waveout.send_routing[ROUTE_PCM] = 0x03020100; // Regular pcm
-               card->waveout.send_routing2[ROUTE_PCM] = 0x07060504;
-
-               card->waveout.send_routing[ROUTE_PT] = 0x3f3f3d3c; // Passthrough
-               card->waveout.send_routing2[ROUTE_PT] = 0x3f3f3f3f;
-               
-               card->waveout.send_routing[ROUTE_PCM1] = 0x03020100; // Spare
-               card->waveout.send_routing2[ROUTE_PCM1] = 0x07060404;
-               
-       } else {
-               /* mono voice */
-               card->waveout.send_dcba[SEND_MONO] = 0x0000ffff;
-       
-               /* stereo voice */
-               /* left */
-               card->waveout.send_dcba[SEND_LEFT] = 0x000000ff;
-               /* right */
-               card->waveout.send_dcba[SEND_RIGHT] = 0x0000ff00;
-
-               card->waveout.send_routing[ROUTE_PCM] = 0x3210; // pcm
-               card->waveout.send_routing[ROUTE_PT] = 0x3210; // passthrough
-               card->waveout.send_routing[ROUTE_PCM1] = 0x7654; // /dev/dsp1
-       }
-
-       /* Assign default recording parameters */
-       /* FIXME */
-       if (card->is_aps)
-               card->wavein.recsrc = WAVERECORD_FX;
-       else
-               card->wavein.recsrc = WAVERECORD_AC97;
-
-       card->wavein.fxwc = 0x0003;
-       return 0;
-}
-
-static void emu10k1_audio_cleanup(struct emu10k1_card *card)
-{
-}
-
-static int __devinit emu10k1_register_devices(struct emu10k1_card *card)
-{
-       card->audio_dev = register_sound_dsp(&emu10k1_audio_fops, -1);
-       if (card->audio_dev < 0) {
-               printk(KERN_ERR "emu10k1: cannot register first audio device!\n");
-               goto err_dev;
-       }
-
-       card->audio_dev1 = register_sound_dsp(&emu10k1_audio_fops, -1);
-       if (card->audio_dev1 < 0) {
-               printk(KERN_ERR "emu10k1: cannot register second audio device!\n");
-               goto err_dev1;
-       }
-
-       card->ac97->dev_mixer = register_sound_mixer(&emu10k1_mixer_fops, -1);
-       if (card->ac97->dev_mixer < 0) {
-               printk(KERN_ERR "emu10k1: cannot register mixer device\n");
-               goto err_mixer;
-        }
-
-       card->midi_dev = register_sound_midi(&emu10k1_midi_fops, -1);
-       if (card->midi_dev < 0) {
-                printk(KERN_ERR "emu10k1: cannot register midi device!\n");
-               goto err_midi;
-        }
-
-#ifdef EMU10K1_SEQUENCER
-       card->seq_dev = sound_alloc_mididev();
-       if (card->seq_dev == -1)
-               printk(KERN_WARNING "emu10k1: unable to register sequencer device!");
-       else {
-               std_midi_synth.midi_dev = card->seq_dev;
-               midi_devs[card->seq_dev] = 
-                       (struct midi_operations *)
-                       kmalloc(sizeof(struct midi_operations), GFP_KERNEL);
-
-               if (midi_devs[card->seq_dev] == NULL) {
-                       printk(KERN_ERR "emu10k1: unable to allocate memory!");
-                       sound_unload_mididev(card->seq_dev);
-                       card->seq_dev = -1;
-                       /* return without error */
-               } else {
-                       memcpy((char *)midi_devs[card->seq_dev], 
-                               (char *)&emu10k1_midi_operations, 
-                               sizeof(struct midi_operations));
-                       midi_devs[card->seq_dev]->devc = card;
-                       sequencer_init();
-                       card->seq_mididev = NULL;
-               }
-       }
-#endif
-       return 0;
-
-err_midi:
-       unregister_sound_mixer(card->ac97->dev_mixer);
-err_mixer:
-       unregister_sound_dsp(card->audio_dev);
-err_dev1:
-       unregister_sound_dsp(card->audio_dev);
-err_dev:
-       return -ENODEV;
-}
-
-static void emu10k1_unregister_devices(struct emu10k1_card *card)
-{
-#ifdef EMU10K1_SEQUENCER
-       if (card->seq_dev > -1) {
-               kfree(midi_devs[card->seq_dev]);
-               midi_devs[card->seq_dev] = NULL;
-               sound_unload_mididev(card->seq_dev);
-               card->seq_dev = -1;
-       }
-#endif
-
-       unregister_sound_midi(card->midi_dev);
-       unregister_sound_mixer(card->ac97->dev_mixer);
-       unregister_sound_dsp(card->audio_dev1);
-       unregister_sound_dsp(card->audio_dev);
-}
-
-static int emu10k1_info_proc (char *page, char **start, off_t off,
-                             int count, int *eof, void *data)
-{
-       struct emu10k1_card *card = data;
-       int len = 0;
-       
-       if (card == NULL)
-               return -ENODEV;
-
-       len += sprintf (page + len, "Driver Version : %s\n", DRIVER_VERSION);
-       len += sprintf (page + len, "Card type      : %s\n", card->is_aps ? "Aps" : (card->is_audigy ? "Audigy" : "Emu10k1"));
-       len += sprintf (page + len, "Revision       : %d\n", card->chiprev);
-       len += sprintf (page + len, "Model          : %#06x\n", card->model);
-       len += sprintf (page + len, "IO             : %#06lx-%#06lx\n", card->iobase, card->iobase + card->length - 1);
-       len += sprintf (page + len, "IRQ            : %d\n\n", card->irq);
-       
-       len += sprintf (page + len, "Registered /dev Entries:\n");
-       len += sprintf (page + len, "/dev/dsp%d\n", card->audio_dev / 16);
-       len += sprintf (page + len, "/dev/dsp%d\n", card->audio_dev1 / 16);
-       len += sprintf (page + len, "/dev/mixer%d\n", card->ac97->dev_mixer / 16);
-       len += sprintf (page + len, "/dev/midi%d\n", card->midi_dev / 16);
-
-#ifdef EMU10K1_SEQUENCER
-       len += sprintf (page + len, "/dev/sequencer\n");
-#endif
-
-       return len;
-}
-
-static int __devinit emu10k1_proc_init(struct emu10k1_card *card)
-{
-       char s[48];
-
-       if (!proc_mkdir ("driver/emu10k1", NULL)) {
-               printk(KERN_ERR "emu10k1: unable to create proc directory driver/emu10k1\n");
-               goto err_out;
-       }
-
-       sprintf(s, "driver/emu10k1/%s", pci_name(card->pci_dev));
-       if (!proc_mkdir (s, NULL)) {
-               printk(KERN_ERR "emu10k1: unable to create proc directory %s\n", s);
-               goto err_emu10k1_proc;
-       }
-
-       sprintf(s, "driver/emu10k1/%s/info", pci_name(card->pci_dev));
-       if (!create_proc_read_entry (s, 0, NULL, emu10k1_info_proc, card)) {
-               printk(KERN_ERR "emu10k1: unable to create proc entry %s\n", s);
-               goto err_dev_proc;
-       }
-
-       if (!card->is_aps) {
-               sprintf(s, "driver/emu10k1/%s/ac97", pci_name(card->pci_dev));
-               if (!create_proc_read_entry (s, 0, NULL, ac97_read_proc, card->ac97)) {
-                       printk(KERN_ERR "emu10k1: unable to create proc entry %s\n", s);
-                       goto err_proc_ac97;
-               }
-       }
-
-       return 0;
-
-err_proc_ac97:
-       sprintf(s, "driver/emu10k1/%s/info", pci_name(card->pci_dev));
-       remove_proc_entry(s, NULL);
-
-err_dev_proc:
-       sprintf(s, "driver/emu10k1/%s", pci_name(card->pci_dev));
-       remove_proc_entry(s, NULL);
-
-err_emu10k1_proc:
-       remove_proc_entry("driver/emu10k1", NULL);
-
-err_out:
-       return -EIO;
-}
-
-static void emu10k1_proc_cleanup(struct emu10k1_card *card)
-{
-       char s[48];
-
-       if (!card->is_aps) {
-               sprintf(s, "driver/emu10k1/%s/ac97", pci_name(card->pci_dev));
-               remove_proc_entry(s, NULL);
-       }
-
-       sprintf(s, "driver/emu10k1/%s/info", pci_name(card->pci_dev));
-       remove_proc_entry(s, NULL);
-
-       sprintf(s, "driver/emu10k1/%s", pci_name(card->pci_dev));
-       remove_proc_entry(s, NULL);
-               
-       remove_proc_entry("driver/emu10k1", NULL);
-}
-
-static int __devinit emu10k1_mixer_init(struct emu10k1_card *card)
-{
-       struct ac97_codec *codec  = ac97_alloc_codec();
-       
-       if(codec == NULL)
-       {
-               printk(KERN_ERR "emu10k1: cannot allocate mixer\n");
-               return -EIO;
-       }
-       card->ac97 = codec;
-       card->ac97->private_data = card;
-
-       if (!card->is_aps) {
-               card->ac97->id = 0;
-               card->ac97->codec_read = emu10k1_ac97_read;
-               card->ac97->codec_write = emu10k1_ac97_write;
-
-               if (ac97_probe_codec (card->ac97) == 0) {
-                       printk(KERN_ERR "emu10k1: unable to probe AC97 codec\n");
-                       goto err_out;
-               }
-               /* 5.1: Enable the additional AC97 Slots and unmute extra channels on AC97 codec */
-               if (codec->codec_read(codec, AC97_EXTENDED_ID) & 0x0080){
-                       printk(KERN_INFO "emu10k1: SBLive! 5.1 card detected\n"); 
-                       sblive_writeptr(card, AC97SLOT, 0, AC97SLOT_CNTR | AC97SLOT_LFE);
-                       codec->codec_write(codec, AC97_SURROUND_MASTER, 0x0);
-               }
-
-               // Force 5bit:              
-               //card->ac97->bit_resolution=5;
-
-               /* these will store the original values and never be modified */
-               card->ac97_supported_mixers = card->ac97->supported_mixers;
-               card->ac97_stereo_mixers = card->ac97->stereo_mixers;
-       }
-
-       return 0;
-
- err_out:
-       ac97_release_codec(card->ac97);
-       return -EIO;
-}
-
-static void emu10k1_mixer_cleanup(struct emu10k1_card *card)
-{
-       ac97_release_codec(card->ac97);
-}
-
-static int __devinit emu10k1_midi_init(struct emu10k1_card *card)
-{
-       int ret;
-
-       card->mpuout = kzalloc(sizeof(struct emu10k1_mpuout), GFP_KERNEL);
-       if (card->mpuout == NULL) {
-               printk(KERN_WARNING "emu10k1: Unable to allocate emu10k1_mpuout: out of memory\n");
-               ret = -ENOMEM;
-               goto err_out1;
-       }
-
-       card->mpuout->intr = 1;
-       card->mpuout->status = FLAGS_AVAILABLE;
-       card->mpuout->state = CARDMIDIOUT_STATE_DEFAULT;
-
-       tasklet_init(&card->mpuout->tasklet, emu10k1_mpuout_bh, (unsigned long) card);
-
-       spin_lock_init(&card->mpuout->lock);
-
-       card->mpuin = kzalloc(sizeof(struct emu10k1_mpuin), GFP_KERNEL);
-       if (card->mpuin == NULL) {
-               printk(KERN_WARNING "emu10k1: Unable to allocate emu10k1_mpuin: out of memory\n");
-               ret = -ENOMEM;
-                goto err_out2;
-       }
-
-       card->mpuin->status = FLAGS_AVAILABLE;
-
-       tasklet_init(&card->mpuin->tasklet, emu10k1_mpuin_bh, (unsigned long) card->mpuin);
-
-       spin_lock_init(&card->mpuin->lock);
-
-       /* Reset the MPU port */
-       if (emu10k1_mpu_reset(card) < 0) {
-               ERROR();
-               ret = -EIO;
-               goto err_out3;
-       }
-
-       return 0;
-
-err_out3:
-       kfree(card->mpuin);
-err_out2:
-       kfree(card->mpuout);
-err_out1:
-       return ret;
-}
-
-static void emu10k1_midi_cleanup(struct emu10k1_card *card)
-{
-       tasklet_kill(&card->mpuout->tasklet);
-       kfree(card->mpuout);
-
-       tasklet_kill(&card->mpuin->tasklet);
-       kfree(card->mpuin);
-}
-
-static void __devinit voice_init(struct emu10k1_card *card)
-{
-       int i;
-
-       for (i = 0; i < NUM_G; i++)
-               card->voicetable[i] = VOICE_USAGE_FREE;
-}
-
-static void __devinit timer_init(struct emu10k1_card *card)
-{
-       INIT_LIST_HEAD(&card->timers);
-       card->timer_delay = TIMER_STOPPED;
-       spin_lock_init(&card->timer_lock);
-}
-
-static void __devinit addxmgr_init(struct emu10k1_card *card)
-{
-       u32 count;
-
-       for (count = 0; count < MAXPAGES; count++)
-               card->emupagetable[count] = 0;
-
-       /* Mark first page as used */
-       /* This page is reserved by the driver */
-       card->emupagetable[0] = 0x8001;
-       card->emupagetable[1] = MAXPAGES - 1;
-}
-
-static void fx_cleanup(struct patch_manager *mgr)
-{
-       int i;
-       for(i = 0; i < mgr->current_pages; i++)
-               free_page((unsigned long) mgr->patch[i]);
-}
-
-static int __devinit fx_init(struct emu10k1_card *card)
-{
-       struct patch_manager *mgr = &card->mgr;
-       struct dsp_patch *patch;
-       struct dsp_rpatch *rpatch;
-       s32 left, right;
-       int i;
-       u32 pc = 0;
-       u32 patch_n=0;
-       struct emu_efx_info_t emu_efx_info[2]=
-               {{ 20, 10, 0x400, 0x100, 0x20 },
-                { 24, 12, 0x600, 0x400, 0x60 },
-               }; 
-                       
-
-       for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
-               mgr->ctrl_gpr[i][0] = -1;
-               mgr->ctrl_gpr[i][1] = -1;
-       }
-
-
-       if (card->is_audigy)
-               mgr->current_pages = (2 + PATCHES_PER_PAGE - 1) / PATCHES_PER_PAGE;
-       else
-               /* !! The number below must equal the number of patches, currently 11 !! */
-               mgr->current_pages = (11 + PATCHES_PER_PAGE - 1) / PATCHES_PER_PAGE;
-       
-       for (i = 0; i < mgr->current_pages; i++) {
-               mgr->patch[i] = (void *)__get_free_page(GFP_KERNEL);
-               if (mgr->patch[i] == NULL) {
-                       mgr->current_pages = i;
-                       fx_cleanup(mgr);
-                       return -ENOMEM;
-               }
-               memset(mgr->patch[i], 0, PAGE_SIZE);
-       }
-
-       if (card->is_audigy) {
-               for (i = 0; i < 1024; i++)
-                       OP(0xf, 0x0c0, 0x0c0, 0x0cf, 0x0c0);
-
-               for (i = 0; i < 512 ; i++)
-                       sblive_writeptr(card, A_GPR_BASE+i,0,0);
-
-               pc=0;
-
-               //Pcm input volume
-               OP(0, 0x402, 0x0c0, 0x406, 0x000);
-               OP(0, 0x403, 0x0c0, 0x407, 0x001);
-
-               //CD-Digital input Volume
-               OP(0, 0x404, 0x0c0, 0x40d, 0x42);
-               OP(0, 0x405, 0x0c0, 0x40f, 0x43);
-
-               // CD + PCM 
-               OP(6, 0x400, 0x0c0, 0x402, 0x404);
-               OP(6, 0x401, 0x0c0, 0x403, 0x405);
-               
-               // Front Output + Master Volume
-               OP(0, 0x68, 0x0c0, 0x408, 0x400);
-               OP(0, 0x69, 0x0c0, 0x409, 0x401);
-
-               // Add-in analog inputs for other speakers
-               OP(6, 0x400, 0x40, 0x400, 0xc0);
-               OP(6, 0x401, 0x41, 0x401, 0xc0);
-
-               // Digital Front + Master Volume
-               OP(0, 0x60, 0x0c0, 0x408, 0x400);
-               OP(0, 0x61, 0x0c0, 0x409, 0x401);
-
-               // Rear Output + Rear Volume
-               OP(0, 0x06e, 0x0c0, 0x419, 0x400);
-               OP(0, 0x06f, 0x0c0, 0x41a, 0x401);              
-
-               // Digital Rear Output + Rear Volume
-               OP(0, 0x066, 0x0c0, 0x419, 0x400);
-               OP(0, 0x067, 0x0c0, 0x41a, 0x401);              
-
-               // Audigy Drive, Headphone out
-               OP(6, 0x64, 0x0c0, 0x0c0, 0x400);
-               OP(6, 0x65, 0x0c0, 0x0c0, 0x401);
-
-               // ac97 Recording
-               OP(6, 0x76, 0x0c0, 0x0c0, 0x40);
-               OP(6, 0x77, 0x0c0, 0x0c0, 0x41);
-               
-               // Center = sub = Left/2 + Right/2
-               OP(0xe, 0x400, 0x401, 0xcd, 0x400);
-
-               // center/sub  Volume (master)
-               OP(0, 0x06a, 0x0c0, 0x408, 0x400);
-               OP(0, 0x06b, 0x0c0, 0x409, 0x400);
-
-               // Digital center/sub  Volume (master)
-               OP(0, 0x062, 0x0c0, 0x408, 0x400);
-               OP(0, 0x063, 0x0c0, 0x409, 0x400);
-
-               ROUTING_PATCH_START(rpatch, "Routing");
-               ROUTING_PATCH_END(rpatch);
-
-               /* delimiter patch */
-               patch = PATCH(mgr, patch_n);
-               patch->code_size = 0;
-
-       
-               sblive_writeptr(card, 0x53, 0, 0);
-       } else {
-               for (i = 0; i < 512 ; i++)
-                       OP(6, 0x40, 0x40, 0x40, 0x40);
-
-               for (i = 0; i < 256; i++)
-                       sblive_writeptr_tag(card, 0,
-                                           FXGPREGBASE + i, 0,
-                                           TANKMEMADDRREGBASE + i, 0,
-                                           TAGLIST_END);
-
-               
-               pc = 0;
-
-               //first free GPR = 0x11b
-       
-               
-               /* FX volume correction and Volume control*/
-               INPUT_PATCH_START(patch, "Pcm L vol", 0x0, 0);
-               GET_OUTPUT_GPR(patch, 0x100, 0x0);
-               GET_CONTROL_GPR(patch, 0x106, "Vol", 0, 0x7fffffff);
-               GET_DYNAMIC_GPR(patch, 0x112);
-
-               OP(4, 0x112, 0x40, PCM_IN_L, 0x44); //*4        
-               OP(0, 0x100, 0x040, 0x112, 0x106);  //*vol      
-               INPUT_PATCH_END(patch);
-
-
-               INPUT_PATCH_START(patch, "Pcm R vol", 0x1, 0);
-               GET_OUTPUT_GPR(patch, 0x101, 0x1);
-               GET_CONTROL_GPR(patch, 0x107, "Vol", 0, 0x7fffffff);
-               GET_DYNAMIC_GPR(patch, 0x112);
-
-               OP(4, 0x112, 0x40, PCM_IN_R, 0x44); 
-               OP(0, 0x101, 0x040, 0x112, 0x107);
-
-               INPUT_PATCH_END(patch);
-
-
-               // CD-Digital In Volume control 
-               INPUT_PATCH_START(patch, "CD-Digital Vol L", 0x12, 0);
-               GET_OUTPUT_GPR(patch, 0x10c, 0x12);
-               GET_CONTROL_GPR(patch, 0x10d, "Vol", 0, 0x7fffffff);
-
-               OP(0, 0x10c, 0x040, SPDIF_CD_L, 0x10d);
-               INPUT_PATCH_END(patch);
-
-               INPUT_PATCH_START(patch, "CD-Digital Vol R", 0x13, 0);
-               GET_OUTPUT_GPR(patch, 0x10e, 0x13);
-               GET_CONTROL_GPR(patch, 0x10f, "Vol", 0, 0x7fffffff);
-
-               OP(0, 0x10e, 0x040, SPDIF_CD_R, 0x10f);
-               INPUT_PATCH_END(patch);
-
-               //Volume Correction for Multi-channel Inputs    
-               INPUT_PATCH_START(patch, "Multi-Channel Gain", 0x08, 0);
-               patch->input=patch->output=0x3F00;
-
-               GET_OUTPUT_GPR(patch, 0x113, MULTI_FRONT_L);
-               GET_OUTPUT_GPR(patch, 0x114, MULTI_FRONT_R);
-               GET_OUTPUT_GPR(patch, 0x115, MULTI_REAR_L);
-               GET_OUTPUT_GPR(patch, 0x116, MULTI_REAR_R);
-               GET_OUTPUT_GPR(patch, 0x117, MULTI_CENTER);
-               GET_OUTPUT_GPR(patch, 0x118, MULTI_LFE);
-
-               OP(4, 0x113, 0x40, MULTI_FRONT_L, 0x44);
-               OP(4, 0x114, 0x40, MULTI_FRONT_R, 0x44);
-               OP(4, 0x115, 0x40, MULTI_REAR_L, 0x44);
-               OP(4, 0x116, 0x40, MULTI_REAR_R, 0x44);
-               OP(4, 0x117, 0x40, MULTI_CENTER, 0x44);
-               OP(4, 0x118, 0x40, MULTI_LFE, 0x44);
-       
-               INPUT_PATCH_END(patch);
-
-
-               //Routing patch start   
-               ROUTING_PATCH_START(rpatch, "Routing");
-               GET_INPUT_GPR(rpatch, 0x100, 0x0);
-               GET_INPUT_GPR(rpatch, 0x101, 0x1);
-               GET_INPUT_GPR(rpatch, 0x10c, 0x12);
-               GET_INPUT_GPR(rpatch, 0x10e, 0x13);
-               GET_INPUT_GPR(rpatch, 0x113, MULTI_FRONT_L);
-               GET_INPUT_GPR(rpatch, 0x114, MULTI_FRONT_R);
-               GET_INPUT_GPR(rpatch, 0x115, MULTI_REAR_L);
-               GET_INPUT_GPR(rpatch, 0x116, MULTI_REAR_R);
-               GET_INPUT_GPR(rpatch, 0x117, MULTI_CENTER);
-               GET_INPUT_GPR(rpatch, 0x118, MULTI_LFE);
-
-               GET_DYNAMIC_GPR(rpatch, 0x102);
-               GET_DYNAMIC_GPR(rpatch, 0x103);
-
-               GET_OUTPUT_GPR(rpatch, 0x104, 0x8);
-               GET_OUTPUT_GPR(rpatch, 0x105, 0x9);
-               GET_OUTPUT_GPR(rpatch, 0x10a, 0x2);
-               GET_OUTPUT_GPR(rpatch, 0x10b, 0x3);
-               
-               
-               /* input buffer */
-               OP(6, 0x102, AC97_IN_L, 0x40, 0x40);
-               OP(6, 0x103, AC97_IN_R, 0x40, 0x40);
-
-
-               /* Digital In + PCM + MULTI_FRONT-> AC97 out (front speakers)*/
-               OP(6, AC97_FRONT_L, 0x100, 0x10c, 0x113);
-
-               CONNECT(MULTI_FRONT_L, AC97_FRONT_L);
-               CONNECT(PCM_IN_L, AC97_FRONT_L);
-               CONNECT(SPDIF_CD_L, AC97_FRONT_L);
-
-               OP(6, AC97_FRONT_R, 0x101, 0x10e, 0x114);
-
-               CONNECT(MULTI_FRONT_R, AC97_FRONT_R);
-               CONNECT(PCM_IN_R, AC97_FRONT_R);
-               CONNECT(SPDIF_CD_R, AC97_FRONT_R);
-
-               /* Digital In + PCM + AC97 In + PCM1 + MULTI_REAR --> Rear Channel */ 
-               OP(6, 0x104, PCM1_IN_L, 0x100, 0x115);
-               OP(6, 0x104, 0x104, 0x10c, 0x102);
-
-               CONNECT(MULTI_REAR_L, ANALOG_REAR_L);
-               CONNECT(AC97_IN_L, ANALOG_REAR_L);
-               CONNECT(PCM_IN_L, ANALOG_REAR_L);
-               CONNECT(SPDIF_CD_L, ANALOG_REAR_L);
-               CONNECT(PCM1_IN_L, ANALOG_REAR_L);
-
-               OP(6, 0x105, PCM1_IN_R, 0x101, 0x116);
-               OP(6, 0x105, 0x105, 0x10e, 0x103);
-
-               CONNECT(MULTI_REAR_R, ANALOG_REAR_R);
-               CONNECT(AC97_IN_R, ANALOG_REAR_R);
-               CONNECT(PCM_IN_R, ANALOG_REAR_R);
-               CONNECT(SPDIF_CD_R, ANALOG_REAR_R);
-               CONNECT(PCM1_IN_R, ANALOG_REAR_R);
-
-               /* Digital In + PCM + AC97 In + MULTI_FRONT --> Digital out */
-               OP(6, 0x10b, 0x100, 0x102, 0x10c);
-               OP(6, 0x10b, 0x10b, 0x113, 0x40);
-
-               CONNECT(MULTI_FRONT_L, DIGITAL_OUT_L);
-               CONNECT(PCM_IN_L, DIGITAL_OUT_L);
-               CONNECT(AC97_IN_L, DIGITAL_OUT_L);
-               CONNECT(SPDIF_CD_L, DIGITAL_OUT_L);
-
-               OP(6, 0x10a, 0x101, 0x103, 0x10e);
-               OP(6, 0x10b, 0x10b, 0x114, 0x40);
-
-               CONNECT(MULTI_FRONT_R, DIGITAL_OUT_R);
-               CONNECT(PCM_IN_R, DIGITAL_OUT_R);
-               CONNECT(AC97_IN_R, DIGITAL_OUT_R);
-               CONNECT(SPDIF_CD_R, DIGITAL_OUT_R);
-
-               /* AC97 In --> ADC Recording Buffer */
-               OP(6, ADC_REC_L, 0x102, 0x40, 0x40);
-
-               CONNECT(AC97_IN_L, ADC_REC_L);
-
-               OP(6, ADC_REC_R, 0x103, 0x40, 0x40);
-
-               CONNECT(AC97_IN_R, ADC_REC_R);
-
-
-               /* fx12:Analog-Center */
-               OP(6, ANALOG_CENTER, 0x117, 0x40, 0x40);
-               CONNECT(MULTI_CENTER, ANALOG_CENTER);
-
-               /* fx11:Analog-LFE */
-               OP(6, ANALOG_LFE, 0x118, 0x40, 0x40);
-               CONNECT(MULTI_LFE, ANALOG_LFE);
-
-               /* fx12:Digital-Center */
-               OP(6, DIGITAL_CENTER, 0x117, 0x40, 0x40);
-               CONNECT(MULTI_CENTER, DIGITAL_CENTER);
-               
-               /* fx11:Analog-LFE */
-               OP(6, DIGITAL_LFE, 0x118, 0x40, 0x40);
-               CONNECT(MULTI_LFE, DIGITAL_LFE);
-       
-               ROUTING_PATCH_END(rpatch);
-
-
-               // Rear volume control  
-               OUTPUT_PATCH_START(patch, "Vol Rear L", 0x8, 0);
-               GET_INPUT_GPR(patch, 0x104, 0x8);
-               GET_CONTROL_GPR(patch, 0x119, "Vol", 0, 0x7fffffff);
-
-               OP(0, ANALOG_REAR_L, 0x040, 0x104, 0x119);
-               OUTPUT_PATCH_END(patch);
-
-               OUTPUT_PATCH_START(patch, "Vol Rear R", 0x9, 0);
-               GET_INPUT_GPR(patch, 0x105, 0x9);
-               GET_CONTROL_GPR(patch, 0x11a, "Vol", 0, 0x7fffffff);
-
-               OP(0, ANALOG_REAR_R, 0x040, 0x105, 0x11a);
-               OUTPUT_PATCH_END(patch);
-
-
-               //Master volume control on front-digital        
-               OUTPUT_PATCH_START(patch, "Vol Master L", 0x2, 1);
-               GET_INPUT_GPR(patch, 0x10a, 0x2);
-               GET_CONTROL_GPR(patch, 0x108, "Vol", 0, 0x7fffffff);
-
-               OP(0, DIGITAL_OUT_L, 0x040, 0x10a, 0x108);
-               OUTPUT_PATCH_END(patch);
-
-
-               OUTPUT_PATCH_START(patch, "Vol Master R", 0x3, 1);
-               GET_INPUT_GPR(patch, 0x10b, 0x3);
-               GET_CONTROL_GPR(patch, 0x109, "Vol", 0, 0x7fffffff);
-
-               OP(0, DIGITAL_OUT_R, 0x040, 0x10b, 0x109);
-               OUTPUT_PATCH_END(patch);
-
-
-               /* delimiter patch */
-               patch = PATCH(mgr, patch_n);
-               patch->code_size = 0;
-
-       
-               sblive_writeptr(card, DBG, 0, 0);
-       }
-
-       spin_lock_init(&mgr->lock);
-
-       // Set up Volume controls, try to keep this the same for both Audigy and Live
-
-       //Master volume
-       mgr->ctrl_gpr[SOUND_MIXER_VOLUME][0] = 8;
-       mgr->ctrl_gpr[SOUND_MIXER_VOLUME][1] = 9;
-
-       left = card->ac97->mixer_state[SOUND_MIXER_VOLUME] & 0xff;
-       right = (card->ac97->mixer_state[SOUND_MIXER_VOLUME] >> 8) & 0xff;
-
-       emu10k1_set_volume_gpr(card, 8, left, 1 << card->ac97->bit_resolution);
-       emu10k1_set_volume_gpr(card, 9, right, 1 << card->ac97->bit_resolution);
-
-       //Rear volume
-       mgr->ctrl_gpr[ SOUND_MIXER_OGAIN ][0] = 0x19;
-       mgr->ctrl_gpr[ SOUND_MIXER_OGAIN ][1] = 0x1a;
-
-       left = right = 67;
-       card->ac97->mixer_state[SOUND_MIXER_OGAIN] = (right << 8) | left;
-
-       card->ac97->supported_mixers |= SOUND_MASK_OGAIN;
-       card->ac97->stereo_mixers |= SOUND_MASK_OGAIN;
-
-       emu10k1_set_volume_gpr(card, 0x19, left, VOL_5BIT);
-       emu10k1_set_volume_gpr(card, 0x1a, right, VOL_5BIT);
-
-       //PCM Volume
-       mgr->ctrl_gpr[SOUND_MIXER_PCM][0] = 6;
-       mgr->ctrl_gpr[SOUND_MIXER_PCM][1] = 7;
-
-       left = card->ac97->mixer_state[SOUND_MIXER_PCM] & 0xff;
-       right = (card->ac97->mixer_state[SOUND_MIXER_PCM] >> 8) & 0xff;
-
-       emu10k1_set_volume_gpr(card, 6, left, VOL_5BIT);
-       emu10k1_set_volume_gpr(card, 7, right, VOL_5BIT);
-
-       //CD-Digital Volume
-       mgr->ctrl_gpr[SOUND_MIXER_DIGITAL1][0] = 0xd;
-       mgr->ctrl_gpr[SOUND_MIXER_DIGITAL1][1] = 0xf;
-
-       left = right = 67;
-       card->ac97->mixer_state[SOUND_MIXER_DIGITAL1] = (right << 8) | left; 
-
-       card->ac97->supported_mixers |= SOUND_MASK_DIGITAL1;
-       card->ac97->stereo_mixers |= SOUND_MASK_DIGITAL1;
-
-       emu10k1_set_volume_gpr(card, 0xd, left, VOL_5BIT);
-       emu10k1_set_volume_gpr(card, 0xf, right, VOL_5BIT);
-
-
-       //hard wire the ac97's pcm, pcm volume is done above using dsp code.
-       if (card->is_audigy)
-               //for Audigy, we mute it and use the philips 6 channel DAC instead
-               emu10k1_ac97_write(card->ac97, 0x18, 0x8000);
-       else
-               //For the Live we hardwire it to full volume
-               emu10k1_ac97_write(card->ac97, 0x18, 0x0);
-
-       //remove it from the ac97_codec's control
-       card->ac97_supported_mixers &= ~SOUND_MASK_PCM;
-       card->ac97_stereo_mixers &= ~SOUND_MASK_PCM;
-
-       //set Igain to 0dB by default, maybe consider hardwiring it here.
-       emu10k1_ac97_write(card->ac97, AC97_RECORD_GAIN, 0x0000);
-       card->ac97->mixer_state[SOUND_MIXER_IGAIN] = 0x101; 
-
-       return 0;
-}
-
-static int __devinit hw_init(struct emu10k1_card *card)
-{
-       int nCh;
-       u32 pagecount; /* tmp */
-       int ret;
-
-       /* Disable audio and lock cache */
-       emu10k1_writefn0(card, HCFG, HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | HCFG_MUTEBUTTONENABLE);
-
-       /* Reset recording buffers */
-       sblive_writeptr_tag(card, 0,
-                           MICBS, ADCBS_BUFSIZE_NONE,
-                           MICBA, 0,
-                           FXBS, ADCBS_BUFSIZE_NONE,
-                           FXBA, 0,
-                           ADCBS, ADCBS_BUFSIZE_NONE,
-                           ADCBA, 0,
-                           TAGLIST_END);
-
-       /* Disable channel interrupt */
-       emu10k1_writefn0(card, INTE, 0);
-       sblive_writeptr_tag(card, 0,
-                           CLIEL, 0,
-                           CLIEH, 0,
-                           SOLEL, 0,
-                           SOLEH, 0,
-                           TAGLIST_END);
-
-       if (card->is_audigy) {
-               sblive_writeptr_tag(card,0,
-                                   0x5e,0xf00,
-                                   0x5f,0x3,
-                                   TAGLIST_END);
-       }
-
-       /* Init envelope engine */
-       for (nCh = 0; nCh < NUM_G; nCh++) {
-               sblive_writeptr_tag(card, nCh,
-                                   DCYSUSV, 0,
-                                   IP, 0,
-                                   VTFT, 0xffff,
-                                   CVCF, 0xffff,
-                                   PTRX, 0,
-                                   //CPF, 0,
-                                   CCR, 0,
-
-                                   PSST, 0,
-                                   DSL, 0x10,
-                                   CCCA, 0,
-                                   Z1, 0,
-                                   Z2, 0,
-                                   FXRT, 0xd01c0000,
-
-                                   ATKHLDM, 0,
-                                   DCYSUSM, 0,
-                                   IFATN, 0xffff,
-                                   PEFE, 0,
-                                   FMMOD, 0,
-                                   TREMFRQ, 24,        /* 1 Hz */
-                                   FM2FRQ2, 24,        /* 1 Hz */
-                                   TEMPENV, 0,
-
-                                   /*** These are last so OFF prevents writing ***/
-                                   LFOVAL2, 0,
-                                   LFOVAL1, 0,
-                                   ATKHLDV, 0,
-                                   ENVVOL, 0,
-                                   ENVVAL, 0,
-                                    TAGLIST_END);
-               sblive_writeptr(card, CPF, nCh, 0);
-               /*
-                 Audigy FXRT initialization
-                 reversed eng'd, may not be accurate.
-                */
-               if (card->is_audigy) {
-                       sblive_writeptr_tag(card,nCh,
-                                           0x4c,0x0,
-                                           0x4d,0x0,
-                                           0x4e,0x0,
-                                           0x4f,0x0,
-                                           A_FXRT1, 0x3f3f3f3f,
-                                           A_FXRT2, 0x3f3f3f3f,
-                                           A_SENDAMOUNTS, 0,
-                                           TAGLIST_END);
-               }
-       }
-       
-
-       /*
-        ** Init to 0x02109204 :
-        ** Clock accuracy    = 0     (1000ppm)
-        ** Sample Rate       = 2     (48kHz)
-        ** Audio Channel     = 1     (Left of 2)
-        ** Source Number     = 0     (Unspecified)
-        ** Generation Status = 1     (Original for Cat Code 12)
-        ** Cat Code          = 12    (Digital Signal Mixer)
-        ** Mode              = 0     (Mode 0)
-        ** Emphasis          = 0     (None)
-        ** CP                = 1     (Copyright unasserted)
-        ** AN                = 0     (Digital audio)
-        ** P                 = 0     (Consumer)
-        */
-
-       sblive_writeptr_tag(card, 0,
-
-                           /* SPDIF0 */
-                           SPCS0, (SPCS_CLKACCY_1000PPM | 0x002000000 |
-                                   SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC | SPCS_GENERATIONSTATUS | 0x00001200 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT),
-
-                           /* SPDIF1 */
-                           SPCS1, (SPCS_CLKACCY_1000PPM | 0x002000000 |
-                                   SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC | SPCS_GENERATIONSTATUS | 0x00001200 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT),
-
-                           /* SPDIF2 & SPDIF3 */
-                           SPCS2, (SPCS_CLKACCY_1000PPM | 0x002000000 |
-                                   SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC | SPCS_GENERATIONSTATUS | 0x00001200 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT),
-
-                           TAGLIST_END);
-
-       if (card->is_audigy && (card->chiprev == 4)) {
-               /* Hacks for Alice3 to work independent of haP16V driver */
-               u32 tmp;
-
-               //Setup SRCMulti_I2S SamplingRate
-               tmp = sblive_readptr(card, A_SPDIF_SAMPLERATE, 0);
-               tmp &= 0xfffff1ff;
-               tmp |= (0x2<<9);
-               sblive_writeptr(card, A_SPDIF_SAMPLERATE, 0, tmp);
-
-               /* Setup SRCSel (Enable Spdif,I2S SRCMulti) */
-               emu10k1_writefn0(card, 0x20, 0x600000);
-               emu10k1_writefn0(card, 0x24, 0x14);
-
-               /* Setup SRCMulti Input Audio Enable */
-               emu10k1_writefn0(card, 0x20, 0x6E0000);
-               emu10k1_writefn0(card, 0x24, 0xFF00FF00);
-       }
-
-       ret = fx_init(card);            /* initialize effects engine */
-       if (ret < 0)
-               return ret;
-
-       card->tankmem.size = 0;
-
-       card->virtualpagetable.size = MAXPAGES * sizeof(u32);
-
-       card->virtualpagetable.addr = pci_alloc_consistent(card->pci_dev, card->virtualpagetable.size, &card->virtualpagetable.dma_handle);
-       if (card->virtualpagetable.addr == NULL) {
-               ERROR();
-               ret = -ENOMEM;
-               goto err0;
-       }
-
-       card->silentpage.size = EMUPAGESIZE;
-
-       card->silentpage.addr = pci_alloc_consistent(card->pci_dev, card->silentpage.size, &card->silentpage.dma_handle);
-       if (card->silentpage.addr == NULL) {
-               ERROR();
-               ret = -ENOMEM;
-               goto err1;
-       }
-
-       for (pagecount = 0; pagecount < MAXPAGES; pagecount++)
-               ((u32 *) card->virtualpagetable.addr)[pagecount] = cpu_to_le32(((u32) card->silentpage.dma_handle * 2) | pagecount);
-
-       /* Init page table & tank memory base register */
-       sblive_writeptr_tag(card, 0,
-                           PTB, (u32) card->virtualpagetable.dma_handle,
-                           TCB, 0,
-                           TCBS, 0,
-                           TAGLIST_END);
-
-       for (nCh = 0; nCh < NUM_G; nCh++) {
-               sblive_writeptr_tag(card, nCh,
-                                   MAPA, MAP_PTI_MASK | ((u32) card->silentpage.dma_handle * 2),
-                                   MAPB, MAP_PTI_MASK | ((u32) card->silentpage.dma_handle * 2),
-                                   TAGLIST_END);
-       }
-
-       /* Hokay, now enable the AUD bit */
-       /* Enable Audio = 1 */
-       /* Mute Disable Audio = 0 */
-       /* Lock Tank Memory = 1 */
-       /* Lock Sound Memory = 0 */
-       /* Auto Mute = 1 */
-       if (card->is_audigy) {
-               if (card->chiprev == 4)
-                       emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_AC3ENABLE_CDSPDIF | HCFG_AC3ENABLE_GPSPDIF | HCFG_AUTOMUTE | HCFG_JOYENABLE);
-               else
-                       emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_AUTOMUTE | HCFG_JOYENABLE);
-       } else {
-               if (card->model == 0x20 || card->model == 0xc400 ||
-                (card->model == 0x21 && card->chiprev < 6))
-                       emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE);
-               else
-                       emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE | HCFG_JOYENABLE);
-       }
-       /* Enable Vol_Ctrl irqs */
-       emu10k1_irq_enable(card, INTE_VOLINCRENABLE | INTE_VOLDECRENABLE | INTE_MUTEENABLE | INTE_FXDSPENABLE);
-
-       if (card->is_audigy && (card->chiprev == 4)) {
-               /* Unmute Analog now.  Set GPO6 to 1 for Apollo.
-                * This has to be done after init ALice3 I2SOut beyond 48KHz.
-                * So, sequence is important. */
-               u32 tmp = emu10k1_readfn0(card, A_IOCFG);
-               tmp |= 0x0040;
-               emu10k1_writefn0(card, A_IOCFG, tmp);
-       }
-       
-       /* FIXME: TOSLink detection */
-       card->has_toslink = 0;
-
-       /* Initialize digital passthrough variables */
-       card->pt.pos_gpr = card->pt.intr_gpr = card->pt.enable_gpr = -1;
-       card->pt.selected = 0;
-       card->pt.state = PT_STATE_INACTIVE;
-       card->pt.spcs_to_use = 0x01;
-       card->pt.patch_name = "AC3pass";
-       card->pt.intr_gpr_name = "count";
-       card->pt.enable_gpr_name = "enable";
-       card->pt.pos_gpr_name = "ptr";
-       spin_lock_init(&card->pt.lock);
-       init_waitqueue_head(&card->pt.wait);
-
-/*     tmp = sblive_readfn0(card, HCFG);
-       if (tmp & (HCFG_GPINPUT0 | HCFG_GPINPUT1)) {
-               sblive_writefn0(card, HCFG, tmp | 0x800);
-
-               udelay(512);
-
-               if (tmp != (sblive_readfn0(card, HCFG) & ~0x800)) {
-                       card->has_toslink = 1;
-                       sblive_writefn0(card, HCFG, tmp);
-               }
-       }
-*/
-       return 0;
-
-  err1:
-       pci_free_consistent(card->pci_dev, card->virtualpagetable.size, card->virtualpagetable.addr, card->virtualpagetable.dma_handle);
-  err0:
-       fx_cleanup(&card->mgr);
-
-       return ret;
-}
-
-static int __devinit emu10k1_init(struct emu10k1_card *card)
-{
-       /* Init Card */
-       if (hw_init(card) < 0)
-               return -1;
-
-       voice_init(card);
-       timer_init(card);
-       addxmgr_init(card);
-
-       DPD(2, "  hw control register -> %#x\n", emu10k1_readfn0(card, HCFG));
-
-       return 0;
-}
-
-static void emu10k1_cleanup(struct emu10k1_card *card)
-{
-       int ch;
-
-       emu10k1_writefn0(card, INTE, 0);
-
-       /** Shutdown the chip **/
-       for (ch = 0; ch < NUM_G; ch++)
-               sblive_writeptr(card, DCYSUSV, ch, 0);
-
-       for (ch = 0; ch < NUM_G; ch++) {
-               sblive_writeptr_tag(card, ch,
-                                   VTFT, 0,
-                                   CVCF, 0,
-                                   PTRX, 0,
-                                   //CPF, 0,
-                                   TAGLIST_END);
-               sblive_writeptr(card, CPF, ch, 0);
-       }
-
-       /* Disable audio and lock cache */
-       emu10k1_writefn0(card, HCFG, HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | HCFG_MUTEBUTTONENABLE);
-
-       sblive_writeptr_tag(card, 0,
-                            PTB, 0,
-
-                           /* Reset recording buffers */
-                           MICBS, ADCBS_BUFSIZE_NONE,
-                           MICBA, 0,
-                           FXBS, ADCBS_BUFSIZE_NONE,
-                           FXBA, 0,
-                           FXWC, 0,
-                           ADCBS, ADCBS_BUFSIZE_NONE,
-                           ADCBA, 0,
-                           TCBS, 0,
-                           TCB, 0,
-                           DBG, 0x8000,
-
-                           /* Disable channel interrupt */
-                           CLIEL, 0,
-                           CLIEH, 0,
-                           SOLEL, 0,
-                           SOLEH, 0,
-                           TAGLIST_END);
-
-       if (card->is_audigy)
-               sblive_writeptr(card, 0, A_DBG,  A_DBG_SINGLE_STEP);
-
-       pci_free_consistent(card->pci_dev, card->virtualpagetable.size, card->virtualpagetable.addr, card->virtualpagetable.dma_handle);
-       pci_free_consistent(card->pci_dev, card->silentpage.size, card->silentpage.addr, card->silentpage.dma_handle);
-       
-       if(card->tankmem.size != 0)
-               pci_free_consistent(card->pci_dev, card->tankmem.size, card->tankmem.addr, card->tankmem.dma_handle);
-
-       /* release patch storage memory */
-       fx_cleanup(&card->mgr);
-}
-
-/* Driver initialization routine */
-static int __devinit emu10k1_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id)
-{
-       struct emu10k1_card *card;
-       u32 subsysvid;
-       int ret;
-
-       if (pci_set_dma_mask(pci_dev, EMU10K1_DMA_MASK)) {
-               printk(KERN_ERR "emu10k1: architecture does not support 29bit PCI busmaster DMA\n");
-               return -ENODEV;
-       }
-
-       if (pci_enable_device(pci_dev))
-               return -EIO;
-
-       pci_set_master(pci_dev);
-
-       if ((card = kzalloc(sizeof(struct emu10k1_card), GFP_KERNEL)) == NULL) {
-                printk(KERN_ERR "emu10k1: out of memory\n");
-                return -ENOMEM;
-        }
-
-       card->iobase = pci_resource_start(pci_dev, 0);
-       card->length = pci_resource_len(pci_dev, 0); 
-
-       if (request_region(card->iobase, card->length, card_names[pci_id->driver_data]) == NULL) {
-               printk(KERN_ERR "emu10k1: IO space in use\n");
-               ret = -EBUSY;
-               goto err_region;
-       }
-
-       pci_set_drvdata(pci_dev, card);
-
-       card->irq = pci_dev->irq;
-       card->pci_dev = pci_dev;
-
-       /* Reserve IRQ Line */
-       if (request_irq(card->irq, emu10k1_interrupt, IRQF_SHARED, card_names[pci_id->driver_data], card)) {
-               printk(KERN_ERR "emu10k1: IRQ in use\n");
-               ret = -EBUSY;
-               goto err_irq;
-       }
-
-       card->chiprev = pci_dev->revision;
-       pci_read_config_word(pci_dev, PCI_SUBSYSTEM_ID, &card->model);
-
-       printk(KERN_INFO "emu10k1: %s rev %d model %#04x found, IO at %#04lx-%#04lx, IRQ %d\n",
-               card_names[pci_id->driver_data], card->chiprev, card->model, card->iobase,
-               card->iobase + card->length - 1, card->irq);
-
-       if (pci_id->device == PCI_DEVICE_ID_CREATIVE_AUDIGY)
-               card->is_audigy = 1;
-
-       pci_read_config_dword(pci_dev, PCI_SUBSYSTEM_VENDOR_ID, &subsysvid);
-       card->is_aps = (subsysvid == EMU_APS_SUBID);
-
-       spin_lock_init(&card->lock);
-       mutex_init(&card->open_sem);
-       card->open_mode = 0;
-       init_waitqueue_head(&card->open_wait);
-
-       ret = emu10k1_audio_init(card);
-       if (ret < 0) {
-                printk(KERN_ERR "emu10k1: cannot initialize audio devices\n");
-                goto err_audio;
-        }
-
-       ret = emu10k1_mixer_init(card);
-       if (ret < 0) {
-               printk(KERN_ERR "emu10k1: cannot initialize AC97 codec\n");
-                goto err_mixer;
-       }
-
-       ret = emu10k1_midi_init(card);
-       if (ret < 0) {
-               printk(KERN_ERR "emu10k1: cannot register midi device\n");
-               goto err_midi;
-       }
-
-       ret = emu10k1_init(card);
-       if (ret < 0) {
-               printk(KERN_ERR "emu10k1: cannot initialize device\n");
-               goto err_emu10k1_init;
-       }
-
-       if (card->is_aps)
-               emu10k1_ecard_init(card);
-
-       ret = emu10k1_register_devices(card);
-       if (ret < 0)
-               goto err_register;
-
-       /* proc entries must be created after registering devices, as
-        * emu10k1_info_proc prints card->audio_dev &co. */
-       ret = emu10k1_proc_init(card);
-       if (ret < 0) {
-               printk(KERN_ERR "emu10k1: cannot initialize proc directory\n");
-                goto err_proc;
-       }
-       
-       list_add(&card->list, &emu10k1_devs);
-
-       return 0;
-
-err_proc:
-       emu10k1_unregister_devices(card);
-
-err_register:
-       emu10k1_cleanup(card);
-       
-err_emu10k1_init:
-       emu10k1_midi_cleanup(card);
-
-err_midi:
-       emu10k1_mixer_cleanup(card);
-
-err_mixer:
-       emu10k1_audio_cleanup(card);
-
-err_audio:
-       free_irq(card->irq, card);
-
-err_irq:
-       release_region(card->iobase, card->length);
-       pci_set_drvdata(pci_dev, NULL);
-
-err_region:
-       kfree(card);
-
-       return ret;
-}
-
-static void __devexit emu10k1_remove(struct pci_dev *pci_dev)
-{
-       struct emu10k1_card *card = pci_get_drvdata(pci_dev);
-
-       list_del(&card->list);
-
-       emu10k1_unregister_devices(card);
-       emu10k1_cleanup(card);
-       emu10k1_midi_cleanup(card);
-       emu10k1_mixer_cleanup(card);
-       emu10k1_proc_cleanup(card);
-       emu10k1_audio_cleanup(card);    
-       free_irq(card->irq, card);
-       release_region(card->iobase, card->length);
-       kfree(card);
-       pci_set_drvdata(pci_dev, NULL);
-}
-
-MODULE_AUTHOR("Bertrand Lee, Cai Ying. (Email to: emu10k1-devel@lists.sourceforge.net)");
-MODULE_DESCRIPTION("Creative EMU10K1 PCI Audio Driver v" DRIVER_VERSION "\nCopyright (C) 1999 Creative Technology Ltd.");
-MODULE_LICENSE("GPL");
-
-static struct pci_driver emu10k1_pci_driver = {
-       .name           = "emu10k1",
-       .id_table       = emu10k1_pci_tbl,
-       .probe          = emu10k1_probe,
-       .remove         = __devexit_p(emu10k1_remove),
-};
-
-static int __init emu10k1_init_module(void)
-{
-       printk(KERN_INFO "Creative EMU10K1 PCI Audio Driver, version " DRIVER_VERSION ", " __TIME__ " " __DATE__ "\n");
-
-       return pci_register_driver(&emu10k1_pci_driver);
-}
-
-static void __exit emu10k1_cleanup_module(void)
-{
-       pci_unregister_driver(&emu10k1_pci_driver);
-
-       return;
-}
-
-module_init(emu10k1_init_module);
-module_exit(emu10k1_cleanup_module);
-
-#ifdef EMU10K1_SEQUENCER
-
-/* in midi.c */
-extern int emu10k1_seq_midi_open(int dev, int mode, 
-                               void (*input)(int dev, unsigned char midi_byte),
-                               void (*output)(int dev));
-extern void emu10k1_seq_midi_close(int dev);
-extern int emu10k1_seq_midi_out(int dev, unsigned char midi_byte);
-extern int emu10k1_seq_midi_start_read(int dev);
-extern int emu10k1_seq_midi_end_read(int dev);
-extern void emu10k1_seq_midi_kick(int dev);
-extern int emu10k1_seq_midi_buffer_status(int dev);
-
-static struct midi_operations emu10k1_midi_operations =
-{
-       THIS_MODULE,
-       {"EMU10K1 MIDI", 0, 0, SNDCARD_EMU10K1},
-       &std_midi_synth,
-       {0},
-       emu10k1_seq_midi_open,
-       emu10k1_seq_midi_close,
-       NULL,
-       emu10k1_seq_midi_out,
-       emu10k1_seq_midi_start_read,
-       emu10k1_seq_midi_end_read,
-       emu10k1_seq_midi_kick,
-       NULL,
-       emu10k1_seq_midi_buffer_status,
-       NULL
-};
-
-#endif
diff --git a/sound/oss/emu10k1/midi.c b/sound/oss/emu10k1/midi.c
deleted file mode 100644 (file)
index df1e990..0000000
+++ /dev/null
@@ -1,614 +0,0 @@
-/*
- **********************************************************************
- *     midi.c - /dev/midi interface for emu10k1 driver
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#include <linux/module.h>
-#include <linux/poll.h>
-#include <linux/slab.h>
-#include <linux/sched.h>
-#include <linux/smp_lock.h>
-#include <asm/uaccess.h>
-
-#include "hwaccess.h"
-#include "cardmo.h"
-#include "cardmi.h"
-#include "midi.h"
-
-#ifdef EMU10K1_SEQUENCER
-#include "../sound_config.h"
-#endif
-
-static DEFINE_SPINLOCK(midi_spinlock);
-
-static void init_midi_hdr(struct midi_hdr *midihdr)
-{
-       midihdr->bufferlength = MIDIIN_BUFLEN;
-       midihdr->bytesrecorded = 0;
-       midihdr->flags = 0;
-}
-
-static int midiin_add_buffer(struct emu10k1_mididevice *midi_dev, struct midi_hdr **midihdrptr)
-{
-       struct midi_hdr *midihdr;
-
-       if ((midihdr = kmalloc(sizeof(struct midi_hdr), GFP_KERNEL)) == NULL) {
-               ERROR();
-               return -EINVAL;
-       }
-
-       init_midi_hdr(midihdr);
-
-       midihdr->data = kmalloc(MIDIIN_BUFLEN, GFP_KERNEL);
-       if (!midihdr->data) {
-               ERROR();
-               kfree(midihdr);
-               return -1;
-       }
-
-       if (emu10k1_mpuin_add_buffer(midi_dev->card->mpuin, midihdr) < 0) {
-               ERROR();
-               kfree(midihdr->data);
-               kfree(midihdr);
-               return -1;
-       }
-
-       *midihdrptr = midihdr;
-       list_add_tail(&midihdr->list, &midi_dev->mid_hdrs);
-
-       return 0;
-}
-
-static int emu10k1_midi_open(struct inode *inode, struct file *file)
-{
-       int minor = iminor(inode);
-       struct emu10k1_card *card = NULL;
-       struct emu10k1_mididevice *midi_dev;
-       struct list_head *entry;
-
-       DPF(2, "emu10k1_midi_open()\n");
-
-       /* Check for correct device to open */
-       list_for_each(entry, &emu10k1_devs) {
-               card = list_entry(entry, struct emu10k1_card, list);
-
-               if (card->midi_dev == minor)
-                       goto match;
-       }
-
-       return -ENODEV;
-
-match:
-#ifdef EMU10K1_SEQUENCER
-       if (card->seq_mididev)  /* card is opened by sequencer */
-               return -EBUSY;
-#endif
-
-       /* Wait for device to become free */
-       mutex_lock(&card->open_sem);
-       while (card->open_mode & (file->f_mode << FMODE_MIDI_SHIFT)) {
-               if (file->f_flags & O_NONBLOCK) {
-                       mutex_unlock(&card->open_sem);
-                       return -EBUSY;
-               }
-
-               mutex_unlock(&card->open_sem);
-               interruptible_sleep_on(&card->open_wait);
-
-               if (signal_pending(current)) {
-                       return -ERESTARTSYS;
-               }
-
-               mutex_lock(&card->open_sem);
-       }
-
-       if ((midi_dev = kmalloc(sizeof(*midi_dev), GFP_KERNEL)) == NULL)
-               return -EINVAL;
-
-       midi_dev->card = card;
-       midi_dev->mistate = MIDIIN_STATE_STOPPED;
-       init_waitqueue_head(&midi_dev->oWait);
-       init_waitqueue_head(&midi_dev->iWait);
-       midi_dev->ird = 0;
-       midi_dev->iwr = 0;
-       midi_dev->icnt = 0;
-       INIT_LIST_HEAD(&midi_dev->mid_hdrs);
-
-       if (file->f_mode & FMODE_READ) {
-               struct midi_openinfo dsCardMidiOpenInfo;
-               struct midi_hdr *midihdr1;
-               struct midi_hdr *midihdr2;
-
-               dsCardMidiOpenInfo.refdata = (unsigned long) midi_dev;
-
-               if (emu10k1_mpuin_open(card, &dsCardMidiOpenInfo) < 0) {
-                       ERROR();
-                       kfree(midi_dev);
-                       return -ENODEV;
-               }
-
-               /* Add two buffers to receive sysex buffer */
-               if (midiin_add_buffer(midi_dev, &midihdr1) < 0) {
-                       kfree(midi_dev);
-                       return -ENODEV;
-               }
-
-               if (midiin_add_buffer(midi_dev, &midihdr2) < 0) {
-                       list_del(&midihdr1->list);
-                       kfree(midihdr1->data);
-                       kfree(midihdr1);
-                       kfree(midi_dev);
-                       return -ENODEV;
-               }
-       }
-
-       if (file->f_mode & FMODE_WRITE) {
-               struct midi_openinfo dsCardMidiOpenInfo;
-
-               dsCardMidiOpenInfo.refdata = (unsigned long) midi_dev;
-
-               if (emu10k1_mpuout_open(card, &dsCardMidiOpenInfo) < 0) {
-                       ERROR();
-                       kfree(midi_dev);
-                       return -ENODEV;
-               }
-       }
-
-       file->private_data = (void *) midi_dev;
-
-       card->open_mode |= (file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ | FMODE_MIDI_WRITE);
-
-       mutex_unlock(&card->open_sem);
-
-       return nonseekable_open(inode, file);
-}
-
-static int emu10k1_midi_release(struct inode *inode, struct file *file)
-{
-       struct emu10k1_mididevice *midi_dev = (struct emu10k1_mididevice *) file->private_data;
-       struct emu10k1_card *card;
-
-       lock_kernel();
-
-       card = midi_dev->card;
-       DPF(2, "emu10k1_midi_release()\n");
-
-       if (file->f_mode & FMODE_WRITE) {
-               if (!(file->f_flags & O_NONBLOCK)) {
-
-                       while (!signal_pending(current) && (card->mpuout->firstmidiq != NULL)) {
-                               DPF(4, "Cannot close - buffers not empty\n");
-
-                               interruptible_sleep_on(&midi_dev->oWait);
-
-                       }
-               }
-
-               emu10k1_mpuout_close(card);
-       }
-
-       if (file->f_mode & FMODE_READ) {
-               struct midi_hdr *midihdr;
-
-               if (midi_dev->mistate == MIDIIN_STATE_STARTED) {
-                       emu10k1_mpuin_stop(card);
-                       midi_dev->mistate = MIDIIN_STATE_STOPPED;
-               }
-
-               emu10k1_mpuin_reset(card);
-               emu10k1_mpuin_close(card);
-
-               while (!list_empty(&midi_dev->mid_hdrs)) {
-                       midihdr = list_entry(midi_dev->mid_hdrs.next, struct midi_hdr, list);
-
-                       list_del(midi_dev->mid_hdrs.next);
-                       kfree(midihdr->data);
-                       kfree(midihdr);
-               }
-       }
-
-       kfree(midi_dev);
-
-       mutex_lock(&card->open_sem);
-       card->open_mode &= ~((file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ | FMODE_MIDI_WRITE));
-       mutex_unlock(&card->open_sem);
-       wake_up_interruptible(&card->open_wait);
-
-       unlock_kernel();
-
-       return 0;
-}
-
-static ssize_t emu10k1_midi_read(struct file *file, char __user *buffer, size_t count, loff_t * pos)
-{
-       struct emu10k1_mididevice *midi_dev = (struct emu10k1_mididevice *) file->private_data;
-       ssize_t ret = 0;
-       u16 cnt;
-       unsigned long flags;
-
-       DPD(4, "emu10k1_midi_read(), count %#x\n", (u32) count);
-
-       if (!access_ok(VERIFY_WRITE, buffer, count))
-               return -EFAULT;
-
-       if (midi_dev->mistate == MIDIIN_STATE_STOPPED) {
-               if (emu10k1_mpuin_start(midi_dev->card) < 0) {
-                       ERROR();
-                       return -EINVAL;
-               }
-
-               midi_dev->mistate = MIDIIN_STATE_STARTED;
-       }
-
-       while (count > 0) {
-               cnt = MIDIIN_BUFLEN - midi_dev->ird;
-
-               spin_lock_irqsave(&midi_spinlock, flags);
-
-               if (midi_dev->icnt < cnt)
-                       cnt = midi_dev->icnt;
-
-               spin_unlock_irqrestore(&midi_spinlock, flags);
-
-               if (cnt > count)
-                       cnt = count;
-
-               if (cnt <= 0) {
-                       if (file->f_flags & O_NONBLOCK)
-                               return ret ? ret : -EAGAIN;
-                       DPF(2, " Go to sleep...\n");
-
-                       interruptible_sleep_on(&midi_dev->iWait);
-
-                       if (signal_pending(current))
-                               return ret ? ret : -ERESTARTSYS;
-
-                       continue;
-               }
-
-               if (copy_to_user(buffer, midi_dev->iBuf + midi_dev->ird, cnt)) {
-                       ERROR();
-                       return ret ? ret : -EFAULT;
-               }
-
-               midi_dev->ird += cnt;
-               midi_dev->ird %= MIDIIN_BUFLEN;
-
-               spin_lock_irqsave(&midi_spinlock, flags);
-
-               midi_dev->icnt -= cnt;
-
-               spin_unlock_irqrestore(&midi_spinlock, flags);
-
-               count -= cnt;
-               buffer += cnt;
-               ret += cnt;
-
-               if (midi_dev->icnt == 0)
-                       break;
-       }
-
-       return ret;
-}
-
-static ssize_t emu10k1_midi_write(struct file *file, const char __user *buffer, size_t count, loff_t * pos)
-{
-       struct emu10k1_mididevice *midi_dev = (struct emu10k1_mididevice *) file->private_data;
-       struct midi_hdr *midihdr;
-       unsigned long flags;
-
-       DPD(4, "emu10k1_midi_write(), count=%#x\n", (u32) count);
-
-       if (!access_ok(VERIFY_READ, buffer, count))
-               return -EFAULT;
-
-       if ((midihdr = kmalloc(sizeof(struct midi_hdr), GFP_KERNEL)) == NULL)
-               return -EINVAL;
-
-       midihdr->bufferlength = count;
-       midihdr->bytesrecorded = 0;
-       midihdr->flags = 0;
-
-       midihdr->data = kmalloc(count, GFP_KERNEL);
-       if (!midihdr->data) {
-               ERROR();
-               kfree(midihdr);
-               return -EINVAL;
-       }
-
-       if (copy_from_user(midihdr->data, buffer, count)) {
-               kfree(midihdr->data);
-               kfree(midihdr);
-               return -EFAULT;
-       }
-
-       spin_lock_irqsave(&midi_spinlock, flags);
-
-       if (emu10k1_mpuout_add_buffer(midi_dev->card, midihdr) < 0) {
-               ERROR();
-               kfree(midihdr->data);
-               kfree(midihdr);
-               spin_unlock_irqrestore(&midi_spinlock, flags);
-               return -EINVAL;
-       }
-
-       spin_unlock_irqrestore(&midi_spinlock, flags);
-
-       return count;
-}
-
-static unsigned int emu10k1_midi_poll(struct file *file, struct poll_table_struct *wait)
-{
-       struct emu10k1_mididevice *midi_dev = (struct emu10k1_mididevice *) file->private_data;
-       unsigned long flags;
-       unsigned int mask = 0;
-
-       DPF(4, "emu10k1_midi_poll() called\n");
-
-       if (file->f_mode & FMODE_WRITE)
-               poll_wait(file, &midi_dev->oWait, wait);
-
-       if (file->f_mode & FMODE_READ)
-               poll_wait(file, &midi_dev->iWait, wait);
-
-       spin_lock_irqsave(&midi_spinlock, flags);
-
-       if (file->f_mode & FMODE_WRITE)
-               mask |= POLLOUT | POLLWRNORM;
-
-       if (file->f_mode & FMODE_READ) {
-               if (midi_dev->mistate == MIDIIN_STATE_STARTED)
-                       if (midi_dev->icnt > 0)
-                               mask |= POLLIN | POLLRDNORM;
-       }
-
-       spin_unlock_irqrestore(&midi_spinlock, flags);
-
-       return mask;
-}
-
-int emu10k1_midi_callback(unsigned long msg, unsigned long refdata, unsigned long *pmsg)
-{
-       struct emu10k1_mididevice *midi_dev = (struct emu10k1_mididevice *) refdata;
-       struct midi_hdr *midihdr = NULL;
-       unsigned long flags;
-       int i;
-
-       DPF(4, "emu10k1_midi_callback()\n");
-
-       spin_lock_irqsave(&midi_spinlock, flags);
-
-       switch (msg) {
-       case ICARDMIDI_OUTLONGDATA:
-               midihdr = (struct midi_hdr *) pmsg[2];
-
-               kfree(midihdr->data);
-               kfree(midihdr);
-               wake_up_interruptible(&midi_dev->oWait);
-
-               break;
-
-       case ICARDMIDI_INLONGDATA:
-               midihdr = (struct midi_hdr *) pmsg[2];
-
-               for (i = 0; i < midihdr->bytesrecorded; i++) {
-                       midi_dev->iBuf[midi_dev->iwr++] = midihdr->data[i];
-                       midi_dev->iwr %= MIDIIN_BUFLEN;
-               }
-
-               midi_dev->icnt += midihdr->bytesrecorded;
-
-               if (midi_dev->mistate == MIDIIN_STATE_STARTED) {
-                       init_midi_hdr(midihdr);
-                       emu10k1_mpuin_add_buffer(midi_dev->card->mpuin, midihdr);
-                       wake_up_interruptible(&midi_dev->iWait);
-               }
-               break;
-
-       case ICARDMIDI_INDATA:
-               {
-                       u8 *pBuf = (u8 *) & pmsg[1];
-                       u16 bytesvalid = pmsg[2];
-
-                       for (i = 0; i < bytesvalid; i++) {
-                               midi_dev->iBuf[midi_dev->iwr++] = pBuf[i];
-                               midi_dev->iwr %= MIDIIN_BUFLEN;
-                       }
-
-                       midi_dev->icnt += bytesvalid;
-               }
-
-               wake_up_interruptible(&midi_dev->iWait);
-               break;
-
-       default:                /* Unknown message */
-               spin_unlock_irqrestore(&midi_spinlock, flags);
-               return -1;
-       }
-
-       spin_unlock_irqrestore(&midi_spinlock, flags);
-
-       return 0;
-}
-
-/* MIDI file operations */
-const struct file_operations emu10k1_midi_fops = {
-       .owner          = THIS_MODULE,
-       .read           = emu10k1_midi_read,
-       .write          = emu10k1_midi_write,
-       .poll           = emu10k1_midi_poll,
-       .open           = emu10k1_midi_open,
-       .release        = emu10k1_midi_release,
-};
-
-
-#ifdef EMU10K1_SEQUENCER
-
-/* functions used for sequencer access */
-
-int emu10k1_seq_midi_open(int dev, int mode,
-                               void (*input) (int dev, unsigned char data),
-                               void (*output) (int dev))
-{
-       struct emu10k1_card *card;
-       struct midi_openinfo dsCardMidiOpenInfo;
-       struct emu10k1_mididevice *midi_dev;
-
-       if (midi_devs[dev] == NULL || midi_devs[dev]->devc == NULL)
-               return -EINVAL;
-
-       card = midi_devs[dev]->devc;
-
-       if (card->open_mode)            /* card is opened native */
-               return -EBUSY;
-                       
-       DPF(2, "emu10k1_seq_midi_open()\n");
-       
-       if ((midi_dev = kmalloc(sizeof(*midi_dev), GFP_KERNEL)) == NULL)
-               return -EINVAL;
-
-       midi_dev->card = card;
-       midi_dev->mistate = MIDIIN_STATE_STOPPED;
-       init_waitqueue_head(&midi_dev->oWait);
-       init_waitqueue_head(&midi_dev->iWait);
-       midi_dev->ird = 0;
-       midi_dev->iwr = 0;
-       midi_dev->icnt = 0;
-       INIT_LIST_HEAD(&midi_dev->mid_hdrs);
-
-       dsCardMidiOpenInfo.refdata = (unsigned long) midi_dev;
-
-       if (emu10k1_mpuout_open(card, &dsCardMidiOpenInfo) < 0) {
-               ERROR();
-               return -ENODEV;
-       }
-
-       card->seq_mididev = midi_dev;
-               
-       return 0;
-}
-
-void emu10k1_seq_midi_close(int dev)
-{
-       struct emu10k1_card *card;
-
-       DPF(2, "emu10k1_seq_midi_close()\n");
-       if (midi_devs[dev] == NULL || midi_devs[dev]->devc == NULL)
-               return;
-
-       card = midi_devs[dev]->devc;
-       emu10k1_mpuout_close(card);
-
-       kfree(card->seq_mididev);
-       card->seq_mididev = NULL;
-}
-
-int emu10k1_seq_midi_out(int dev, unsigned char midi_byte)
-{
-       struct emu10k1_card *card;
-       struct midi_hdr *midihdr;
-       unsigned long flags;
-
-       if (midi_devs[dev] == NULL || midi_devs[dev]->devc == NULL)
-               return -EINVAL;
-
-       card = midi_devs[dev]->devc;
-
-       if ((midihdr = kmalloc(sizeof(struct midi_hdr), GFP_KERNEL)) == NULL)
-               return -EINVAL;
-
-       midihdr->bufferlength = 1;
-       midihdr->bytesrecorded = 0;
-       midihdr->flags = 0;
-
-       midihdr->data = kmalloc(1, GFP_KERNEL);
-       if (!midihdr->data) {
-               ERROR();
-               kfree(midihdr);
-               return -EINVAL;
-       }
-
-       *(midihdr->data) = midi_byte;
-       
-       spin_lock_irqsave(&midi_spinlock, flags);
-
-       if (emu10k1_mpuout_add_buffer(card, midihdr) < 0) {
-               ERROR();
-               kfree(midihdr->data);
-               kfree(midihdr);
-               spin_unlock_irqrestore(&midi_spinlock, flags);
-               return -EINVAL;
-       }
-
-       spin_unlock_irqrestore(&midi_spinlock, flags);
-
-       return 1;
-}
-
-int emu10k1_seq_midi_start_read(int dev)
-{
-       return 0;
-}
-
-int emu10k1_seq_midi_end_read(int dev)
-{
-       return 0;
-}
-
-void emu10k1_seq_midi_kick(int dev)
-{
-}
-
-int emu10k1_seq_midi_buffer_status(int dev)
-{
-       int count;
-       struct midi_queue *queue;
-       struct emu10k1_card *card;
-
-       if (midi_devs[dev] == NULL || midi_devs[dev]->devc == NULL)
-               return -EINVAL;
-
-       count = 0;
-
-       card = midi_devs[dev]->devc;
-       queue = card->mpuout->firstmidiq;
-
-       while (queue != NULL) {
-               count++;
-               if (queue == card->mpuout->lastmidiq)
-                       break;
-
-               queue = queue->next;
-       }
-
-       return count;
-}
-
-#endif
-
diff --git a/sound/oss/emu10k1/midi.h b/sound/oss/emu10k1/midi.h
deleted file mode 100644 (file)
index 2459ec9..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*     
- **********************************************************************
- *     midi.h
- *     Copyright 1999, 2000 Creative Labs, Inc. 
- * 
- ********************************************************************** 
- * 
- *     Date                 Author          Summary of changes 
- *     ----                 ------          ------------------ 
- *     October 20, 1999     Bertrand Lee    base code release 
- * 
- ********************************************************************** 
- * 
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version. 
- * 
- *     This program is distributed in the hope that it will be useful, 
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of 
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
- *     GNU General Public License for more details. 
- * 
- *     You should have received a copy of the GNU General Public 
- *     License along with this program; if not, write to the Free 
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 
- *     USA. 
- * 
- ********************************************************************** 
- */ 
-
-#ifndef _MIDI_H
-#define _MIDI_H
-
-#define FMODE_MIDI_SHIFT 3
-#define FMODE_MIDI_READ  (FMODE_READ << FMODE_MIDI_SHIFT)
-#define FMODE_MIDI_WRITE (FMODE_WRITE << FMODE_MIDI_SHIFT)
-
-#define MIDIIN_STATE_STARTED 0x00000001
-#define MIDIIN_STATE_STOPPED 0x00000002
-
-#define MIDIIN_BUFLEN 1024
-
-struct emu10k1_mididevice
-{
-       struct emu10k1_card *card;
-       u32 mistate;
-       wait_queue_head_t oWait;
-       wait_queue_head_t iWait;
-       s8 iBuf[MIDIIN_BUFLEN];
-       u16 ird, iwr, icnt;
-       struct list_head mid_hdrs;
-};
-
-/* uncomment next line to use midi port on Audigy drive */
-//#define USE_AUDIGY_DRIVE_MIDI
-
-#ifdef USE_AUDIGY_DRIVE_MIDI
-#define A_MUDATA       A_MUDATA2
-#define A_MUCMD                A_MUCMD2
-#define A_MUSTAT       A_MUCMD2
-#define A_IPR_MIDITRANSBUFEMPTY        A_IPR_MIDITRANSBUFEMPTY2
-#define A_IPR_MIDIRECVBUFEMPTY A_IPR_MIDIRECVBUFEMPTY2
-#define A_INTE_MIDITXENABLE    A_INTE_MIDITXENABLE2
-#define A_INTE_MIDIRXENABLE    A_INTE_MIDIRXENABLE2
-#else
-#define A_MUDATA       A_MUDATA1
-#define A_MUCMD                A_MUCMD1
-#define A_MUSTAT       A_MUCMD1
-#define A_IPR_MIDITRANSBUFEMPTY        A_IPR_MIDITRANSBUFEMPTY1
-#define A_IPR_MIDIRECVBUFEMPTY A_IPR_MIDIRECVBUFEMPTY1
-#define A_INTE_MIDITXENABLE    A_INTE_MIDITXENABLE1
-#define A_INTE_MIDIRXENABLE    A_INTE_MIDIRXENABLE1
-#endif
-
-
-#endif /* _MIDI_H */
-
diff --git a/sound/oss/emu10k1/mixer.c b/sound/oss/emu10k1/mixer.c
deleted file mode 100644 (file)
index bc3805f..0000000
+++ /dev/null
@@ -1,690 +0,0 @@
-/*
- **********************************************************************
- *     mixer.c - /dev/mixer interface for emu10k1 driver
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *     November 2, 1999     Alan Cox        cleaned up stuff
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#include <linux/module.h>
-#include <asm/uaccess.h>
-#include <linux/fs.h>
-
-#include "hwaccess.h"
-#include "8010.h"
-#include "recmgr.h"
-
-
-static const u32 bass_table[41][5] = {
-       { 0x3e4f844f, 0x84ed4cc3, 0x3cc69927, 0x7b03553a, 0xc4da8486 },
-       { 0x3e69a17a, 0x84c280fb, 0x3cd77cd4, 0x7b2f2a6f, 0xc4b08d1d },
-       { 0x3e82ff42, 0x849991d5, 0x3ce7466b, 0x7b5917c6, 0xc48863ee },
-       { 0x3e9bab3c, 0x847267f0, 0x3cf5ffe8, 0x7b813560, 0xc461f22c },
-       { 0x3eb3b275, 0x844ced29, 0x3d03b295, 0x7ba79a1c, 0xc43d223b },
-       { 0x3ecb2174, 0x84290c8b, 0x3d106714, 0x7bcc5ba3, 0xc419dfa5 },
-       { 0x3ee2044b, 0x8406b244, 0x3d1c2561, 0x7bef8e77, 0xc3f8170f },
-       { 0x3ef86698, 0x83e5cb96, 0x3d26f4d8, 0x7c114600, 0xc3d7b625 },
-       { 0x3f0e5390, 0x83c646c9, 0x3d30dc39, 0x7c319498, 0xc3b8ab97 },
-       { 0x3f23d60b, 0x83a81321, 0x3d39e1af, 0x7c508b9c, 0xc39ae704 },
-       { 0x3f38f884, 0x838b20d2, 0x3d420ad2, 0x7c6e3b75, 0xc37e58f1 },
-       { 0x3f4dc52c, 0x836f60ef, 0x3d495cab, 0x7c8ab3a6, 0xc362f2be },
-       { 0x3f6245e8, 0x8354c565, 0x3d4fdbb8, 0x7ca602d6, 0xc348a69b },
-       { 0x3f76845f, 0x833b40ec, 0x3d558bf0, 0x7cc036df, 0xc32f677c },
-       { 0x3f8a8a03, 0x8322c6fb, 0x3d5a70c4, 0x7cd95cd7, 0xc317290b },
-       { 0x3f9e6014, 0x830b4bc3, 0x3d5e8d25, 0x7cf1811a, 0xc2ffdfa5 },
-       { 0x3fb20fae, 0x82f4c420, 0x3d61e37f, 0x7d08af56, 0xc2e9804a },
-       { 0x3fc5a1cc, 0x82df2592, 0x3d6475c3, 0x7d1ef294, 0xc2d40096 },
-       { 0x3fd91f55, 0x82ca6632, 0x3d664564, 0x7d345541, 0xc2bf56b9 },
-       { 0x3fec9120, 0x82b67cac, 0x3d675356, 0x7d48e138, 0xc2ab796e },
-       { 0x40000000, 0x82a36037, 0x3d67a012, 0x7d5c9fc9, 0xc2985fee },
-       { 0x401374c7, 0x8291088a, 0x3d672b93, 0x7d6f99c3, 0xc28601f2 },
-       { 0x4026f857, 0x827f6dd7, 0x3d65f559, 0x7d81d77c, 0xc27457a3 },
-       { 0x403a939f, 0x826e88c5, 0x3d63fc63, 0x7d9360d4, 0xc2635996 },
-       { 0x404e4faf, 0x825e5266, 0x3d613f32, 0x7da43d42, 0xc25300c6 },
-       { 0x406235ba, 0x824ec434, 0x3d5dbbc3, 0x7db473d7, 0xc243468e },
-       { 0x40764f1f, 0x823fd80c, 0x3d596f8f, 0x7dc40b44, 0xc23424a2 },
-       { 0x408aa576, 0x82318824, 0x3d545787, 0x7dd309e2, 0xc2259509 },
-       { 0x409f4296, 0x8223cf0b, 0x3d4e7012, 0x7de175b5, 0xc2179218 },
-       { 0x40b430a0, 0x8216a7a1, 0x3d47b505, 0x7def5475, 0xc20a1670 },
-       { 0x40c97a0a, 0x820a0d12, 0x3d4021a1, 0x7dfcab8d, 0xc1fd1cf5 },
-       { 0x40df29a6, 0x81fdfad6, 0x3d37b08d, 0x7e098028, 0xc1f0a0ca },
-       { 0x40f54ab1, 0x81f26ca9, 0x3d2e5bd1, 0x7e15d72b, 0xc1e49d52 },
-       { 0x410be8da, 0x81e75e89, 0x3d241cce, 0x7e21b544, 0xc1d90e24 },
-       { 0x41231051, 0x81dcccb3, 0x3d18ec37, 0x7e2d1ee6, 0xc1cdef10 },
-       { 0x413acdd0, 0x81d2b39e, 0x3d0cc20a, 0x7e38184e, 0xc1c33c13 },
-       { 0x41532ea7, 0x81c90ffb, 0x3cff9585, 0x7e42a58b, 0xc1b8f15a },
-       { 0x416c40cd, 0x81bfdeb2, 0x3cf15d21, 0x7e4cca7c, 0xc1af0b3f },
-       { 0x418612ea, 0x81b71cdc, 0x3ce20e85, 0x7e568ad3, 0xc1a58640 },
-       { 0x41a0b465, 0x81aec7c5, 0x3cd19e7c, 0x7e5fea1e, 0xc19c5f03 },
-       { 0x41bc3573, 0x81a6dcea, 0x3cc000e9, 0x7e68ebc2, 0xc1939250 }
-};
-
-static const u32 treble_table[41][5] = {
-       { 0x0125cba9, 0xfed5debd, 0x00599b6c, 0x0d2506da, 0xfa85b354 },
-       { 0x0142f67e, 0xfeb03163, 0x0066cd0f, 0x0d14c69d, 0xfa914473 },
-       { 0x016328bd, 0xfe860158, 0x0075b7f2, 0x0d03eb27, 0xfa9d32d2 },
-       { 0x0186b438, 0xfe56c982, 0x00869234, 0x0cf27048, 0xfaa97fca },
-       { 0x01adf358, 0xfe21f5fe, 0x00999842, 0x0ce051c2, 0xfab62ca5 },
-       { 0x01d949fa, 0xfde6e287, 0x00af0d8d, 0x0ccd8b4a, 0xfac33aa7 },
-       { 0x02092669, 0xfda4d8bf, 0x00c73d4c, 0x0cba1884, 0xfad0ab07 },
-       { 0x023e0268, 0xfd5b0e4a, 0x00e27b54, 0x0ca5f509, 0xfade7ef2 },
-       { 0x0278645c, 0xfd08a2b0, 0x01012509, 0x0c911c63, 0xfaecb788 },
-       { 0x02b8e091, 0xfcac9d1a, 0x0123a262, 0x0c7b8a14, 0xfafb55df },
-       { 0x03001a9a, 0xfc45e9ce, 0x014a6709, 0x0c65398f, 0xfb0a5aff },
-       { 0x034ec6d7, 0xfbd3576b, 0x0175f397, 0x0c4e2643, 0xfb19c7e4 },
-       { 0x03a5ac15, 0xfb5393ee, 0x01a6d6ed, 0x0c364b94, 0xfb299d7c },
-       { 0x0405a562, 0xfac52968, 0x01ddafae, 0x0c1da4e2, 0xfb39dca5 },
-       { 0x046fa3fe, 0xfa267a66, 0x021b2ddd, 0x0c042d8d, 0xfb4a8631 },
-       { 0x04e4b17f, 0xf975be0f, 0x0260149f, 0x0be9e0f2, 0xfb5b9ae0 },
-       { 0x0565f220, 0xf8b0fbe5, 0x02ad3c29, 0x0bceba73, 0xfb6d1b60 },
-       { 0x05f4a745, 0xf7d60722, 0x030393d4, 0x0bb2b578, 0xfb7f084d },
-       { 0x06923236, 0xf6e279bd, 0x03642465, 0x0b95cd75, 0xfb916233 },
-       { 0x07401713, 0xf5d3aef9, 0x03d01283, 0x0b77fded, 0xfba42984 },
-       { 0x08000000, 0xf4a6bd88, 0x0448a161, 0x0b594278, 0xfbb75e9f },
-       { 0x08d3c097, 0xf3587131, 0x04cf35a4, 0x0b3996c9, 0xfbcb01cb },
-       { 0x09bd59a2, 0xf1e543f9, 0x05655880, 0x0b18f6b2, 0xfbdf1333 },
-       { 0x0abefd0f, 0xf04956ca, 0x060cbb12, 0x0af75e2c, 0xfbf392e8 },
-       { 0x0bdb123e, 0xee806984, 0x06c739fe, 0x0ad4c962, 0xfc0880dd },
-       { 0x0d143a94, 0xec85d287, 0x0796e150, 0x0ab134b0, 0xfc1ddce5 },
-       { 0x0e6d5664, 0xea547598, 0x087df0a0, 0x0a8c9cb6, 0xfc33a6ad },
-       { 0x0fe98a2a, 0xe7e6ba35, 0x097edf83, 0x0a66fe5b, 0xfc49ddc2 },
-       { 0x118c4421, 0xe536813a, 0x0a9c6248, 0x0a4056d7, 0xfc608185 },
-       { 0x1359422e, 0xe23d19eb, 0x0bd96efb, 0x0a18a3bf, 0xfc77912c },
-       { 0x1554982b, 0xdef33645, 0x0d3942bd, 0x09efe312, 0xfc8f0bc1 },
-       { 0x1782b68a, 0xdb50deb1, 0x0ebf676d, 0x09c6133f, 0xfca6f019 },
-       { 0x19e8715d, 0xd74d64fd, 0x106fb999, 0x099b3337, 0xfcbf3cd6 },
-       { 0x1c8b07b8, 0xd2df56ab, 0x124e6ec8, 0x096f4274, 0xfcd7f060 },
-       { 0x1f702b6d, 0xcdfc6e92, 0x14601c10, 0x0942410b, 0xfcf108e5 },
-       { 0x229e0933, 0xc89985cd, 0x16a9bcfa, 0x09142fb5, 0xfd0a8451 },
-       { 0x261b5118, 0xc2aa8409, 0x1930bab6, 0x08e50fdc, 0xfd24604d },
-       { 0x29ef3f5d, 0xbc224f28, 0x1bfaf396, 0x08b4e3aa, 0xfd3e9a3b },
-       { 0x2e21a59b, 0xb4f2ba46, 0x1f0ec2d6, 0x0883ae15, 0xfd592f33 },
-       { 0x32baf44b, 0xad0c7429, 0x227308a3, 0x085172eb, 0xfd741bfd },
-       { 0x37c4448b, 0xa45ef51d, 0x262f3267, 0x081e36dc, 0xfd8f5d14 }
-};
-
-
-static void set_bass(struct emu10k1_card *card, int l, int r)
-{
-       int i;
-
-       l = (l * 40 + 50) / 100;
-       r = (r * 40 + 50) / 100;
-
-       for (i = 0; i < 5; i++)
-               sblive_writeptr(card, (card->is_audigy ? A_GPR_BASE : GPR_BASE) + card->mgr.ctrl_gpr[SOUND_MIXER_BASS][0] + i, 0, bass_table[l][i]);
-}
-
-static void set_treble(struct emu10k1_card *card, int l, int r)
-{
-       int i;
-
-       l = (l * 40 + 50) / 100;
-       r = (r * 40 + 50) / 100;
-
-       for (i = 0; i < 5; i++)
-               sblive_writeptr(card, (card->is_audigy ? A_GPR_BASE : GPR_BASE) + card->mgr.ctrl_gpr[SOUND_MIXER_TREBLE][0] + i , 0, treble_table[l][i]);
-}
-
-const char volume_params[SOUND_MIXER_NRDEVICES]= {
-/* Used by the ac97 driver */
-       [SOUND_MIXER_VOLUME]    =       VOL_6BIT,
-       [SOUND_MIXER_BASS]      =       VOL_4BIT,
-       [SOUND_MIXER_TREBLE]    =       VOL_4BIT,
-       [SOUND_MIXER_PCM]       =       VOL_5BIT,
-       [SOUND_MIXER_SPEAKER]   =       VOL_4BIT,
-       [SOUND_MIXER_LINE]      =       VOL_5BIT,
-       [SOUND_MIXER_MIC]       =       VOL_5BIT,
-       [SOUND_MIXER_CD]        =       VOL_5BIT,
-       [SOUND_MIXER_ALTPCM]    =       VOL_6BIT,
-       [SOUND_MIXER_IGAIN]     =       VOL_4BIT,
-       [SOUND_MIXER_LINE1]     =       VOL_5BIT,
-       [SOUND_MIXER_PHONEIN]   =       VOL_5BIT,
-       [SOUND_MIXER_PHONEOUT]  =       VOL_6BIT,
-       [SOUND_MIXER_VIDEO]     =       VOL_5BIT,
-/* Not used by the ac97 driver */
-       [SOUND_MIXER_SYNTH]     =       VOL_5BIT,
-       [SOUND_MIXER_IMIX]      =       VOL_5BIT,
-       [SOUND_MIXER_RECLEV]    =       VOL_5BIT,
-       [SOUND_MIXER_OGAIN]     =       VOL_5BIT,
-       [SOUND_MIXER_LINE2]     =       VOL_5BIT,
-       [SOUND_MIXER_LINE3]     =       VOL_5BIT,
-       [SOUND_MIXER_DIGITAL1]  =       VOL_5BIT,
-       [SOUND_MIXER_DIGITAL2]  =       VOL_5BIT,
-       [SOUND_MIXER_DIGITAL3]  =       VOL_5BIT,
-       [SOUND_MIXER_RADIO]     =       VOL_5BIT,
-       [SOUND_MIXER_MONITOR]   =       VOL_5BIT
-};
-
-/* Mixer file operations */
-static int emu10k1_private_mixer(struct emu10k1_card *card, unsigned int cmd, unsigned long arg)
-{
-       struct mixer_private_ioctl *ctl;
-       struct dsp_patch *patch;
-       u32 size, page;
-       int addr, size_reg, i, ret;
-       unsigned int id, ch;
-       void __user *argp = (void __user *)arg;
-
-       switch (cmd) {
-
-       case SOUND_MIXER_PRIVATE3:
-
-               ctl = kmalloc(sizeof(struct mixer_private_ioctl), GFP_KERNEL);
-               if (ctl == NULL)
-                       return -ENOMEM;
-
-               if (copy_from_user(ctl, argp, sizeof(struct mixer_private_ioctl))) {
-                       kfree(ctl);
-                       return -EFAULT;
-               }
-
-               ret = 0;
-               switch (ctl->cmd) {
-#ifdef DBGEMU
-               case CMD_WRITEFN0:
-                       emu10k1_writefn0_2(card, ctl->val[0], ctl->val[1], ctl->val[2]);
-                       break;
-#endif
-               case CMD_WRITEPTR:
-#ifdef DBGEMU
-                       if (ctl->val[1] >= 0x40 || ctl->val[0] >= 0x1000) {
-#else
-                       if (ctl->val[1] >= 0x40 || ctl->val[0] >= 0x1000 || ((ctl->val[0] < 0x100 ) &&
-                   //Any register allowed raw access goes here:
-                                    (ctl->val[0] != A_SPDIF_SAMPLERATE) && (ctl->val[0] != A_DBG)
-                       )
-                               ) {
-#endif
-                               ret = -EINVAL;
-                               break;
-                       }
-                       sblive_writeptr(card, ctl->val[0], ctl->val[1], ctl->val[2]);
-                       break;
-
-               case CMD_READFN0:
-                       ctl->val[2] = emu10k1_readfn0(card, ctl->val[0]);
-
-                       if (copy_to_user(argp, ctl, sizeof(struct mixer_private_ioctl)))
-                               ret = -EFAULT;
-
-                       break;
-
-               case CMD_READPTR:
-                       if (ctl->val[1] >= 0x40 || (ctl->val[0] & 0x7ff) > 0xff) {
-                               ret = -EINVAL;
-                               break;
-                       }
-
-                       if ((ctl->val[0] & 0x7ff) > 0x3f)
-                               ctl->val[1] = 0x00;
-
-                       ctl->val[2] = sblive_readptr(card, ctl->val[0], ctl->val[1]);
-
-                       if (copy_to_user(argp, ctl, sizeof(struct mixer_private_ioctl)))
-                               ret = -EFAULT;
-
-                       break;
-
-               case CMD_SETRECSRC:
-                       switch (ctl->val[0]) {
-                       case WAVERECORD_AC97:
-                               if (card->is_aps) {
-                                       ret = -EINVAL;
-                                       break;
-                               }
-
-                               card->wavein.recsrc = WAVERECORD_AC97;
-                               break;
-
-                       case WAVERECORD_MIC:
-                               card->wavein.recsrc = WAVERECORD_MIC;
-                               break;
-
-                       case WAVERECORD_FX:
-                               card->wavein.recsrc = WAVERECORD_FX;
-                               card->wavein.fxwc = ctl->val[1] & 0xffff;
-
-                               if (!card->wavein.fxwc)
-                                       ret = -EINVAL;
-
-                               break;
-
-                       default:
-                               ret = -EINVAL;
-                               break;
-                       }
-                       break;
-
-               case CMD_GETRECSRC:
-                       ctl->val[0] = card->wavein.recsrc;
-                       ctl->val[1] = card->wavein.fxwc;
-                       if (copy_to_user(argp, ctl, sizeof(struct mixer_private_ioctl)))
-                               ret = -EFAULT;
-
-                       break;
-
-               case CMD_GETVOICEPARAM:
-                       ctl->val[0] = card->waveout.send_routing[0];
-                       ctl->val[1] = card->waveout.send_dcba[0];
-
-                       ctl->val[2] = card->waveout.send_routing[1];
-                       ctl->val[3] = card->waveout.send_dcba[1];
-
-                       ctl->val[4] = card->waveout.send_routing[2];
-                       ctl->val[5] = card->waveout.send_dcba[2];
-
-                       if (copy_to_user(argp, ctl, sizeof(struct mixer_private_ioctl)))
-                               ret = -EFAULT;
-
-                       break;
-
-               case CMD_SETVOICEPARAM:
-                       card->waveout.send_routing[0] = ctl->val[0];
-                       card->waveout.send_dcba[0] = ctl->val[1];
-
-                       card->waveout.send_routing[1] = ctl->val[2];
-                       card->waveout.send_dcba[1] = ctl->val[3];
-
-                       card->waveout.send_routing[2] = ctl->val[4];
-                       card->waveout.send_dcba[2] = ctl->val[5];
-
-                       break;
-               
-               case CMD_SETMCH_FX:
-                       card->mchannel_fx = ctl->val[0] & 0x000f;
-                       break;
-               
-               case CMD_GETPATCH:
-                       if (ctl->val[0] == 0) {
-                               if (copy_to_user(argp, &card->mgr.rpatch, sizeof(struct dsp_rpatch)))
-                                       ret = -EFAULT;
-                       } else {
-                               if ((ctl->val[0] - 1) / PATCHES_PER_PAGE >= card->mgr.current_pages) {
-                                       ret = -EINVAL;
-                                       break;
-                               }
-
-                               if (copy_to_user(argp, PATCH(&card->mgr, ctl->val[0] - 1), sizeof(struct dsp_patch)))
-                                       ret = -EFAULT;
-                       }
-
-                       break;
-
-               case CMD_GETGPR:
-                       id = ctl->val[0];
-
-                       if (id > NUM_GPRS) {
-                               ret = -EINVAL;
-                               break;
-                       }
-
-                       if (copy_to_user(argp, &card->mgr.gpr[id], sizeof(struct dsp_gpr)))
-                               ret = -EFAULT;
-
-                       break;
-
-               case CMD_GETCTLGPR:
-                       addr = emu10k1_find_control_gpr(&card->mgr, (char *) ctl->val, &((char *) ctl->val)[PATCH_NAME_SIZE]);
-                       ctl->val[0] = sblive_readptr(card, addr, 0);
-
-                       if (copy_to_user(argp, ctl, sizeof(struct mixer_private_ioctl)))
-                               ret = -EFAULT;
-
-                       break;
-
-               case CMD_SETPATCH:
-                       if (ctl->val[0] == 0)
-                               memcpy(&card->mgr.rpatch, &ctl->val[1], sizeof(struct dsp_rpatch));
-                       else {
-                               page = (ctl->val[0] - 1) / PATCHES_PER_PAGE;
-                               if (page > MAX_PATCHES_PAGES) {
-                                       ret = -EINVAL;
-                                       break;
-                               }
-
-                               if (page >= card->mgr.current_pages) {
-                                       for (i = card->mgr.current_pages; i < page + 1; i++) {
-                                               card->mgr.patch[i] = (void *)__get_free_page(GFP_KERNEL);
-                                               if(card->mgr.patch[i] == NULL) {
-                                                       card->mgr.current_pages = i;
-                                                       ret = -ENOMEM;
-                                                       break;
-                                               }
-                                               memset(card->mgr.patch[i], 0, PAGE_SIZE);
-                                       }
-                                       card->mgr.current_pages = page + 1;
-                               }
-
-                               patch = PATCH(&card->mgr, ctl->val[0] - 1);
-
-                               memcpy(patch, &ctl->val[1], sizeof(struct dsp_patch));
-
-                               if (patch->code_size == 0) {
-                                       for(i = page + 1; i < card->mgr.current_pages; i++)
-                                                free_page((unsigned long) card->mgr.patch[i]);
-
-                                       card->mgr.current_pages = page + 1;
-                               }
-                       }
-                       break;
-
-               case CMD_SETGPR:
-                       if (ctl->val[0] > NUM_GPRS) {
-                               ret = -EINVAL;
-                               break;
-                       }
-
-                       memcpy(&card->mgr.gpr[ctl->val[0]], &ctl->val[1], sizeof(struct dsp_gpr));
-                       break;
-
-               case CMD_SETCTLGPR:
-                       addr = emu10k1_find_control_gpr(&card->mgr, (char *) ctl->val, (char *) ctl->val + PATCH_NAME_SIZE);
-                       emu10k1_set_control_gpr(card, addr, *((s32 *)((char *) ctl->val + 2 * PATCH_NAME_SIZE)), 0);
-                       break;
-
-               case CMD_SETGPOUT:
-                       if ( ((ctl->val[0] > 2) && (!card->is_audigy))
-                            || (ctl->val[0] > 15) || ctl->val[1] > 1) {
-                               ret= -EINVAL;
-                               break;
-                       }
-
-                       if (card->is_audigy)
-                               emu10k1_writefn0(card, (1 << 24) | ((ctl->val[0]) << 16) | A_IOCFG, ctl->val[1]);
-                       else
-                               emu10k1_writefn0(card, (1 << 24) | (((ctl->val[0]) + 10) << 16) | HCFG, ctl->val[1]);
-                       break;
-
-               case CMD_GETGPR2OSS:
-                       id = ctl->val[0];
-                       ch = ctl->val[1];
-
-                       if (id >= SOUND_MIXER_NRDEVICES || ch >= 2) {
-                               ret = -EINVAL;
-                               break;
-                       }
-
-                       ctl->val[2] = card->mgr.ctrl_gpr[id][ch];
-
-                       if (copy_to_user(argp, ctl, sizeof(struct mixer_private_ioctl)))
-                               ret = -EFAULT;
-
-                       break;
-
-               case CMD_SETGPR2OSS:
-                       id = ctl->val[0];
-                       /* 0 == left, 1 == right */
-                       ch = ctl->val[1];
-                       addr = ctl->val[2];
-
-                       if (id >= SOUND_MIXER_NRDEVICES || ch >= 2) {
-                               ret = -EINVAL;
-                               break;
-                       }
-
-                       card->mgr.ctrl_gpr[id][ch] = addr;
-
-                       if (card->is_aps)
-                               break;
-
-                       if (addr >= 0) {
-                               unsigned int state = card->ac97->mixer_state[id];
-
-                               if (ch == 1) {
-                                       state >>= 8;
-                                       card->ac97->stereo_mixers |= (1 << id);
-                               }
-
-                               card->ac97->supported_mixers |= (1 << id);
-
-                               if (id == SOUND_MIXER_TREBLE) {
-                                       set_treble(card, card->ac97->mixer_state[id] & 0xff, (card->ac97->mixer_state[id] >> 8) & 0xff);
-                               } else if (id == SOUND_MIXER_BASS) {
-                                       set_bass(card, card->ac97->mixer_state[id] & 0xff, (card->ac97->mixer_state[id] >> 8) & 0xff);
-                               } else
-                                       emu10k1_set_volume_gpr(card, addr, state & 0xff,
-                                                              volume_params[id]);
-                       } else {
-                               card->ac97->stereo_mixers &= ~(1 << id);
-                               card->ac97->stereo_mixers |= card->ac97_stereo_mixers;
-
-                               if (ch == 0) {
-                                       card->ac97->supported_mixers &= ~(1 << id);
-                                       card->ac97->supported_mixers |= card->ac97_supported_mixers;
-                               }
-                       }
-                       break;
-
-               case CMD_SETPASSTHROUGH:
-                       card->pt.selected = ctl->val[0] ? 1 : 0;
-                       if (card->pt.state != PT_STATE_INACTIVE)
-                               break;
-
-                       card->pt.spcs_to_use = ctl->val[0] & 0x07;
-                       break;
-
-               case CMD_PRIVATE3_VERSION:
-                       ctl->val[0] = PRIVATE3_VERSION; //private3 version
-                       ctl->val[1] = MAJOR_VER;        //major driver version
-                       ctl->val[2] = MINOR_VER;        //minor driver version
-                       ctl->val[3] = card->is_audigy;  //1=card is audigy
-
-                       if (card->is_audigy)
-                               ctl->val[4]=emu10k1_readfn0(card, 0x18);
-
-                       if (copy_to_user(argp, ctl, sizeof(struct mixer_private_ioctl)))
-                               ret = -EFAULT;
-                       break;
-
-               case CMD_AC97_BOOST:
-                       if (ctl->val[0])
-                               emu10k1_ac97_write(card->ac97, 0x18, 0x0);      
-                       else
-                               emu10k1_ac97_write(card->ac97, 0x18, 0x0808);
-                       break;
-               default:
-                       ret = -EINVAL;
-                       break;
-               }
-
-               kfree(ctl);
-               return ret;
-               break;
-
-       case SOUND_MIXER_PRIVATE4:
-
-               if (copy_from_user(&size, argp, sizeof(size)))
-                       return -EFAULT;
-
-               DPD(2, "External tram size %#x\n", size);
-
-               if (size > 0x1fffff)
-                       return -EINVAL;
-
-               size_reg = 0;
-
-               if (size != 0) {
-                       size = (size - 1) >> 14;
-
-                       while (size) {
-                               size >>= 1;
-                               size_reg++;
-                       }
-
-                       size = 0x4000 << size_reg;
-               }
-
-               DPD(2, "External tram size %#x %#x\n", size, size_reg);
-
-               if (size != card->tankmem.size) {
-                       if (card->tankmem.size > 0) {
-                               emu10k1_writefn0(card, HCFG_LOCKTANKCACHE, 1);
-
-                               sblive_writeptr_tag(card, 0, TCB, 0, TCBS, 0, TAGLIST_END);
-
-                               pci_free_consistent(card->pci_dev, card->tankmem.size, card->tankmem.addr, card->tankmem.dma_handle);
-
-                               card->tankmem.size = 0;
-                       }
-
-                       if (size != 0) {
-                               card->tankmem.addr = pci_alloc_consistent(card->pci_dev, size, &card->tankmem.dma_handle);
-                               if (card->tankmem.addr == NULL)
-                                       return -ENOMEM;
-
-                               card->tankmem.size = size;
-
-                               sblive_writeptr_tag(card, 0, TCB, (u32) card->tankmem.dma_handle, TCBS,(u32) size_reg, TAGLIST_END);
-
-                               emu10k1_writefn0(card, HCFG_LOCKTANKCACHE, 0);
-                       }
-               }
-               return 0;
-               break;
-
-       default:
-               break;
-       }
-
-       return -EINVAL;
-}
-
-static int emu10k1_dsp_mixer(struct emu10k1_card *card, unsigned int oss_mixer, unsigned long arg)
-{
-       unsigned int left, right;
-       int val;
-       int scale;
-
-       card->ac97->modcnt++;
-
-       if (get_user(val, (int __user *)arg))
-               return -EFAULT;
-
-       /* cleanse input a little */
-       right = ((val >> 8)  & 0xff);
-       left = (val  & 0xff);
-
-       if (right > 100) right = 100;
-       if (left > 100) left = 100;
-
-       card->ac97->mixer_state[oss_mixer] = (right << 8) | left;
-       if (oss_mixer == SOUND_MIXER_TREBLE) {
-               set_treble(card, left, right);
-               return 0;
-       } if (oss_mixer == SOUND_MIXER_BASS) {
-               set_bass(card, left, right);
-               return 0;
-       }
-
-       if (oss_mixer == SOUND_MIXER_VOLUME)
-               scale = 1 << card->ac97->bit_resolution;
-       else
-               scale = volume_params[oss_mixer];
-
-       emu10k1_set_volume_gpr(card, card->mgr.ctrl_gpr[oss_mixer][0], left, scale);
-       emu10k1_set_volume_gpr(card, card->mgr.ctrl_gpr[oss_mixer][1], right, scale);
-
-       if (card->ac97_supported_mixers & (1 << oss_mixer))
-               card->ac97->write_mixer(card->ac97, oss_mixer, left, right);
-
-       return 0;
-}
-
-static int emu10k1_mixer_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
-{
-       int ret;
-       struct emu10k1_card *card = file->private_data;
-       unsigned int oss_mixer = _IOC_NR(cmd);
-       
-       ret = -EINVAL;
-       if (!card->is_aps) {
-               if (cmd == SOUND_MIXER_INFO) {
-                       mixer_info info;
-
-                       strlcpy(info.id, card->ac97->name, sizeof(info.id));
-
-                       if (card->is_audigy)
-                               strlcpy(info.name, "Audigy - Emu10k1", sizeof(info.name));
-                       else
-                               strlcpy(info.name, "Creative SBLive - Emu10k1", sizeof(info.name));
-                               
-                       info.modify_counter = card->ac97->modcnt;
-
-                       if (copy_to_user((void __user *)arg, &info, sizeof(info)))
-                               return -EFAULT;
-
-                       return 0;
-               }
-
-               if ((_SIOC_DIR(cmd) == (_SIOC_WRITE|_SIOC_READ)) && oss_mixer <= SOUND_MIXER_NRDEVICES)
-                       ret = emu10k1_dsp_mixer(card, oss_mixer, arg);
-               else
-                       ret = card->ac97->mixer_ioctl(card->ac97, cmd, arg);
-       }
-       
-       if (ret < 0)
-               ret = emu10k1_private_mixer(card, cmd, arg);
-
-       return ret;
-}
-
-static int emu10k1_mixer_open(struct inode *inode, struct file *file)
-{
-       int minor = iminor(inode);
-       struct emu10k1_card *card = NULL;
-       struct list_head *entry;
-
-       DPF(4, "emu10k1_mixer_open()\n");
-
-       list_for_each(entry, &emu10k1_devs) {
-               card = list_entry(entry, struct emu10k1_card, list);
-
-               if (card->ac97->dev_mixer == minor)
-                       goto match;
-       }
-
-       return -ENODEV;
-
-      match:
-       file->private_data = card;
-       return 0;
-}
-
-static int emu10k1_mixer_release(struct inode *inode, struct file *file)
-{
-       DPF(4, "emu10k1_mixer_release()\n");
-       return 0;
-}
-
-const struct file_operations emu10k1_mixer_fops = {
-       .owner          = THIS_MODULE,
-       .llseek         = no_llseek,
-       .ioctl          = emu10k1_mixer_ioctl,
-       .open           = emu10k1_mixer_open,
-       .release        = emu10k1_mixer_release,
-};
diff --git a/sound/oss/emu10k1/passthrough.c b/sound/oss/emu10k1/passthrough.c
deleted file mode 100644 (file)
index 6d21d43..0000000
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- **********************************************************************
- *     passthrough.c -- Emu10k1 digital passthrough
- *     Copyright (C) 2001  Juha Yrjölä <jyrjola@cc.hut.fi>
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     May 15, 2001        Juha Yrjölä     base code release
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-                       
-#include <linux/module.h>
-#include <linux/poll.h>
-#include <linux/slab.h>
-#include <linux/bitops.h>
-#include <asm/io.h>
-#include <linux/sched.h>
-#include <linux/smp_lock.h>
-
-#include "hwaccess.h"
-#include "cardwo.h"
-#include "cardwi.h"
-#include "recmgr.h"
-#include "irqmgr.h"
-#include "audio.h"
-#include "8010.h"
-
-static void pt_putsamples(struct pt_data *pt, u16 *ptr, u16 left, u16 right)
-{
-       unsigned int idx;
-
-       ptr[pt->copyptr] = left;
-       idx = pt->copyptr + PT_SAMPLES/2;
-       idx %= PT_SAMPLES;
-       ptr[idx] = right;
-}
-
-static inline int pt_can_write(struct pt_data *pt)
-{
-       return pt->blocks_copied < pt->blocks_played + 8;
-}
-
-static int pt_wait_for_write(struct emu10k1_wavedevice *wavedev, int nonblock)
-{
-       struct emu10k1_card *card = wavedev->card;
-       struct pt_data *pt = &card->pt;
-
-       if (nonblock && !pt_can_write(pt))
-               return -EAGAIN;
-       while (!pt_can_write(pt) && pt->state != PT_STATE_INACTIVE) {
-               interruptible_sleep_on(&pt->wait);
-               if (signal_pending(current))
-                       return -ERESTARTSYS;
-       }
-       if (pt->state == PT_STATE_INACTIVE)
-               return -EAGAIN;
-       
-       return 0;
-}
-
-static int pt_putblock(struct emu10k1_wavedevice *wave_dev, u16 *block, int nonblock)
-{
-       struct woinst *woinst = wave_dev->woinst;
-       struct emu10k1_card *card = wave_dev->card;
-       struct pt_data *pt = &card->pt;
-       u16 *ptr = (u16 *) card->tankmem.addr;
-       int i = 0, r;
-       unsigned long flags;
-
-       r = pt_wait_for_write(wave_dev, nonblock);
-       if (r < 0)
-               return r;
-       spin_lock_irqsave(&card->pt.lock, flags);
-       while (i < PT_BLOCKSAMPLES) {
-               pt_putsamples(pt, ptr, block[2*i], block[2*i+1]);
-               if (pt->copyptr == 0)
-                       pt->copyptr = PT_SAMPLES;
-               pt->copyptr--;
-               i++;
-       }
-       woinst->total_copied += PT_BLOCKSIZE;
-       pt->blocks_copied++;
-       if (pt->blocks_copied >= 4 && pt->state != PT_STATE_PLAYING) {
-               DPF(2, "activating digital pass-through playback\n");
-               sblive_writeptr(card, GPR_BASE + pt->enable_gpr, 0, 1);
-               pt->state = PT_STATE_PLAYING;
-       }
-       spin_unlock_irqrestore(&card->pt.lock, flags);
-       return 0;
-}
-
-int emu10k1_pt_setup(struct emu10k1_wavedevice *wave_dev)
-{
-       u32 bits;
-       struct emu10k1_card *card = wave_dev->card;
-       struct pt_data *pt = &card->pt;
-       int i;
-
-       for (i = 0; i < 3; i++) {
-               pt->old_spcs[i] = sblive_readptr(card, SPCS0 + i, 0);
-               if (pt->spcs_to_use & (1 << i)) {
-                       DPD(2, "using S/PDIF port %d\n", i);
-                       bits = SPCS_CLKACCY_1000PPM | SPCS_SAMPLERATE_48 |
-                               SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC | SPCS_GENERATIONSTATUS |
-                               0x00001200 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT;
-                       if (pt->ac3data)
-                               bits |= SPCS_NOTAUDIODATA;
-                       sblive_writeptr(card, SPCS0 + i, 0, bits);
-               }
-       }
-       return 0;
-}
-
-ssize_t emu10k1_pt_write(struct file *file, const char __user *buffer, size_t count)
-{
-       struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;
-       struct emu10k1_card *card = wave_dev->card;
-       struct pt_data *pt = &card->pt;
-       int nonblock, i, r, blocks, blocks_copied, bytes_copied = 0;
-
-       DPD(3, "emu10k1_pt_write(): %d bytes\n", count);
-       
-       nonblock = file->f_flags & O_NONBLOCK;
-       
-       if (card->tankmem.size < PT_SAMPLES*2)
-               return -EFAULT;
-       if (pt->state == PT_STATE_INACTIVE) {
-               DPF(2, "bufptr init\n");
-               pt->playptr = PT_SAMPLES-1;
-               pt->copyptr = PT_INITPTR;
-               pt->blocks_played = pt->blocks_copied = 0;
-               memset(card->tankmem.addr, 0, card->tankmem.size);
-               pt->state = PT_STATE_ACTIVATED;
-               pt->buf = kmalloc(PT_BLOCKSIZE, GFP_KERNEL);
-               pt->prepend_size = 0;
-               if (pt->buf == NULL)
-                       return -ENOMEM;
-               emu10k1_pt_setup(wave_dev);
-       }
-       if (pt->prepend_size) {
-               int needed = PT_BLOCKSIZE - pt->prepend_size;
-
-               DPD(3, "prepend size %d, prepending %d bytes\n", pt->prepend_size, needed);
-               if (count < needed) {
-                       if (copy_from_user(pt->buf + pt->prepend_size,
-                                          buffer, count))
-                               return -EFAULT;
-                       pt->prepend_size += count;
-                       DPD(3, "prepend size now %d\n", pt->prepend_size);
-                       return count;
-               }
-               if (copy_from_user(pt->buf + pt->prepend_size, buffer, needed))
-                       return -EFAULT;
-               r = pt_putblock(wave_dev, (u16 *) pt->buf, nonblock);
-               if (r)
-                       return r;
-               bytes_copied += needed;
-               pt->prepend_size = 0;
-       }
-       blocks = (count-bytes_copied)/PT_BLOCKSIZE;
-       blocks_copied = 0;
-       while (blocks > 0) {
-               u16 __user *bufptr = (u16 __user *) buffer + (bytes_copied/2);
-               if (copy_from_user(pt->buf, bufptr, PT_BLOCKSIZE))
-                       return -EFAULT;
-               r = pt_putblock(wave_dev, (u16 *)pt->buf, nonblock);
-               if (r) {
-                       if (bytes_copied)
-                               return bytes_copied;
-                       else
-                               return r;
-               }
-               bytes_copied += PT_BLOCKSIZE;
-               blocks--;
-               blocks_copied++;
-       }
-       i = count - bytes_copied;
-       if (i) {
-               pt->prepend_size = i;
-               if (copy_from_user(pt->buf, buffer + bytes_copied, i))
-                       return -EFAULT;
-               bytes_copied += i;
-               DPD(3, "filling prepend buffer with %d bytes", i);
-       }
-       return bytes_copied;
-}
-
-void emu10k1_pt_stop(struct emu10k1_card *card)
-{
-       struct pt_data *pt = &card->pt;
-       int i;
-
-       if (pt->state != PT_STATE_INACTIVE) {
-               DPF(2, "digital pass-through stopped\n");
-               sblive_writeptr(card, (card->is_audigy ? A_GPR_BASE : GPR_BASE) + pt->enable_gpr, 0, 0);
-               for (i = 0; i < 3; i++) {
-                        if (pt->spcs_to_use & (1 << i))
-                               sblive_writeptr(card, SPCS0 + i, 0, pt->old_spcs[i]);
-               }
-               pt->state = PT_STATE_INACTIVE;
-               kfree(pt->buf);
-       }
-}
-
-void emu10k1_pt_waveout_update(struct emu10k1_wavedevice *wave_dev)
-{
-       struct woinst *woinst = wave_dev->woinst;
-       struct pt_data *pt = &wave_dev->card->pt;
-       u32 pos;
-
-       if (pt->state == PT_STATE_PLAYING && pt->pos_gpr >= 0) {
-               pos = sblive_readptr(wave_dev->card, GPR_BASE + pt->pos_gpr, 0);
-               if (pos > PT_BLOCKSAMPLES)
-                       pos = PT_BLOCKSAMPLES;
-               pos = 4 * (PT_BLOCKSAMPLES - pos);
-       } else
-               pos = 0;
-       woinst->total_played = pt->blocks_played * woinst->buffer.fragment_size + pos;
-       woinst->buffer.hw_pos = pos;
-}
diff --git a/sound/oss/emu10k1/passthrough.h b/sound/oss/emu10k1/passthrough.h
deleted file mode 100644 (file)
index 420cc97..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- **********************************************************************
- *     passthrough.h -- Emu10k1 digital passthrough header file
- *     Copyright (C) 2001  Juha Yrjölä <jyrjola@cc.hut.fi>
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     May 15, 2001        Juha Yrjölä     base code release
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#ifndef _PASSTHROUGH_H
-#define _PASSTHROUGH_H
-
-#include "audio.h"
-
-/* number of 16-bit stereo samples in XTRAM buffer */
-#define PT_SAMPLES 0x8000
-#define PT_BLOCKSAMPLES 0x400
-#define PT_BLOCKSIZE (PT_BLOCKSAMPLES*4)
-#define PT_BLOCKSIZE_LOG2 12
-#define PT_BLOCKCOUNT (PT_SAMPLES/PT_BLOCKSAMPLES)
-#define PT_INITPTR (PT_SAMPLES/2-1)
-
-#define PT_STATE_INACTIVE 0
-#define PT_STATE_ACTIVATED 1
-#define PT_STATE_PLAYING 2
-
-/* passthrough struct */
-struct pt_data
-{
-       u8      selected, state, spcs_to_use;
-       int     intr_gpr, enable_gpr, pos_gpr;
-       u32     blocks_played, blocks_copied, old_spcs[3];
-       u32     playptr, copyptr;
-       u32     prepend_size;
-       u8      *buf;
-       u8      ac3data;
-
-       char    *patch_name, *intr_gpr_name, *enable_gpr_name, *pos_gpr_name;
-
-       wait_queue_head_t wait;
-       spinlock_t lock;
-};
-
-/*
-  Passthrough can be done in two methods:
-
-  Method 1 : tram
-     In original emu10k1, we couldn't bypass the sample rate converters. Even at 48kHz
-     (the internal sample rate of the emu10k1) the samples would get messed up.
-     To over come this, samples are copied into the tram and a special dsp patch copies
-     the samples out and generates interrupts when a block has finnished playing.
-
-  Method 2 : Interpolator bypass
-
-     Creative fixed the sample rate convert problem in emu10k1 rev 7 and higher
-     (including the emu10k2 (audigy)). This allows us to use the regular, and much simpler
-     playback method. 
-
-
-  In both methods, dsp code is used to mux audio and passthrough. This ensures that the spdif
-  doesn't receive audio and pasthrough data at the same time. The spdif flag SPCS_NOTAUDIODATA
-  is set to tell 
-
- */
-
-// emu10k1 revs greater than or equal to 7 can use method2
-
-#define USE_PT_METHOD2  (card->is_audigy)
-#define USE_PT_METHOD1 !USE_PT_METHOD2
-
-ssize_t emu10k1_pt_write(struct file *file, const char __user *buf, size_t count);
-
-int emu10k1_pt_setup(struct emu10k1_wavedevice *wave_dev);
-void emu10k1_pt_stop(struct emu10k1_card *card);
-void emu10k1_pt_waveout_update(struct emu10k1_wavedevice *wave_dev);
-
-#endif /* _PASSTHROUGH_H */
diff --git a/sound/oss/emu10k1/recmgr.c b/sound/oss/emu10k1/recmgr.c
deleted file mode 100644 (file)
index 2ce5618..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- **********************************************************************
- *     recmgr.c -- Recording manager for emu10k1 driver
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#include <linux/delay.h>
-#include "8010.h"
-#include "recmgr.h"
-
-void emu10k1_reset_record(struct emu10k1_card *card, struct wavein_buffer *buffer)
-{
-       DPF(2, "emu10k1_reset_record()\n");
-
-       sblive_writeptr(card, buffer->sizereg, 0, ADCBS_BUFSIZE_NONE);
-
-       sblive_writeptr(card, buffer->sizereg, 0, buffer->sizeregval);  
-
-       while (sblive_readptr(card, buffer->idxreg, 0))
-               udelay(5);
-}
-
-void emu10k1_start_record(struct emu10k1_card *card, struct wavein_buffer *buffer)
-{
-       DPF(2, "emu10k1_start_record()\n");
-
-       if (buffer->adcctl)
-               sblive_writeptr(card, ADCCR, 0, buffer->adcctl);
-}
-
-void emu10k1_stop_record(struct emu10k1_card *card, struct wavein_buffer *buffer)
-{
-       DPF(2, "emu10k1_stop_record()\n");
-
-       /* Disable record transfer */
-       if (buffer->adcctl)
-               sblive_writeptr(card, ADCCR, 0, 0);
-}
-
-void emu10k1_set_record_src(struct emu10k1_card *card, struct wiinst *wiinst)
-{
-       struct wavein_buffer *buffer = &wiinst->buffer;
-
-       DPF(2, "emu10k1_set_record_src()\n");
-
-       switch (wiinst->recsrc) {
-
-       case WAVERECORD_AC97:
-               DPF(2, "recording source: AC97\n");
-               buffer->sizereg = ADCBS;
-               buffer->addrreg = ADCBA;
-               buffer->idxreg = card->is_audigy ? A_ADCIDX_IDX : ADCIDX_IDX;
-
-               switch (wiinst->format.samplingrate) {
-               case 0xBB80:
-                       buffer->adcctl = ADCCR_SAMPLERATE_48;
-                       break;
-               case 0xAC44:
-                       buffer->adcctl = ADCCR_SAMPLERATE_44;
-                       break;
-               case 0x7D00:
-                       buffer->adcctl = ADCCR_SAMPLERATE_32;
-                       break;
-               case 0x5DC0:
-                       buffer->adcctl = ADCCR_SAMPLERATE_24;
-                       break;
-               case 0x5622:
-                       buffer->adcctl = ADCCR_SAMPLERATE_22;
-                       break;
-               case 0x3E80:
-                       buffer->adcctl = ADCCR_SAMPLERATE_16;
-                       break;
-               // FIXME: audigy supports 12kHz recording
-               /*
-               case ????:
-                       buffer->adcctl = A_ADCCR_SAMPLERATE_12;
-                       break;
-               */
-               case 0x2B11:
-                       buffer->adcctl = card->is_audigy ? A_ADCCR_SAMPLERATE_11 : ADCCR_SAMPLERATE_11;
-                       break;
-               case 0x1F40:
-                       buffer->adcctl = card->is_audigy ? A_ADCCR_SAMPLERATE_8 : ADCCR_SAMPLERATE_8;
-                       break;
-               default:
-                       BUG();
-                       break;
-               }
-
-               buffer->adcctl |= card->is_audigy ? A_ADCCR_LCHANENABLE : ADCCR_LCHANENABLE;
-
-               if (wiinst->format.channels == 2)
-                       buffer->adcctl |= card->is_audigy ? A_ADCCR_RCHANENABLE : ADCCR_RCHANENABLE;
-
-               break;
-
-       case WAVERECORD_MIC:
-               DPF(2, "recording source: MIC\n");
-               buffer->sizereg = MICBS;
-               buffer->addrreg = MICBA;
-               buffer->idxreg = MICIDX_IDX;
-               buffer->adcctl = 0;
-               break;
-
-       case WAVERECORD_FX:
-               DPF(2, "recording source: FX\n");
-               buffer->sizereg = FXBS;
-               buffer->addrreg = FXBA;
-               buffer->idxreg = FXIDX_IDX;
-               buffer->adcctl = 0;
-
-               sblive_writeptr(card, FXWC, 0, wiinst->fxwc);
-               break;
-       default:
-               BUG();
-               break;
-       }
-
-       DPD(2, "bus addx: %#lx\n", (unsigned long) buffer->dma_handle);
-
-       sblive_writeptr(card, buffer->addrreg, 0, (u32)buffer->dma_handle);
-}
diff --git a/sound/oss/emu10k1/recmgr.h b/sound/oss/emu10k1/recmgr.h
deleted file mode 100644 (file)
index a68766a..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/*     
- **********************************************************************
- *     recmgr.h
- *     Copyright 1999, 2000 Creative Labs, Inc. 
- * 
- ********************************************************************** 
- * 
- *     Date                 Author          Summary of changes 
- *     ----                 ------          ------------------ 
- *     October 20, 1999     Bertrand Lee    base code release 
- * 
- ********************************************************************** 
- * 
- *     This program is free software; you can redistribute it and/or 
- *     modify it under the terms of the GNU General Public License as 
- *     published by the Free Software Foundation; either version 2 of 
- *     the License, or (at your option) any later version. 
- * 
- *     This program is distributed in the hope that it will be useful, 
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of 
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
- *     GNU General Public License for more details. 
- * 
- *     You should have received a copy of the GNU General Public 
- *     License along with this program; if not, write to the Free 
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 
- *     USA. 
- * 
- ********************************************************************** 
- */
-
-#ifndef _RECORDMGR_H
-#define _RECORDMGR_H
-
-#include "hwaccess.h"
-#include "cardwi.h"
-
-/* Recording resources */
-#define WAVERECORD_AC97                0x01
-#define WAVERECORD_MIC         0x02
-#define WAVERECORD_FX          0x03
-
-void emu10k1_reset_record(struct emu10k1_card *card, struct wavein_buffer *buffer);
-void emu10k1_start_record(struct emu10k1_card *, struct wavein_buffer *);
-void emu10k1_stop_record(struct emu10k1_card *, struct wavein_buffer *);
-void emu10k1_set_record_src(struct emu10k1_card *, struct wiinst *wiinst);
-
-#endif /* _RECORDMGR_H */
diff --git a/sound/oss/emu10k1/timer.c b/sound/oss/emu10k1/timer.c
deleted file mode 100644 (file)
index d10d307..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-
-/*
- **********************************************************************
- *     timer.c
- *     Copyright (C) 1999, 2000 Creative Labs, inc.
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-/* 3/6/2000    Improved support for different timer delays  Rui Sousa */
-
-/* 4/3/2000    Implemented timer list using list.h          Rui Sousa */
-
-#include "hwaccess.h"
-#include "8010.h"
-#include "irqmgr.h"
-#include "timer.h"
-
-/* Try to schedule only once per fragment */
-
-void emu10k1_timer_irqhandler(struct emu10k1_card *card)
-{
-       struct emu_timer *t;
-       struct list_head *entry;
-
-       spin_lock(&card->timer_lock);
-
-       list_for_each(entry, &card->timers) {
-               t = list_entry(entry, struct emu_timer, list);
-
-               if (t->state & TIMER_STATE_ACTIVE) {
-                       t->count++;
-                       if (t->count == t->count_max) {
-                               t->count = 0;
-                               tasklet_hi_schedule(&t->tasklet);
-                       }
-               }
-       }
-
-       spin_unlock(&card->timer_lock);
-
-       return;
-}
-
-void emu10k1_timer_install(struct emu10k1_card *card, struct emu_timer *timer, u16 delay)
-{
-       struct emu_timer *t;
-       struct list_head *entry;
-       unsigned long flags;
-
-       if (delay < 5)
-               delay = 5;
-
-       timer->delay = delay;
-       timer->state = TIMER_STATE_INSTALLED;
-
-       spin_lock_irqsave(&card->timer_lock, flags);
-
-       timer->count_max = timer->delay / (card->timer_delay < 1024 ? card->timer_delay : 1024);
-       timer->count = timer->count_max - 1;
-
-       list_add(&timer->list, &card->timers);
-
-       if (card->timer_delay > delay) {
-               if (card->timer_delay == TIMER_STOPPED)
-                       emu10k1_irq_enable(card, INTE_INTERVALTIMERENB);
-
-               card->timer_delay = delay;
-               delay = (delay < 1024 ? delay : 1024);
-
-               emu10k1_timer_set(card, delay);
-
-               list_for_each(entry, &card->timers) {
-                       t = list_entry(entry, struct emu_timer, list);
-
-                       t->count_max = t->delay / delay;
-                       /* don't want to think much, just force scheduling 
-                          on the next interrupt */
-                       t->count = t->count_max - 1;
-               }
-
-               DPD(2, "timer rate --> %u\n", delay);
-       }
-
-       spin_unlock_irqrestore(&card->timer_lock, flags);
-
-       return;
-}
-
-void emu10k1_timer_uninstall(struct emu10k1_card *card, struct emu_timer *timer)
-{
-       struct emu_timer *t;
-       struct list_head *entry;
-       u16 delay = TIMER_STOPPED;
-       unsigned long flags;
-
-       if (timer->state == TIMER_STATE_UNINSTALLED)
-               return;
-
-       spin_lock_irqsave(&card->timer_lock, flags);
-
-       list_del(&timer->list);
-
-       list_for_each(entry, &card->timers) {
-               t = list_entry(entry, struct emu_timer, list);
-
-               if (t->delay < delay)
-                       delay = t->delay;
-       }
-
-       if (card->timer_delay != delay) {
-               card->timer_delay = delay;
-
-               if (delay == TIMER_STOPPED)
-                       emu10k1_irq_disable(card, INTE_INTERVALTIMERENB);
-               else {
-                       delay = (delay < 1024 ? delay : 1024);
-
-                       emu10k1_timer_set(card, delay);
-
-                       list_for_each(entry, &card->timers) {
-                               t = list_entry(entry, struct emu_timer, list);
-
-                               t->count_max = t->delay / delay;
-                               t->count = t->count_max - 1;
-                       }
-               }
-
-               DPD(2, "timer rate --> %u\n", delay);
-       }
-
-       spin_unlock_irqrestore(&card->timer_lock, flags);
-
-       timer->state = TIMER_STATE_UNINSTALLED;
-
-       return;
-}
-
-void emu10k1_timer_enable(struct emu10k1_card *card, struct emu_timer *timer)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&card->timer_lock, flags);
-       timer->state |= TIMER_STATE_ACTIVE;
-       spin_unlock_irqrestore(&card->timer_lock, flags);
-
-       return;
-}
-
-void emu10k1_timer_disable(struct emu10k1_card *card, struct emu_timer *timer)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&card->timer_lock, flags);
-       timer->state &= ~TIMER_STATE_ACTIVE;
-       spin_unlock_irqrestore(&card->timer_lock, flags);
-
-       return;
-}
diff --git a/sound/oss/emu10k1/timer.h b/sound/oss/emu10k1/timer.h
deleted file mode 100644 (file)
index b2543b4..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- **********************************************************************
- *     timer.h
- *     Copyright (C) 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-
-#ifndef _TIMER_H
-#define _TIMER_H
-
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include "hwaccess.h"
-
-struct emu_timer 
-{
-       struct list_head list;
-       struct tasklet_struct tasklet;
-       u8 state; 
-       u16 count;                              /* current number of interrupts */
-       u16 count_max;                          /* number of interrupts needed to schedule the bh */
-       u16 delay;                              /* timer delay */
-};
-
-void emu10k1_timer_install(struct emu10k1_card *, struct emu_timer *, u16);
-void emu10k1_timer_uninstall(struct emu10k1_card *, struct emu_timer *);
-void emu10k1_timer_enable(struct emu10k1_card *, struct emu_timer *);
-void emu10k1_timer_disable(struct emu10k1_card *, struct emu_timer *);
-
-#define TIMER_STOPPED                  0xffff 
-#define TIMER_STATE_INSTALLED          0x01
-#define TIMER_STATE_ACTIVE             0x02
-#define TIMER_STATE_UNINSTALLED        0x04
-
-#endif /* _TIMER_H */
diff --git a/sound/oss/emu10k1/voicemgr.c b/sound/oss/emu10k1/voicemgr.c
deleted file mode 100644 (file)
index d88b602..0000000
+++ /dev/null
@@ -1,398 +0,0 @@
-/*
- **********************************************************************
- *     voicemgr.c - Voice manager for emu10k1 driver
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#include "voicemgr.h"
-#include "8010.h"
-
-#define PITCH_48000 0x00004000
-#define PITCH_96000 0x00008000
-#define PITCH_85000 0x00007155
-#define PITCH_80726 0x00006ba2
-#define PITCH_67882 0x00005a82
-#define PITCH_57081 0x00004c1c
-
-static u32 emu10k1_select_interprom(struct emu10k1_card *card,
-                                   struct emu_voice *voice)
-{
-       if(voice->pitch_target==PITCH_48000)
-               return CCCA_INTERPROM_0;
-       else if(voice->pitch_target<PITCH_48000)
-               return CCCA_INTERPROM_1;
-       else  if(voice->pitch_target>=PITCH_96000)
-               return CCCA_INTERPROM_0;
-       else  if(voice->pitch_target>=PITCH_85000)
-               return CCCA_INTERPROM_6;
-       else  if(voice->pitch_target>=PITCH_80726)
-               return CCCA_INTERPROM_5;
-       else  if(voice->pitch_target>=PITCH_67882)
-               return CCCA_INTERPROM_4;
-       else  if(voice->pitch_target>=PITCH_57081)
-               return CCCA_INTERPROM_3;
-       else  
-               return CCCA_INTERPROM_2;
-}
-
-
-/**
- * emu10k1_voice_alloc_buffer -
- *
- * allocates the memory buffer for a voice. Two page tables are kept for each buffer.
- * One (dma_handle) keeps track of the host memory pages used and the other (virtualpagetable)
- * is passed to the device so that it can do DMA to host memory.
- *
- */
-int emu10k1_voice_alloc_buffer(struct emu10k1_card *card, struct voice_mem *mem, u32 pages)
-{
-       u32 pageindex, pagecount;
-       u32 busaddx;
-       int i;
-
-       DPD(2, "requested pages is: %d\n", pages);
-
-       if ((mem->emupageindex = emu10k1_addxmgr_alloc(pages * PAGE_SIZE, card)) < 0)
-       {
-               DPF(1, "couldn't allocate emu10k1 address space\n");
-               return -1;
-       }
-
-       /* Fill in virtual memory table */
-       for (pagecount = 0; pagecount < pages; pagecount++) {
-               if ((mem->addr[pagecount] = pci_alloc_consistent(card->pci_dev, PAGE_SIZE, &mem->dma_handle[pagecount]))
-                       == NULL) {
-                       mem->pages = pagecount;
-                       DPF(1, "couldn't allocate dma memory\n");
-                       return -1;
-               }
-
-               DPD(2, "Virtual Addx: %p\n", mem->addr[pagecount]);
-
-               for (i = 0; i < PAGE_SIZE / EMUPAGESIZE; i++) {
-                       busaddx = (u32) mem->dma_handle[pagecount] + i * EMUPAGESIZE;
-
-                       DPD(3, "Bus Addx: %#x\n", busaddx);
-
-                       pageindex = mem->emupageindex + pagecount * PAGE_SIZE / EMUPAGESIZE + i;
-
-                       ((u32 *) card->virtualpagetable.addr)[pageindex] = cpu_to_le32((busaddx * 2) | pageindex);
-               }
-       }
-
-       mem->pages = pagecount;
-
-       return 0;
-}
-
-/**
- * emu10k1_voice_free_buffer -
- *
- * frees the memory buffer for a voice.
- */
-void emu10k1_voice_free_buffer(struct emu10k1_card *card, struct voice_mem *mem)
-{
-       u32 pagecount, pageindex;
-       int i;
-
-       if (mem->emupageindex < 0)
-               return;
-
-       for (pagecount = 0; pagecount < mem->pages; pagecount++) {
-               pci_free_consistent(card->pci_dev, PAGE_SIZE,
-                                       mem->addr[pagecount],
-                                       mem->dma_handle[pagecount]);
-
-               for (i = 0; i < PAGE_SIZE / EMUPAGESIZE; i++) {
-                       pageindex = mem->emupageindex + pagecount * PAGE_SIZE / EMUPAGESIZE + i;
-                       ((u32 *) card->virtualpagetable.addr)[pageindex] =
-                               cpu_to_le32(((u32) card->silentpage.dma_handle * 2) | pageindex);
-               }
-       }
-
-       emu10k1_addxmgr_free(card, mem->emupageindex);
-       mem->emupageindex = -1;
-}
-
-int emu10k1_voice_alloc(struct emu10k1_card *card, struct emu_voice *voice)
-{
-       u8 *voicetable = card->voicetable;
-       int i;
-       unsigned long flags;
-
-       DPF(2, "emu10k1_voice_alloc()\n");
-
-       spin_lock_irqsave(&card->lock, flags);
-
-       if (voice->flags & VOICE_FLAGS_STEREO) {
-               for (i = 0; i < NUM_G; i += 2)
-                       if ((voicetable[i] == VOICE_USAGE_FREE) && (voicetable[i + 1] == VOICE_USAGE_FREE)) {
-                               voicetable[i] = voice->usage;
-                               voicetable[i + 1] = voice->usage;
-                               break;
-                       }
-       } else {
-               for (i = 0; i < NUM_G; i++)
-                       if (voicetable[i] == VOICE_USAGE_FREE) {
-                               voicetable[i] = voice->usage;
-                               break;
-                       }
-       }
-
-       spin_unlock_irqrestore(&card->lock, flags);
-
-       if (i >= NUM_G)
-               return -1;
-
-       voice->card = card;
-       voice->num = i;
-
-       for (i = 0; i < (voice->flags & VOICE_FLAGS_STEREO ? 2 : 1); i++) {
-               DPD(2, " voice allocated -> %d\n", voice->num + i);
-
-               sblive_writeptr_tag(card, voice->num + i, IFATN, 0xffff,
-                                                       DCYSUSV, 0,
-                                                       VTFT, 0x0000ffff,
-                                                       PTRX, 0,
-                                                       TAGLIST_END);
-       }
-
-       return 0;
-}
-
-void emu10k1_voice_free(struct emu_voice *voice)
-{
-       struct emu10k1_card *card = voice->card;
-       int i;
-       unsigned long flags;
-
-       DPF(2, "emu10k1_voice_free()\n");
-
-       if (voice->usage == VOICE_USAGE_FREE)
-               return;
-
-       for (i = 0; i < (voice->flags & VOICE_FLAGS_STEREO ? 2 : 1); i++) {
-               DPD(2, " voice released -> %d\n", voice->num + i);
-
-               sblive_writeptr_tag(card, voice->num + i, DCYSUSV, 0, 
-                                                       VTFT, 0x0000ffff,
-                                                       PTRX_PITCHTARGET, 0,
-                                                       CVCF, 0x0000ffff,
-                                                       //CPF, 0,
-                                                       TAGLIST_END);
-               
-               sblive_writeptr(card, CPF, voice->num + i, 0);
-       }
-
-       voice->usage = VOICE_USAGE_FREE;
-
-       spin_lock_irqsave(&card->lock, flags);
-
-       card->voicetable[voice->num] = VOICE_USAGE_FREE;
-
-       if (voice->flags & VOICE_FLAGS_STEREO)
-               card->voicetable[voice->num + 1] = VOICE_USAGE_FREE;
-
-       spin_unlock_irqrestore(&card->lock, flags);
-}
-
-void emu10k1_voice_playback_setup(struct emu_voice *voice)
-{
-       struct emu10k1_card *card = voice->card;
-       u32 start;
-       int i;
-
-       DPF(2, "emu10k1_voice_playback_setup()\n");
-
-       if (voice->flags & VOICE_FLAGS_STEREO) {
-               /* Set stereo bit */
-               start = 28;
-               sblive_writeptr(card, CPF, voice->num, CPF_STEREO_MASK);
-               sblive_writeptr(card, CPF, voice->num + 1, CPF_STEREO_MASK);
-       } else {
-               start = 30;
-               sblive_writeptr(card, CPF, voice->num, 0);
-       }
-
-       if(!(voice->flags & VOICE_FLAGS_16BIT))
-               start *= 2;
-
-       voice->start += start;
-
-       for (i = 0; i < (voice->flags & VOICE_FLAGS_STEREO ? 2 : 1); i++) {
-               if (card->is_audigy) {
-                       sblive_writeptr(card, A_FXRT1, voice->num + i, voice->params[i].send_routing);
-                       sblive_writeptr(card, A_FXRT2, voice->num + i, voice->params[i].send_routing2);
-                       sblive_writeptr(card,  A_SENDAMOUNTS, voice->num + i, voice->params[i].send_hgfe);
-               } else {
-                       sblive_writeptr(card, FXRT, voice->num + i, voice->params[i].send_routing << 16);
-               }
-
-               /* Stop CA */
-               /* Assumption that PT is already 0 so no harm overwriting */
-               sblive_writeptr(card, PTRX, voice->num + i, ((voice->params[i].send_dcba & 0xff) << 8)
-                               | ((voice->params[i].send_dcba & 0xff00) >> 8));
-
-               sblive_writeptr_tag(card, voice->num + i,
-                               /* CSL, ST, CA */
-                                   DSL, voice->endloop | (voice->params[i].send_dcba & 0xff000000),
-                                   PSST, voice->startloop | ((voice->params[i].send_dcba & 0x00ff0000) << 8),
-                                   CCCA, (voice->start) |  emu10k1_select_interprom(card,voice) |
-                                       ((voice->flags & VOICE_FLAGS_16BIT) ? 0 : CCCA_8BITSELECT),
-                                   /* Clear filter delay memory */
-                                   Z1, 0,
-                                   Z2, 0,
-                                   /* Invalidate maps */
-                                   MAPA, MAP_PTI_MASK | ((u32) card->silentpage.dma_handle * 2),
-                                   MAPB, MAP_PTI_MASK | ((u32) card->silentpage.dma_handle * 2),
-                               /* modulation envelope */
-                                   CVCF, 0x0000ffff,
-                                   VTFT, 0x0000ffff,
-                                   ATKHLDM, 0,
-                                   DCYSUSM, 0x007f,
-                                   LFOVAL1, 0x8000,
-                                   LFOVAL2, 0x8000,
-                                   FMMOD, 0,
-                                   TREMFRQ, 0,
-                                   FM2FRQ2, 0,
-                                   ENVVAL, 0x8000,
-                               /* volume envelope */
-                                   ATKHLDV, 0x7f7f,
-                                   ENVVOL, 0x8000,
-                               /* filter envelope */
-                                   PEFE_FILTERAMOUNT, 0x7f,
-                               /* pitch envelope */
-                                   PEFE_PITCHAMOUNT, 0, TAGLIST_END);
-
-               voice->params[i].fc_target = 0xffff;
-       }
-}
-
-void emu10k1_voices_start(struct emu_voice *first_voice, unsigned int num_voices, int set)
-{
-       struct emu10k1_card *card = first_voice->card;
-       struct emu_voice *voice;
-       unsigned int voicenum;
-       int j;
-
-       DPF(2, "emu10k1_voices_start()\n");
-
-       for (voicenum = 0; voicenum < num_voices; voicenum++)
-       {
-               voice = first_voice + voicenum;
-
-               if (!set) {
-                       u32 cra, ccis, cs, sample;
-                       if (voice->flags & VOICE_FLAGS_STEREO) {
-                               cra = 64;
-                               ccis = 28;
-                               cs = 4;
-                       } else {
-                               cra = 64;
-                               ccis = 30;
-                               cs = 2;
-                       }
-
-                       if(voice->flags & VOICE_FLAGS_16BIT) {
-                               sample = 0x00000000;
-                       } else {
-                               sample = 0x80808080;            
-                               ccis *= 2;
-                       }
-
-                       for(j = 0; j < cs; j++)
-                               sblive_writeptr(card, CD0 + j, voice->num, sample);
-
-                       /* Reset cache */
-                       sblive_writeptr(card, CCR_CACHEINVALIDSIZE, voice->num, 0);
-                       if (voice->flags & VOICE_FLAGS_STEREO)
-                               sblive_writeptr(card, CCR_CACHEINVALIDSIZE, voice->num + 1, 0);
-
-                       sblive_writeptr(card, CCR_READADDRESS, voice->num, cra);
-
-                       if (voice->flags & VOICE_FLAGS_STEREO)
-                               sblive_writeptr(card, CCR_READADDRESS, voice->num + 1, cra);
-
-                       /* Fill cache */
-                       sblive_writeptr(card, CCR_CACHEINVALIDSIZE, voice->num, ccis);
-               }
-
-               for (j = 0; j < (voice->flags & VOICE_FLAGS_STEREO ? 2 : 1); j++) {
-                       sblive_writeptr_tag(card, voice->num + j,
-                                   IFATN, (voice->params[j].initial_fc << 8) | voice->params[j].initial_attn,
-                                   VTFT, (voice->params[j].volume_target << 16) | voice->params[j].fc_target,
-                                   CVCF, (voice->params[j].volume_target << 16) | voice->params[j].fc_target,
-                                   DCYSUSV, (voice->params[j].byampl_env_sustain << 8) | voice->params[j].byampl_env_decay,
-                                   TAGLIST_END);
-       
-                       emu10k1_clear_stop_on_loop(card, voice->num + j);
-               }
-       }
-
-
-        for (voicenum = 0; voicenum < num_voices; voicenum++)
-       {
-               voice = first_voice + voicenum;
-
-               for (j = 0; j < (voice->flags & VOICE_FLAGS_STEREO ? 2 : 1); j++) {
-                       sblive_writeptr(card, PTRX_PITCHTARGET, voice->num + j, voice->pitch_target);
-
-                       if (j == 0)
-                               sblive_writeptr(card, CPF_CURRENTPITCH, voice->num, voice->pitch_target);
-
-                       sblive_writeptr(card, IP, voice->num + j, voice->initial_pitch);
-               }
-       }
-}
-
-void emu10k1_voices_stop(struct emu_voice *first_voice, int num_voices)
-{
-       struct emu10k1_card *card = first_voice->card;
-       struct emu_voice *voice;
-       unsigned int voice_num;
-       int j;
-
-       DPF(2, "emu10k1_voice_stop()\n");
-
-        for (voice_num = 0; voice_num < num_voices; voice_num++)
-       {
-               voice = first_voice + voice_num;
-
-               for (j = 0; j < (voice->flags & VOICE_FLAGS_STEREO ? 2 : 1); j++) {
-                       sblive_writeptr_tag(card, voice->num + j,
-                                               PTRX_PITCHTARGET, 0,
-                                               CPF_CURRENTPITCH, 0,
-                                               IFATN, 0xffff,
-                                               VTFT, 0x0000ffff,
-                                               CVCF, 0x0000ffff,
-                                               IP, 0,
-                                               TAGLIST_END);
-               }
-       }
-}
-
diff --git a/sound/oss/emu10k1/voicemgr.h b/sound/oss/emu10k1/voicemgr.h
deleted file mode 100644 (file)
index 099a8cb..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- **********************************************************************
- *     sblive_voice.h -- EMU Voice Resource Manager header file
- *     Copyright 1999, 2000 Creative Labs, Inc.
- *
- **********************************************************************
- *
- *     Date                 Author          Summary of changes
- *     ----                 ------          ------------------
- *     October 20, 1999     Bertrand Lee    base code release
- *
- **********************************************************************
- *
- *     This program is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU General Public License as
- *     published by the Free Software Foundation; either version 2 of
- *     the License, or (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public
- *     License along with this program; if not, write to the Free
- *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- *     USA.
- *
- **********************************************************************
- */
-
-#ifndef _VOICEMGR_H
-#define _VOICEMGR_H
-
-#include "hwaccess.h"
-
-/* struct emu_voice.usage flags */
-#define VOICE_USAGE_FREE               0x01
-#define VOICE_USAGE_MIDI               0x02
-#define VOICE_USAGE_PLAYBACK           0x04
-
-/* struct emu_voice.flags flags */
-#define VOICE_FLAGS_STEREO             0x02
-#define VOICE_FLAGS_16BIT              0x04
-
-struct voice_param
-{
-       /* FX bus amount send */
-
-       u32 send_routing;
-       // audigy only:
-       u32 send_routing2;
-
-       u32 send_dcba;
-       // audigy only:
-       u32 send_hgfe;
-
-
-       u32 initial_fc;
-       u32 fc_target;
-
-       u32 initial_attn;
-       u32 volume_target;
-
-       u32 byampl_env_sustain;
-       u32 byampl_env_decay;
-};
-
-struct voice_mem {
-       int emupageindex;
-       void *addr[BUFMAXPAGES];
-       dma_addr_t dma_handle[BUFMAXPAGES];
-       u32 pages;
-};
-
-struct emu_voice
-{
-       struct emu10k1_card *card;
-       u8 usage;               /* Free, MIDI, playback */
-       u8 num;                 /* Voice ID */
-       u8 flags;               /* Stereo/mono, 8/16 bit */
-
-       u32 startloop;
-       u32 endloop;
-       u32 start;
-
-       u32 initial_pitch;
-       u32 pitch_target;
-
-       struct voice_param params[2];
-
-       struct voice_mem mem;
-};
-
-int emu10k1_voice_alloc_buffer(struct emu10k1_card *, struct voice_mem *, u32);
-void emu10k1_voice_free_buffer(struct emu10k1_card *, struct voice_mem *);
-int emu10k1_voice_alloc(struct emu10k1_card *, struct emu_voice *);
-void emu10k1_voice_free(struct emu_voice *);
-void emu10k1_voice_playback_setup(struct emu_voice *);
-void emu10k1_voices_start(struct emu_voice *, unsigned int, int);
-void emu10k1_voices_stop(struct emu_voice *, int);
-
-#endif /* _VOICEMGR_H */
index 2796c0ef985fc5c08d62af8c33b92da2c83e1240..a690ca57adb50e349255c321f1d22bbaacd6e40b 100644 (file)
@@ -1003,7 +1003,8 @@ int attach_mpu401(struct address_info *hw_config, struct module *owner)
                }
                if (!devc->shared_irq)
                {
-                       if (request_irq(devc->irq, mpuintr, 0, "mpu401", (void *)m) < 0)
+                       if (request_irq(devc->irq, mpuintr, 0, "mpu401",
+                                       hw_config) < 0)
                        {
                                printk(KERN_WARNING "mpu401: Failed to allocate IRQ%d\n", devc->irq);
                                ret = -ENOMEM;
@@ -1112,7 +1113,7 @@ int attach_mpu401(struct address_info *hw_config, struct module *owner)
        return 0;
 
 out_irq:
-       free_irq(devc->irq, (void *)m);
+       free_irq(devc->irq, hw_config);
 out_mididev:
        sound_unload_mididev(m);
 out_err:
@@ -1227,7 +1228,7 @@ void unload_mpu401(struct address_info *hw_config)
        if (n != -1) {
                release_region(hw_config->io_base, 2);
                if (hw_config->always_detect == 0 && hw_config->irq > 0)
-                       free_irq(hw_config->irq, (void *)n);
+                       free_irq(hw_config->irq, hw_config);
                p=mpu401_synth_operations[n];
                sound_unload_mididev(n);
                sound_unload_timerdev(hw_config->slots[2]);
diff --git a/sound/oss/nm256.h b/sound/oss/nm256.h
deleted file mode 100644 (file)
index 1dade90..0000000
+++ /dev/null
@@ -1,292 +0,0 @@
-#ifndef _NM256_H_
-#define _NM256_H_
-
-#include <linux/spinlock.h>
-#include <linux/interrupt.h>
-
-#include "ac97.h"
-
-/* The revisions that we currently handle.  */
-enum nm256rev {
-    REV_NM256AV, REV_NM256ZX
-};
-
-/* Per-card structure. */
-struct nm256_info 
-{
-    /* Magic number used to verify that this struct is valid. */
-#define NM_MAGIC_SIG 0x55aa00ff
-    int magsig;
-
-    /* Revision number */
-    enum nm256rev rev;
-
-    struct ac97_hwint mdev;
-
-    /* Our audio device numbers. */
-    int dev[2];
-
-    /* The # of times each device has been opened. (Should only be 
-       0 or 1). */
-    int opencnt[2];
-
-    /* We use two devices, because we can do simultaneous play and record.
-       This keeps track of which device is being used for what purpose;
-       these are the actual device numbers. */
-    int dev_for_play;
-    int dev_for_record;
-
-       spinlock_t lock;
-       
-    /* The mixer device. */
-    int mixer_oss_dev;
-
-    /* 
-     * Can only be opened once for each operation.  These aren't set
-     * until an actual I/O operation is performed; this allows one
-     * device to be open for read/write without inhibiting I/O to
-     * the other device.
-     */
-    int is_open_play;
-    int is_open_record;
-
-    /* Non-zero if we're currently playing a sample. */
-    int playing;
-    /* Ditto for recording a sample. */
-    int recording;
-
-    /* The two memory ports.  */
-    struct nm256_ports {
-       /* Physical address of the port. */
-       u32 physaddr;
-       /* Our mapped-in pointer. */
-       char __iomem *ptr;
-       /* PTR's offset within the physical port.  */
-       u32 start_offset;
-       /* And the offset of the end of the buffer.  */
-       u32 end_offset;
-    } port[2];
-
-    /* The following are offsets within memory port 1. */
-    u32 coeffBuf;
-    u32 allCoeffBuf;
-
-    /* Record and playback buffers. */
-    u32 abuf1, abuf2;
-
-    /* Offset of the AC97 mixer in memory port 2. */
-    u32 mixer;
-
-    /* Offset of the mixer status register in memory port 2.  */
-    u32 mixer_status_offset;
-
-    /* Non-zero if we have written initial values to the mixer. */
-    u8 mixer_values_init;
-
-    /* 
-     * Status mask bit; (*mixer_status_loc & mixer_status_mask) == 0 means
-     * it's ready.  
-     */
-    u16 mixer_status_mask;
-
-    /* The sizes of the playback and record ring buffers. */
-    u32 playbackBufferSize;
-    u32 recordBufferSize;
-
-    /* Are the coefficient values in the memory cache current? */
-    u8 coeffsCurrent;
-
-    /* For writes, the amount we last wrote. */
-    u32 requested_amt;
-    /* The start of the block currently playing. */
-    u32 curPlayPos;
-
-    /* The amount of data we were requested to record. */
-    u32 requestedRecAmt;
-    /* The offset of the currently-recording block. */
-    u32 curRecPos;
-    /* The destination buffer. */
-    char *recBuf;
-
-    /* Our IRQ number. */
-    int irq;
-
-    /* A flag indicating how many times we've grabbed the IRQ. */
-    int has_irq;
-
-    /* The card interrupt service routine. */
-    irq_handler_t introutine;
-
-    /* Current audio config, cached. */
-    struct sinfo {
-       u32 samplerate;
-       u8 bits;
-       u8 stereo;
-    } sinfo[2]; /* goes with each device */
-
-    /* The cards are stored in a chain;  this is the next card. */
-    struct nm256_info *next_card;
-};
-
-/* The BIOS signature. */
-#define NM_SIGNATURE 0x4e4d0000
-/* Signature mask. */
-#define NM_SIG_MASK 0xffff0000
-
-/* Size of the second memory area. */
-#define NM_PORT2_SIZE 4096
-
-/* The base offset of the mixer in the second memory area. */
-#define NM_MIXER_OFFSET 0x600
-
-/* The maximum size of a coefficient entry. */
-#define NM_MAX_COEFFICIENT 0x5000
-
-/* The interrupt register. */
-#define NM_INT_REG 0xa04
-/* And its bits. */
-#define NM_PLAYBACK_INT 0x40
-#define NM_RECORD_INT 0x100
-#define NM_MISC_INT_1 0x4000
-#define NM_MISC_INT_2 0x1
-#define NM_ACK_INT(CARD, X) nm256_writePort16((CARD), 2, NM_INT_REG, (X) << 1)
-
-/* The AV's "mixer ready" status bit and location. */
-#define NM_MIXER_STATUS_OFFSET 0xa04
-#define NM_MIXER_READY_MASK 0x0800
-#define NM_MIXER_PRESENCE 0xa06
-#define NM_PRESENCE_MASK 0x0050
-#define NM_PRESENCE_VALUE 0x0040
-
-/*
- * For the ZX.  It uses the same interrupt register, but it holds 32
- * bits instead of 16.
- */
-#define NM2_PLAYBACK_INT 0x10000
-#define NM2_RECORD_INT 0x80000
-#define NM2_MISC_INT_1 0x8
-#define NM2_MISC_INT_2 0x2
-#define NM2_ACK_INT(CARD, X) nm256_writePort32((CARD), 2, NM_INT_REG, (X))
-
-/* The ZX's "mixer ready" status bit and location. */
-#define NM2_MIXER_STATUS_OFFSET 0xa06
-#define NM2_MIXER_READY_MASK 0x0800
-
-/* The playback registers start from here. */
-#define NM_PLAYBACK_REG_OFFSET 0x0
-/* The record registers start from here. */
-#define NM_RECORD_REG_OFFSET 0x200
-
-/* The rate register is located 2 bytes from the start of the register area. */
-#define NM_RATE_REG_OFFSET 2
-
-/* Mono/stereo flag, number of bits on playback, and rate mask. */
-#define NM_RATE_STEREO 1
-#define NM_RATE_BITS_16 2
-#define NM_RATE_MASK 0xf0
-
-/* Playback enable register. */
-#define NM_PLAYBACK_ENABLE_REG (NM_PLAYBACK_REG_OFFSET + 0x1)
-#define NM_PLAYBACK_ENABLE_FLAG 1
-#define NM_PLAYBACK_ONESHOT 2
-#define NM_PLAYBACK_FREERUN 4
-
-/* Mutes the audio output. */
-#define NM_AUDIO_MUTE_REG (NM_PLAYBACK_REG_OFFSET + 0x18)
-#define NM_AUDIO_MUTE_LEFT 0x8000
-#define NM_AUDIO_MUTE_RIGHT 0x0080
-
-/* Recording enable register. */
-#define NM_RECORD_ENABLE_REG (NM_RECORD_REG_OFFSET + 0)
-#define NM_RECORD_ENABLE_FLAG 1
-#define NM_RECORD_FREERUN 2
-
-#define NM_RBUFFER_START (NM_RECORD_REG_OFFSET + 0x4)
-#define NM_RBUFFER_END   (NM_RECORD_REG_OFFSET + 0x10)
-#define NM_RBUFFER_WMARK (NM_RECORD_REG_OFFSET + 0xc)
-#define NM_RBUFFER_CURRP (NM_RECORD_REG_OFFSET + 0x8)
-
-#define NM_PBUFFER_START (NM_PLAYBACK_REG_OFFSET + 0x4)
-#define NM_PBUFFER_END   (NM_PLAYBACK_REG_OFFSET + 0x14)
-#define NM_PBUFFER_WMARK (NM_PLAYBACK_REG_OFFSET + 0xc)
-#define NM_PBUFFER_CURRP (NM_PLAYBACK_REG_OFFSET + 0x8)
-
-/* A few trivial routines to make it easier to work with the registers
-   on the chip. */
-
-/* This is a common code portion used to fix up the port offsets. */
-#define NM_FIX_PORT \
-  if (port < 1 || port > 2 || card == NULL) \
-      return -1; \
-\
-    if (offset < card->port[port - 1].start_offset \
-       || offset >= card->port[port - 1].end_offset) { \
-       printk (KERN_ERR "Bad access: port %d, offset 0x%x\n", port, offset); \
-       return -1; \
-    } \
-    offset -= card->port[port - 1].start_offset;
-
-#define DEFwritePortX(X, func) \
-static inline int nm256_writePort##X (struct nm256_info *card,\
-                                     int port, int offset, int value)\
-{\
-    u##X __iomem *addr;\
-\
-    if (nm256_debug > 1)\
-        printk (KERN_DEBUG "Writing 0x%x to %d:0x%x\n", value, port, offset);\
-\
-    NM_FIX_PORT;\
-\
-    addr = (u##X __iomem *)(card->port[port - 1].ptr + offset);\
-    func (value, addr);\
-    return 0;\
-}
-
-DEFwritePortX (8, writeb)
-DEFwritePortX (16, writew)
-DEFwritePortX (32, writel)
-
-#define DEFreadPortX(X, func) \
-static inline u##X nm256_readPort##X (struct nm256_info *card,\
-                                       int port, int offset)\
-{\
-    u##X __iomem *addr;\
-\
-    NM_FIX_PORT\
-\
-    addr = (u##X __iomem *)(card->port[port - 1].ptr + offset);\
-    return func(addr);\
-}
-
-DEFreadPortX (8, readb)
-DEFreadPortX (16, readw)
-DEFreadPortX (32, readl)
-
-static inline int
-nm256_writeBuffer8 (struct nm256_info *card, u8 *src, int port, int offset,
-                     int amt)
-{
-    NM_FIX_PORT;
-    memcpy_toio (card->port[port - 1].ptr + offset, src, amt);
-    return 0;
-}
-
-static inline int
-nm256_readBuffer8 (struct nm256_info *card, u8 *dst, int port, int offset,
-                    int amt)
-{
-    NM_FIX_PORT;
-    memcpy_fromio (dst, card->port[port - 1].ptr + offset, amt);
-    return 0;
-}
-
-/* Returns a non-zero value if we should use the coefficient cache. */
-static int nm256_cachedCoefficients (struct nm256_info *card);
-
-#endif
-\f
-/*
- * Local variables:
- * c-basic-offset: 4
- * End:
- */
diff --git a/sound/oss/nm256_audio.c b/sound/oss/nm256_audio.c
deleted file mode 100644 (file)
index 44cd155..0000000
+++ /dev/null
@@ -1,1662 +0,0 @@
-/* 
- * Audio driver for the NeoMagic 256AV and 256ZX chipsets in native
- * mode, with AC97 mixer support.
- *
- * Overall design and parts of this code stolen from vidc_*.c and
- * skeleton.c.
- *
- * Yeah, there are a lot of magic constants in here.  You tell ME what
- * they are.  I just get this stuff psychically, remember? 
- *
- * This driver was written by someone who wishes to remain anonymous. 
- * It is in the public domain, so share and enjoy.  Try to make a profit
- * off of it; go on, I dare you.  
- *
- * Changes:
- * 11-10-2000  Bartlomiej Zolnierkiewicz <bkz@linux-ide.org>
- *             Added some __init
- * 19-04-2001  Marcus Meissner <mm@caldera.de>
- *             Ported to 2.4 PCI API.
- */
-
-#include <linux/pci.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/delay.h>
-#include <linux/spinlock.h>
-#include "sound_config.h"
-
-static int nm256_debug;
-static int force_load;
-
-#include "nm256.h"
-#include "nm256_coeff.h"
-
-/* 
- * The size of the playback reserve.  When the playback buffer has less
- * than NM256_PLAY_WMARK_SIZE bytes to output, we request a new
- * buffer.
- */
-#define NM256_PLAY_WMARK_SIZE 512
-
-static struct audio_driver nm256_audio_driver;
-
-static int nm256_grabInterrupt (struct nm256_info *card);
-static int nm256_releaseInterrupt (struct nm256_info *card);
-static irqreturn_t nm256_interrupt (int irq, void *dev_id);
-static irqreturn_t nm256_interrupt_zx (int irq, void *dev_id);
-
-/* These belong in linux/pci.h. */
-#define PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO 0x8005
-#define PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO 0x8006
-#define PCI_DEVICE_ID_NEOMAGIC_NM256XL_PLUS_AUDIO 0x8016
-
-/* List of cards.  */
-static struct nm256_info *nmcard_list;
-
-/* Release the mapped-in memory for CARD.  */
-static void
-nm256_release_ports (struct nm256_info *card)
-{
-    int x;
-
-    for (x = 0; x < 2; x++) {
-       if (card->port[x].ptr != NULL) {
-           iounmap (card->port[x].ptr);
-           card->port[x].ptr = NULL;
-       }
-    }
-}
-
-/* 
- * Map in the memory ports for CARD, if they aren't already mapped in
- * and have been configured.  If successful, a zero value is returned;
- * otherwise any previously mapped-in areas are released and a non-zero
- * value is returned.
- *
- * This is invoked twice, once for each port.  Ideally it would only be
- * called once, but we now need to map in the second port in order to
- * check how much memory the card has on the 256ZX.
- */
-static int
-nm256_remap_ports (struct nm256_info *card)
-{
-    int x;
-
-    for (x = 0; x < 2; x++) {
-       if (card->port[x].ptr == NULL && card->port[x].end_offset > 0) {
-           u32 physaddr 
-               = card->port[x].physaddr + card->port[x].start_offset;
-           u32 size 
-               = card->port[x].end_offset - card->port[x].start_offset;
-
-           card->port[x].ptr = ioremap_nocache (physaddr, size);
-                                                 
-           if (card->port[x].ptr == NULL) {
-               printk (KERN_ERR "NM256: Unable to remap port %d\n", x + 1);
-               nm256_release_ports (card);
-               return -1;
-           }
-       }
-    }
-    return 0;
-}
-
-/* Locate the card in our list. */
-static struct nm256_info *
-nm256_find_card (int dev)
-{
-    struct nm256_info *card;
-
-    for (card = nmcard_list; card != NULL; card = card->next_card)
-       if (card->dev[0] == dev || card->dev[1] == dev)
-           return card;
-
-    return NULL;
-}
-
-/*
- * Ditto, but find the card struct corresponding to the mixer device DEV 
- * instead. 
- */
-static struct nm256_info *
-nm256_find_card_for_mixer (int dev)
-{
-    struct nm256_info *card;
-
-    for (card = nmcard_list; card != NULL; card = card->next_card)
-       if (card->mixer_oss_dev == dev)
-           return card;
-
-    return NULL;
-}
-
-static int usecache;
-static int buffertop;
-
-/* Check to see if we're using the bank of cached coefficients. */
-static int
-nm256_cachedCoefficients (struct nm256_info *card)
-{
-    return usecache;
-}
-
-/* The actual rates supported by the card. */
-static int samplerates[9] = {
-    8000, 11025, 16000, 22050, 24000, 32000, 44100, 48000, 99999999
-};
-
-/*
- * Set the card samplerate, word size and stereo mode to correspond to
- * the settings in the CARD struct for the specified device in DEV.
- * We keep two separate sets of information, one for each device; the
- * hardware is not actually configured until a read or write is
- * attempted.
- */
-
-static int
-nm256_setInfo (int dev, struct nm256_info *card)
-{
-    int x;
-    int w;
-    int targetrate;
-
-    if (card->dev[0] == dev)
-       w = 0;
-    else if (card->dev[1] == dev)
-       w = 1;
-    else
-       return -ENODEV;
-
-    targetrate = card->sinfo[w].samplerate;
-
-    if ((card->sinfo[w].bits != 8 && card->sinfo[w].bits != 16)
-       || targetrate < samplerates[0]
-       || targetrate > samplerates[7])
-       return -EINVAL;
-
-    for (x = 0; x < 8; x++)
-       if (targetrate < ((samplerates[x] + samplerates[x + 1]) / 2))
-           break;
-
-    if (x < 8) {
-       u8 ratebits = ((x << 4) & NM_RATE_MASK);
-       if (card->sinfo[w].bits == 16)
-           ratebits |= NM_RATE_BITS_16;
-       if (card->sinfo[w].stereo)
-           ratebits |= NM_RATE_STEREO;
-
-       card->sinfo[w].samplerate = samplerates[x];
-
-
-       if (card->dev_for_play == dev && card->playing) {
-           if (nm256_debug)
-               printk (KERN_DEBUG "Setting play ratebits to 0x%x\n",
-                       ratebits);
-           nm256_loadCoefficient (card, 0, x);
-           nm256_writePort8 (card, 2,
-                             NM_PLAYBACK_REG_OFFSET + NM_RATE_REG_OFFSET,
-                             ratebits);
-       }
-
-       if (card->dev_for_record == dev && card->recording) {
-           if (nm256_debug)
-               printk (KERN_DEBUG "Setting record ratebits to 0x%x\n",
-                       ratebits);
-           nm256_loadCoefficient (card, 1, x);
-           nm256_writePort8 (card, 2,
-                             NM_RECORD_REG_OFFSET + NM_RATE_REG_OFFSET,
-                             ratebits);
-       }
-       return 0;
-    }
-    else
-       return -EINVAL;
-}
-
-/* Start the play process going. */
-static void
-startPlay (struct nm256_info *card)
-{
-    if (! card->playing) {
-       card->playing = 1;
-       if (nm256_grabInterrupt (card) == 0) {
-           nm256_setInfo (card->dev_for_play, card);
-
-           /* Enable playback engine and interrupts. */
-           nm256_writePort8 (card, 2, NM_PLAYBACK_ENABLE_REG,
-                             NM_PLAYBACK_ENABLE_FLAG | NM_PLAYBACK_FREERUN);
-
-           /* Enable both channels. */
-           nm256_writePort16 (card, 2, NM_AUDIO_MUTE_REG, 0x0);
-       }
-    }
-}
-
-/* 
- * Request one chunk of AMT bytes from the recording device.  When the
- * operation is complete, the data will be copied into BUFFER and the
- * function DMAbuf_inputintr will be invoked.
- */
-
-static void
-nm256_startRecording (struct nm256_info *card, char *buffer, u32 amt)
-{
-    u32 endpos;
-    int enableEngine = 0;
-    u32 ringsize = card->recordBufferSize;
-    unsigned long flags;
-
-    if (amt > (ringsize / 2)) {
-       /*
-        * Of course this won't actually work right, because the
-        * caller is going to assume we will give what we got asked
-        * for.
-        */
-       printk (KERN_ERR "NM256: Read request too large: %d\n", amt);
-       amt = ringsize / 2;
-    }
-
-    if (amt < 8) {
-       printk (KERN_ERR "NM256: Read request too small; %d\n", amt);
-       return;
-    }
-
-    spin_lock_irqsave(&card->lock,flags);
-    /*
-     * If we're not currently recording, set up the start and end registers
-     * for the recording engine.
-     */
-    if (! card->recording) {
-       card->recording = 1;
-       if (nm256_grabInterrupt (card) == 0) {
-           card->curRecPos = 0;
-           nm256_setInfo (card->dev_for_record, card);
-           nm256_writePort32 (card, 2, NM_RBUFFER_START, card->abuf2);
-           nm256_writePort32 (card, 2, NM_RBUFFER_END,
-                                card->abuf2 + ringsize);
-
-           nm256_writePort32 (card, 2, NM_RBUFFER_CURRP,
-                                card->abuf2 + card->curRecPos);
-           enableEngine = 1;
-       }
-       else {
-           /* Not sure what else to do here.  */
-           spin_unlock_irqrestore(&card->lock,flags);
-           return;
-       }
-    }
-
-    /* 
-     * If we happen to go past the end of the buffer a bit (due to a
-     * delayed interrupt) it's OK.  So might as well set the watermark
-     * right at the end of the data we want.
-     */
-    endpos = card->abuf2 + ((card->curRecPos + amt) % ringsize);
-
-    card->recBuf = buffer;
-    card->requestedRecAmt = amt;
-    nm256_writePort32 (card, 2, NM_RBUFFER_WMARK, endpos);
-    /* Enable recording engine and interrupts. */
-    if (enableEngine)
-       nm256_writePort8 (card, 2, NM_RECORD_ENABLE_REG,
-                           NM_RECORD_ENABLE_FLAG | NM_RECORD_FREERUN);
-
-    spin_unlock_irqrestore(&card->lock,flags);
-}
-
-/* Stop the play engine. */
-static void
-stopPlay (struct nm256_info *card)
-{
-    /* Shut off sound from both channels. */
-    nm256_writePort16 (card, 2, NM_AUDIO_MUTE_REG,
-                      NM_AUDIO_MUTE_LEFT | NM_AUDIO_MUTE_RIGHT);
-    /* Disable play engine. */
-    nm256_writePort8 (card, 2, NM_PLAYBACK_ENABLE_REG, 0);
-    if (card->playing) {
-       nm256_releaseInterrupt (card);
-
-       /* Reset the relevant state bits. */
-       card->playing = 0;
-       card->curPlayPos = 0;
-    }
-}
-
-/* Stop recording. */
-static void
-stopRecord (struct nm256_info *card)
-{
-    /* Disable recording engine. */
-    nm256_writePort8 (card, 2, NM_RECORD_ENABLE_REG, 0);
-
-    if (card->recording) {
-       nm256_releaseInterrupt (card);
-
-       card->recording = 0;
-       card->curRecPos = 0;
-    }
-}
-
-/*
- * Ring buffers, man.  That's where the hip-hop, wild-n-wooly action's at.
- * 1972?  (Well, I suppose it was cheep-n-easy to implement.)
- *
- * Write AMT bytes of BUFFER to the playback ring buffer, and start the
- * playback engine running.  It will only accept up to 1/2 of the total
- * size of the ring buffer.  No check is made that we're about to overwrite
- * the currently-playing sample.
- */
-
-static void
-nm256_write_block (struct nm256_info *card, char *buffer, u32 amt)
-{
-    u32 ringsize = card->playbackBufferSize;
-    u32 endstop;
-    unsigned long flags;
-
-    if (amt > (ringsize / 2)) {
-       printk (KERN_ERR "NM256: Write request too large: %d\n", amt);
-       amt = (ringsize / 2);
-    }
-
-    if (amt < NM256_PLAY_WMARK_SIZE) {
-       printk (KERN_ERR "NM256: Write request too small: %d\n", amt);
-       return;
-    }
-
-    card->curPlayPos %= ringsize;
-
-    card->requested_amt = amt;
-
-    spin_lock_irqsave(&card->lock,flags);
-
-    if ((card->curPlayPos + amt) >= ringsize) {
-       u32 rem = ringsize - card->curPlayPos;
-
-       nm256_writeBuffer8 (card, buffer, 1,
-                             card->abuf1 + card->curPlayPos,
-                             rem);
-       if (amt > rem)
-           nm256_writeBuffer8 (card, buffer + rem, 1, card->abuf1,
-                                 amt - rem);
-    } 
-    else
-       nm256_writeBuffer8 (card, buffer, 1,
-                             card->abuf1 + card->curPlayPos,
-                             amt);
-
-    /*
-     * Setup the start-n-stop-n-limit registers, and start that engine
-     * goin'. 
-     *
-     * Normally we just let it wrap around to avoid the click-click
-     * action scene.
-     */
-    if (! card->playing) {
-       /* The PBUFFER_END register in this case points to one sample
-          before the end of the buffer. */
-       int w = (card->dev_for_play == card->dev[0] ? 0 : 1);
-       int sampsize = (card->sinfo[w].bits == 16 ? 2 : 1);
-
-       if (card->sinfo[w].stereo)
-           sampsize *= 2;
-
-       /* Need to set the not-normally-changing-registers up. */
-       nm256_writePort32 (card, 2, NM_PBUFFER_START,
-                            card->abuf1 + card->curPlayPos);
-       nm256_writePort32 (card, 2, NM_PBUFFER_END,
-                            card->abuf1 + ringsize - sampsize);
-       nm256_writePort32 (card, 2, NM_PBUFFER_CURRP,
-                            card->abuf1 + card->curPlayPos);
-    }
-    endstop = (card->curPlayPos + amt - NM256_PLAY_WMARK_SIZE) % ringsize;
-    nm256_writePort32 (card, 2, NM_PBUFFER_WMARK, card->abuf1 + endstop);
-
-    if (! card->playing)
-       startPlay (card);
-
-    spin_unlock_irqrestore(&card->lock,flags);
-}
-
-/*  We just got a card playback interrupt; process it.  */
-static void
-nm256_get_new_block (struct nm256_info *card)
-{
-    /* Check to see how much got played so far. */
-    u32 amt = nm256_readPort32 (card, 2, NM_PBUFFER_CURRP) - card->abuf1;
-
-    if (amt >= card->playbackBufferSize) {
-       printk (KERN_ERR "NM256: Sound playback pointer invalid!\n");
-       amt = 0;
-    }
-
-    if (amt < card->curPlayPos)
-       amt = (card->playbackBufferSize - card->curPlayPos) + amt;
-    else
-       amt -= card->curPlayPos;
-
-    if (card->requested_amt > (amt + NM256_PLAY_WMARK_SIZE)) {
-       u32 endstop =
-           card->curPlayPos + card->requested_amt - NM256_PLAY_WMARK_SIZE;
-       nm256_writePort32 (card, 2, NM_PBUFFER_WMARK, card->abuf1 + endstop);
-    } 
-    else {
-       card->curPlayPos += card->requested_amt;
-       /* Get a new block to write.  This will eventually invoke
-          nm256_write_block () or stopPlay ().  */
-       DMAbuf_outputintr (card->dev_for_play, 1);
-    }
-}
-
-/* 
- * Read the last-recorded block from the ring buffer, copy it into the
- * saved buffer pointer, and invoke DMAuf_inputintr() with the recording
- * device. 
- */
-
-static void
-nm256_read_block (struct nm256_info *card)
-{
-    /* Grab the current position of the recording pointer. */
-    u32 currptr = nm256_readPort32 (card, 2, NM_RBUFFER_CURRP) - card->abuf2;
-    u32 amtToRead = card->requestedRecAmt;
-    u32 ringsize = card->recordBufferSize;
-
-    if (currptr >= card->recordBufferSize) {
-       printk (KERN_ERR "NM256: Sound buffer record pointer invalid!\n");
-        currptr = 0;
-    }
-
-    /*
-     * This test is probably redundant; we shouldn't be here unless
-     * it's true.
-     */
-    if (card->recording) {
-       /* If we wrapped around, copy everything from the start of our
-          recording buffer to the end of the buffer. */
-       if (currptr < card->curRecPos) {
-           u32 amt = min (ringsize - card->curRecPos, amtToRead);
-
-           nm256_readBuffer8 (card, card->recBuf, 1,
-                                card->abuf2 + card->curRecPos,
-                                amt);
-           amtToRead -= amt;
-           card->curRecPos += amt;
-           card->recBuf += amt;
-           if (card->curRecPos == ringsize)
-               card->curRecPos = 0;
-       }
-
-       if ((card->curRecPos < currptr) && (amtToRead > 0)) {
-           u32 amt = min (currptr - card->curRecPos, amtToRead);
-           nm256_readBuffer8 (card, card->recBuf, 1,
-                                card->abuf2 + card->curRecPos, amt);
-           card->curRecPos = ((card->curRecPos + amt) % ringsize);
-       }
-       card->recBuf = NULL;
-       card->requestedRecAmt = 0;
-       DMAbuf_inputintr (card->dev_for_record);
-    }
-}
-
-/*
- * Initialize the hardware. 
- */
-static void
-nm256_initHw (struct nm256_info *card)
-{
-    /* Reset everything. */
-    nm256_writePort8 (card, 2, 0x0, 0x11);
-    nm256_writePort16 (card, 2, 0x214, 0);
-
-    stopRecord (card);
-    stopPlay (card);
-}
-
-/* 
- * Handle a potential interrupt for the device referred to by DEV_ID. 
- *
- * I don't like the cut-n-paste job here either between the two routines,
- * but there are sufficient differences between the two interrupt handlers
- * that parameterizing it isn't all that great either.  (Could use a macro,
- * I suppose...yucky bleah.)
- */
-
-static irqreturn_t
-nm256_interrupt (int irq, void *dev_id)
-{
-    struct nm256_info *card = (struct nm256_info *)dev_id;
-    u16 status;
-    static int badintrcount;
-    int handled = 0;
-
-    if ((card == NULL) || (card->magsig != NM_MAGIC_SIG)) {
-       printk (KERN_ERR "NM256: Bad card pointer\n");
-       return IRQ_NONE;
-    }
-
-    status = nm256_readPort16 (card, 2, NM_INT_REG);
-
-    /* Not ours. */
-    if (status == 0) {
-       if (badintrcount++ > 1000) {
-           /*
-            * I'm not sure if the best thing is to stop the card from
-            * playing or just release the interrupt (after all, we're in
-            * a bad situation, so doing fancy stuff may not be such a good
-            * idea).
-            *
-            * I worry about the card engine continuing to play noise
-            * over and over, however--that could become a very
-            * obnoxious problem.  And we know that when this usually
-            * happens things are fairly safe, it just means the user's
-            * inserted a PCMCIA card and someone's spamming us with IRQ 9s.
-            */
-
-           handled = 1;
-           if (card->playing)
-               stopPlay (card);
-           if (card->recording)
-               stopRecord (card);
-           badintrcount = 0;
-       }
-       return IRQ_RETVAL(handled);
-    }
-
-    badintrcount = 0;
-
-    /* Rather boring; check for individual interrupts and process them. */
-
-    if (status & NM_PLAYBACK_INT) {
-       handled = 1;
-       status &= ~NM_PLAYBACK_INT;
-       NM_ACK_INT (card, NM_PLAYBACK_INT);
-
-       if (card->playing)
-           nm256_get_new_block (card);
-    }
-
-    if (status & NM_RECORD_INT) {
-       handled = 1;
-       status &= ~NM_RECORD_INT;
-       NM_ACK_INT (card, NM_RECORD_INT);
-
-       if (card->recording)
-           nm256_read_block (card);
-    }
-
-    if (status & NM_MISC_INT_1) {
-       u8 cbyte;
-
-       handled = 1;
-       status &= ~NM_MISC_INT_1;
-       printk (KERN_ERR "NM256: Got misc interrupt #1\n");
-       NM_ACK_INT (card, NM_MISC_INT_1);
-       nm256_writePort16 (card, 2, NM_INT_REG, 0x8000);
-       cbyte = nm256_readPort8 (card, 2, 0x400);
-       nm256_writePort8 (card, 2, 0x400, cbyte | 2);
-    }
-
-    if (status & NM_MISC_INT_2) {
-       u8 cbyte;
-
-       handled = 1;
-       status &= ~NM_MISC_INT_2;
-       printk (KERN_ERR "NM256: Got misc interrupt #2\n");
-       NM_ACK_INT (card, NM_MISC_INT_2);
-       cbyte = nm256_readPort8 (card, 2, 0x400);
-       nm256_writePort8 (card, 2, 0x400, cbyte & ~2);
-    }
-
-    /* Unknown interrupt. */
-    if (status) {
-       handled = 1;
-       printk (KERN_ERR "NM256: Fire in the hole! Unknown status 0x%x\n",
-               status);
-       /* Pray. */
-       NM_ACK_INT (card, status);
-    }
-    return IRQ_RETVAL(handled);
-}
-
-/*
- * Handle a potential interrupt for the device referred to by DEV_ID.
- * This handler is for the 256ZX, and is very similar to the non-ZX
- * routine.
- */
-
-static irqreturn_t
-nm256_interrupt_zx (int irq, void *dev_id)
-{
-    struct nm256_info *card = (struct nm256_info *)dev_id;
-    u32 status;
-    static int badintrcount;
-    int handled = 0;
-
-    if ((card == NULL) || (card->magsig != NM_MAGIC_SIG)) {
-       printk (KERN_ERR "NM256: Bad card pointer\n");
-       return IRQ_NONE;
-    }
-
-    status = nm256_readPort32 (card, 2, NM_INT_REG);
-
-    /* Not ours. */
-    if (status == 0) {
-       if (badintrcount++ > 1000) {
-           printk (KERN_ERR "NM256: Releasing interrupt, over 1000 invalid interrupts\n");
-           /*
-            * I'm not sure if the best thing is to stop the card from
-            * playing or just release the interrupt (after all, we're in
-            * a bad situation, so doing fancy stuff may not be such a good
-            * idea).
-            *
-            * I worry about the card engine continuing to play noise
-            * over and over, however--that could become a very
-            * obnoxious problem.  And we know that when this usually
-            * happens things are fairly safe, it just means the user's
-            * inserted a PCMCIA card and someone's spamming us with 
-            * IRQ 9s.
-            */
-
-           handled = 1;
-           if (card->playing)
-               stopPlay (card);
-           if (card->recording)
-               stopRecord (card);
-           badintrcount = 0;
-       }
-       return IRQ_RETVAL(handled);
-    }
-
-    badintrcount = 0;
-
-    /* Rather boring; check for individual interrupts and process them. */
-
-    if (status & NM2_PLAYBACK_INT) {
-       handled = 1;
-       status &= ~NM2_PLAYBACK_INT;
-       NM2_ACK_INT (card, NM2_PLAYBACK_INT);
-
-       if (card->playing)
-           nm256_get_new_block (card);
-    }
-
-    if (status & NM2_RECORD_INT) {
-       handled = 1;
-       status &= ~NM2_RECORD_INT;
-       NM2_ACK_INT (card, NM2_RECORD_INT);
-
-       if (card->recording)
-           nm256_read_block (card);
-    }
-
-    if (status & NM2_MISC_INT_1) {
-       u8 cbyte;
-
-       handled = 1;
-       status &= ~NM2_MISC_INT_1;
-       printk (KERN_ERR "NM256: Got misc interrupt #1\n");
-       NM2_ACK_INT (card, NM2_MISC_INT_1);
-       cbyte = nm256_readPort8 (card, 2, 0x400);
-       nm256_writePort8 (card, 2, 0x400, cbyte | 2);
-    }
-
-    if (status & NM2_MISC_INT_2) {
-       u8 cbyte;
-
-       handled = 1;
-       status &= ~NM2_MISC_INT_2;
-       printk (KERN_ERR "NM256: Got misc interrupt #2\n");
-       NM2_ACK_INT (card, NM2_MISC_INT_2);
-       cbyte = nm256_readPort8 (card, 2, 0x400);
-       nm256_writePort8 (card, 2, 0x400, cbyte & ~2);
-    }
-
-    /* Unknown interrupt. */
-    if (status) {
-       handled = 1;
-       printk (KERN_ERR "NM256: Fire in the hole! Unknown status 0x%x\n",
-               status);
-       /* Pray. */
-       NM2_ACK_INT (card, status);
-    }
-    return IRQ_RETVAL(handled);
-}
-
-/* 
- * Request our interrupt.
- */
-static int
-nm256_grabInterrupt (struct nm256_info *card)
-{
-    if (card->has_irq++ == 0) {
-       if (request_irq (card->irq, card->introutine, IRQF_SHARED,
-                        "NM256_audio", card) < 0) {
-           printk (KERN_ERR "NM256: can't obtain IRQ %d\n", card->irq);
-           return -1;
-       }
-    }
-    return 0;
-}
-
-/* 
- * Release our interrupt. 
- */
-static int
-nm256_releaseInterrupt (struct nm256_info *card)
-{
-    if (card->has_irq <= 0) {
-       printk (KERN_ERR "nm256: too many calls to releaseInterrupt\n");
-       return -1;
-    }
-    card->has_irq--;
-    if (card->has_irq == 0) {
-       free_irq (card->irq, card);
-    }
-    return 0;
-}
-
-/*
- * Waits for the mixer to become ready to be written; returns a zero value
- * if it timed out.
- */
-
-static int
-nm256_isReady (struct ac97_hwint *dev)
-{
-    struct nm256_info *card = (struct nm256_info *)dev->driver_private;
-    int t2 = 10;
-    u32 testaddr;
-    u16 testb;
-    int done = 0;
-
-    if (card->magsig != NM_MAGIC_SIG) {
-       printk (KERN_ERR "NM256: Bad magic signature in isReady!\n");
-       return 0;
-    }
-
-    testaddr = card->mixer_status_offset;
-    testb = card->mixer_status_mask;
-
-    /* 
-     * Loop around waiting for the mixer to become ready. 
-     */
-    while (! done && t2-- > 0) {
-       if ((nm256_readPort16 (card, 2, testaddr) & testb) == 0)
-           done = 1;
-       else
-           udelay (100);
-    }
-    return done;
-}
-
-/*
- * Return the contents of the AC97 mixer register REG.  Returns a positive
- * value if successful, or a negative error code.
- */
-static int
-nm256_readAC97Reg (struct ac97_hwint *dev, u8 reg)
-{
-    struct nm256_info *card = (struct nm256_info *)dev->driver_private;
-
-    if (card->magsig != NM_MAGIC_SIG) {
-       printk (KERN_ERR "NM256: Bad magic signature in readAC97Reg!\n");
-       return -EINVAL;
-    }
-
-    if (reg < 128) {
-       int res;
-
-       nm256_isReady (dev);
-       res = nm256_readPort16 (card, 2, card->mixer + reg);
-       /* Magic delay.  Bleah yucky.  */
-        udelay (1000);
-       return res;
-    }
-    else
-       return -EINVAL;
-}
-
-/* 
- * Writes VALUE to AC97 mixer register REG.  Returns 0 if successful, or
- * a negative error code. 
- */
-static int
-nm256_writeAC97Reg (struct ac97_hwint *dev, u8 reg, u16 value)
-{
-    unsigned long flags;
-    int tries = 2;
-    int done = 0;
-    u32 base;
-
-    struct nm256_info *card = (struct nm256_info *)dev->driver_private;
-
-    if (card->magsig != NM_MAGIC_SIG) {
-       printk (KERN_ERR "NM256: Bad magic signature in writeAC97Reg!\n");
-       return -EINVAL;
-    }
-
-    base = card->mixer;
-
-    spin_lock_irqsave(&card->lock,flags);
-
-    nm256_isReady (dev);
-
-    /* Wait for the write to take, too. */
-    while ((tries-- > 0) && !done) {
-       nm256_writePort16 (card, 2, base + reg, value);
-       if (nm256_isReady (dev)) {
-           done = 1;
-           break;
-       }
-
-    }
-
-    spin_unlock_irqrestore(&card->lock,flags);
-    udelay (1000);
-
-    return ! done;
-}
-
-/* 
- * Initial register values to be written to the AC97 mixer.
- * While most of these are identical to the reset values, we do this
- * so that we have most of the register contents cached--this avoids
- * reading from the mixer directly (which seems to be problematic,
- * probably due to ignorance).
- */
-struct initialValues 
-{
-    unsigned short port;
-    unsigned short value;
-};
-
-static struct initialValues nm256_ac97_initial_values[] = 
-{
-    { AC97_MASTER_VOL_STEREO, 0x8000 },
-    { AC97_HEADPHONE_VOL,     0x8000 },
-    { AC97_MASTER_VOL_MONO,   0x0000 },
-    { AC97_PCBEEP_VOL,        0x0000 },
-    { AC97_PHONE_VOL,         0x0008 },
-    { AC97_MIC_VOL,           0x8000 },
-    { AC97_LINEIN_VOL,        0x8808 },
-    { AC97_CD_VOL,            0x8808 },
-    { AC97_VIDEO_VOL,         0x8808 },
-    { AC97_AUX_VOL,           0x8808 },
-    { AC97_PCMOUT_VOL,        0x0808 },
-    { AC97_RECORD_SELECT,     0x0000 },
-    { AC97_RECORD_GAIN,       0x0B0B },
-    { AC97_GENERAL_PURPOSE,   0x0000 },
-    { 0xffff, 0xffff }
-};
-
-/* Initialize the AC97 into a known state.  */
-static int
-nm256_resetAC97 (struct ac97_hwint *dev)
-{
-    struct nm256_info *card = (struct nm256_info *)dev->driver_private;
-    int x;
-
-    if (card->magsig != NM_MAGIC_SIG) {
-       printk (KERN_ERR "NM256: Bad magic signature in resetAC97!\n");
-       return -EINVAL;
-    }
-
-    /* Reset the mixer.  'Tis magic!  */
-    nm256_writePort8 (card, 2, 0x6c0, 1);
-//  nm256_writePort8 (card, 2, 0x6cc, 0x87);   /* This crashes Dell latitudes */
-    nm256_writePort8 (card, 2, 0x6cc, 0x80);
-    nm256_writePort8 (card, 2, 0x6cc, 0x0);
-
-    if (! card->mixer_values_init) {
-       for (x = 0; nm256_ac97_initial_values[x].port != 0xffff; x++) {
-           ac97_put_register (dev,
-                              nm256_ac97_initial_values[x].port,
-                              nm256_ac97_initial_values[x].value);
-           card->mixer_values_init = 1;
-       }
-    }
-
-    return 0;
-}
-
-/*
- * We don't do anything particularly special here; it just passes the
- * mixer ioctl to the AC97 driver.
- */
-static int
-nm256_default_mixer_ioctl (int dev, unsigned int cmd, void __user *arg)
-{
-    struct nm256_info *card = nm256_find_card_for_mixer (dev);
-    if (card != NULL)
-       return ac97_mixer_ioctl (&(card->mdev), cmd, arg);
-    else
-       return -ENODEV;
-}
-
-static struct mixer_operations nm256_mixer_operations = {
-       .owner  = THIS_MODULE,
-       .id     = "NeoMagic",
-       .name   = "NM256AC97Mixer",
-       .ioctl  = nm256_default_mixer_ioctl
-};
-
-/*
- * Default settings for the OSS mixer.  These are set last, after the
- * mixer is initialized.
- *
- * I "love" C sometimes.  Got braces?
- */
-static struct ac97_mixer_value_list mixer_defaults[] = {
-    { SOUND_MIXER_VOLUME,  { { 85, 85 } } },
-    { SOUND_MIXER_SPEAKER, { { 100 } } },
-    { SOUND_MIXER_PCM,     { { 65, 65 } } },
-    { SOUND_MIXER_CD,      { { 65, 65 } } },
-    { -1,                  {  { 0,  0 } } }
-};
-
-
-/* Installs the AC97 mixer into CARD.  */
-static int __devinit
-nm256_install_mixer (struct nm256_info *card)
-{
-    int mixer;
-
-    card->mdev.reset_device = nm256_resetAC97;
-    card->mdev.read_reg = nm256_readAC97Reg;
-    card->mdev.write_reg = nm256_writeAC97Reg;
-    card->mdev.driver_private = (void *)card;
-
-    if (ac97_init (&(card->mdev)))
-       return -1;
-
-    mixer = sound_alloc_mixerdev();
-    if (num_mixers >= MAX_MIXER_DEV) {
-       printk ("NM256 mixer: Unable to alloc mixerdev\n");
-       return -1;
-    }
-
-    mixer_devs[mixer] = &nm256_mixer_operations;
-    card->mixer_oss_dev = mixer;
-
-    /* Some reasonable default values.  */
-    ac97_set_values (&(card->mdev), mixer_defaults);
-
-    printk(KERN_INFO "Initialized AC97 mixer\n");
-    return 0;
-}
-
-/* 
- * See if the signature left by the NM256 BIOS is intact; if so, we use
- * the associated address as the end of our audio buffer in the video
- * RAM.
- */
-
-static void __devinit
-nm256_peek_for_sig (struct nm256_info *card)
-{
-    u32 port1offset 
-       = card->port[0].physaddr + card->port[0].end_offset - 0x0400;
-    /* The signature is located 1K below the end of video RAM.  */
-    char __iomem *temp = ioremap_nocache (port1offset, 16);
-    /* Default buffer end is 5120 bytes below the top of RAM.  */
-    u32 default_value = card->port[0].end_offset - 0x1400;
-    u32 sig;
-
-    /* Install the default value first, so we don't have to repeatedly
-       do it if there is a problem.  */
-    card->port[0].end_offset = default_value;
-
-    if (temp == NULL) {
-       printk (KERN_ERR "NM256: Unable to scan for card signature in video RAM\n");
-       return;
-    }
-    sig = readl (temp);
-    if ((sig & NM_SIG_MASK) == NM_SIGNATURE) {
-       u32 pointer = readl (temp + 4);
-
-       /*
-        * If it's obviously invalid, don't use it (the port already has a
-        * suitable default value set).
-        */
-       if (pointer != 0xffffffff)
-           card->port[0].end_offset = pointer;
-
-       printk (KERN_INFO "NM256: Found card signature in video RAM: 0x%x\n",
-               pointer);
-    }
-
-    iounmap (temp);
-}
-
-/* 
- * Install a driver for the PCI device referenced by PCIDEV.
- * VERSTR is a human-readable version string.
- */
-
-static int __devinit
-nm256_install(struct pci_dev *pcidev, enum nm256rev rev, char *verstr)
-{
-    struct nm256_info *card;
-    int x;
-
-    if (pci_enable_device(pcidev))
-           return 0;
-
-    card = kmalloc (sizeof (struct nm256_info), GFP_KERNEL);
-    if (card == NULL) {
-       printk (KERN_ERR "NM256: out of memory!\n");
-       return 0;
-    }
-
-    card->magsig = NM_MAGIC_SIG;
-    card->playing  = 0;
-    card->recording = 0;
-    card->rev = rev;
-    spin_lock_init(&card->lock);
-
-    /* Init the memory port info.  */
-    for (x = 0; x < 2; x++) {
-       card->port[x].physaddr = pci_resource_start (pcidev, x);
-       card->port[x].ptr = NULL;
-       card->port[x].start_offset = 0;
-       card->port[x].end_offset = 0;
-    }
-
-    /* Port 2 is easy.  */
-    card->port[1].start_offset = 0;
-    card->port[1].end_offset = NM_PORT2_SIZE;
-
-    /* Yuck.  But we have to map in port 2 so we can check how much RAM the
-       card has.  */
-    if (nm256_remap_ports (card)) {
-       kfree (card);
-       return 0;
-    }
-
-    /* 
-     * The NM256 has two memory ports.  The first port is nothing
-     * more than a chunk of video RAM, which is used as the I/O ring
-     * buffer.  The second port has the actual juicy stuff (like the
-     * mixer and the playback engine control registers).
-     */
-
-    if (card->rev == REV_NM256AV) {
-       /* Ok, try to see if this is a non-AC97 version of the hardware. */
-       int pval = nm256_readPort16 (card, 2, NM_MIXER_PRESENCE);
-       if ((pval & NM_PRESENCE_MASK) != NM_PRESENCE_VALUE) {
-           if (! force_load) {
-               printk (KERN_ERR "NM256: This doesn't look to me like the AC97-compatible version.\n");
-               printk (KERN_ERR "       You can force the driver to load by passing in the module\n");
-               printk (KERN_ERR "       parameter:\n");
-               printk (KERN_ERR "              force_load = 1\n");
-               printk (KERN_ERR "\n");
-               printk (KERN_ERR "       More likely, you should be using the appropriate SB-16 or\n");
-               printk (KERN_ERR "       CS4232 driver instead.  (If your BIOS has settings for\n");
-               printk (KERN_ERR "       IRQ and/or DMA for the sound card, this is *not* the correct\n");
-               printk (KERN_ERR "       driver to use.)\n");
-               nm256_release_ports (card);
-               kfree (card);
-               return 0;
-           }
-           else {
-               printk (KERN_INFO "NM256: Forcing driver load as per user request.\n");
-           }
-       }
-       else {
-        /*   printk (KERN_INFO "NM256: Congratulations. You're not running Eunice.\n")*/;
-       }
-       card->port[0].end_offset = 2560 * 1024;
-       card->introutine = nm256_interrupt;
-       card->mixer_status_offset = NM_MIXER_STATUS_OFFSET;
-       card->mixer_status_mask = NM_MIXER_READY_MASK;
-    } 
-    else {
-       /* Not sure if there is any relevant detect for the ZX or not.  */
-       if (nm256_readPort8 (card, 2, 0xa0b) != 0)
-           card->port[0].end_offset = 6144 * 1024;
-       else
-           card->port[0].end_offset = 4096 * 1024;
-
-       card->introutine = nm256_interrupt_zx;
-       card->mixer_status_offset = NM2_MIXER_STATUS_OFFSET;
-       card->mixer_status_mask = NM2_MIXER_READY_MASK;
-    }
-
-    if (buffertop >= 98304 && buffertop < card->port[0].end_offset)
-       card->port[0].end_offset = buffertop;
-    else
-       nm256_peek_for_sig (card);
-
-    card->port[0].start_offset = card->port[0].end_offset - 98304;
-
-    printk (KERN_INFO "NM256: Mapping port 1 from 0x%x - 0x%x\n",
-           card->port[0].start_offset, card->port[0].end_offset);
-
-    if (nm256_remap_ports (card)) {
-       kfree (card);
-       return 0;
-    }
-
-    /* See if we can get the interrupt. */
-
-    card->irq = pcidev->irq;
-    card->has_irq = 0;
-
-    if (nm256_grabInterrupt (card) != 0) {
-       nm256_release_ports (card);
-       kfree (card);
-       return 0;
-    }
-
-    nm256_releaseInterrupt (card);
-
-    /*
-     * Init the board.
-     */
-
-    card->playbackBufferSize = 16384;
-    card->recordBufferSize = 16384;
-
-    card->coeffBuf = card->port[0].end_offset - NM_MAX_COEFFICIENT;
-    card->abuf2 = card->coeffBuf - card->recordBufferSize;
-    card->abuf1 = card->abuf2 - card->playbackBufferSize;
-    card->allCoeffBuf = card->abuf2 - (NM_TOTAL_COEFF_COUNT * 4);
-
-    /* Fixed setting. */
-    card->mixer = NM_MIXER_OFFSET;
-    card->mixer_values_init = 0;
-
-    card->is_open_play = 0;
-    card->is_open_record = 0;
-
-    card->coeffsCurrent = 0;
-
-    card->opencnt[0] = 0; card->opencnt[1] = 0;
-
-    /* Reasonable default settings, but largely unnecessary. */
-    for (x = 0; x < 2; x++) {
-       card->sinfo[x].bits = 8;
-       card->sinfo[x].stereo = 0;
-       card->sinfo[x].samplerate = 8000;
-    }
-
-    nm256_initHw (card);
-
-    for (x = 0; x < 2; x++) {
-       if ((card->dev[x] =
-            sound_install_audiodrv(AUDIO_DRIVER_VERSION,
-                                   "NM256", &nm256_audio_driver,
-                                   sizeof(struct audio_driver),
-                                   DMA_NODMA, AFMT_U8 | AFMT_S16_LE,
-                                   NULL, -1, -1)) >= 0) {
-           /* 1K minimum buffer size. */
-           audio_devs[card->dev[x]]->min_fragment = 10;
-           /* Maximum of 8K buffer size. */
-           audio_devs[card->dev[x]]->max_fragment = 13;
-       }
-       else {
-           printk(KERN_ERR "NM256: Too many PCM devices available\n");
-           nm256_release_ports (card);
-           kfree (card);
-           return 0;
-       }
-    }
-
-    pci_set_drvdata(pcidev,card);
-
-    /* Insert the card in the list.  */
-    card->next_card = nmcard_list;
-    nmcard_list = card;
-
-    printk(KERN_INFO "Initialized NeoMagic %s audio in PCI native mode\n",
-          verstr);
-
-    /* 
-     * And our mixer.  (We should allow support for other mixers, maybe.)
-     */
-
-    nm256_install_mixer (card);
-
-    return 1;
-}
-
-
-static int __devinit
-nm256_probe(struct pci_dev *pcidev,const struct pci_device_id *pciid)
-{
-    if (pcidev->device == PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO)
-       return nm256_install(pcidev, REV_NM256AV, "256AV");
-    if (pcidev->device == PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO)
-       return nm256_install(pcidev, REV_NM256ZX, "256ZX");
-    if (pcidev->device == PCI_DEVICE_ID_NEOMAGIC_NM256XL_PLUS_AUDIO)
-       return nm256_install(pcidev, REV_NM256ZX, "256XL+");
-    return -1; /* should not come here ... */
-}
-
-static void __devinit
-nm256_remove(struct pci_dev *pcidev) {
-    struct nm256_info *xcard = pci_get_drvdata(pcidev);
-    struct nm256_info *card,*next_card = NULL;
-
-    for (card = nmcard_list; card != NULL; card = next_card) {
-       next_card = card->next_card;
-       if (card == xcard) {
-           stopPlay (card);
-           stopRecord (card);
-           if (card->has_irq)
-               free_irq (card->irq, card);
-           nm256_release_ports (card);
-           sound_unload_mixerdev (card->mixer_oss_dev);
-           sound_unload_audiodev (card->dev[0]);
-           sound_unload_audiodev (card->dev[1]);
-           kfree (card);
-           break;
-       }
-    }
-    if (nmcard_list == card)
-       nmcard_list = next_card;
-}
-
-/*
- * Open the device
- *
- * DEV  - device
- * MODE - mode to open device (logical OR of OPEN_READ and OPEN_WRITE)
- *
- * Called when opening the DMAbuf               (dmabuf.c:259)
- */
-static int
-nm256_audio_open(int dev, int mode)
-{
-    struct nm256_info *card = nm256_find_card (dev);
-    int w;
-       
-    if (card == NULL)
-       return -ENODEV;
-
-    if (card->dev[0] == dev)
-       w = 0;
-    else if (card->dev[1] == dev)
-       w = 1;
-    else
-       return -ENODEV;
-
-    if (card->opencnt[w] > 0)
-       return -EBUSY;
-
-    /* No bits set? Huh? */
-    if (! ((mode & OPEN_READ) || (mode & OPEN_WRITE)))
-       return -EIO;
-
-    /*
-     * If it's open for both read and write, and the card's currently
-     * being read or written to, then do the opposite of what has
-     * already been done.  Otherwise, don't specify any mode until the
-     * user actually tries to do I/O.  (Some programs open the device
-     * for both read and write, but only actually do reading or writing.)
-     */
-
-    if ((mode & OPEN_WRITE) && (mode & OPEN_READ)) {
-       if (card->is_open_play)
-           mode = OPEN_WRITE;
-       else if (card->is_open_record)
-           mode = OPEN_READ;
-       else mode = 0;
-    }
-       
-    if (mode & OPEN_WRITE) {
-       if (card->is_open_play == 0) {
-           card->dev_for_play = dev;
-           card->is_open_play = 1;
-       }
-       else
-           return -EBUSY;
-    }
-
-    if (mode & OPEN_READ) {
-       if (card->is_open_record == 0) {
-           card->dev_for_record = dev;
-           card->is_open_record = 1;
-       }
-       else
-           return -EBUSY;
-    }
-
-    card->opencnt[w]++;
-    return 0;
-}
-
-/*
- * Close the device
- *
- * DEV  - device
- *
- * Called when closing the DMAbuf               (dmabuf.c:477)
- *      after halt_xfer
- */
-static void
-nm256_audio_close(int dev)
-{
-    struct nm256_info *card = nm256_find_card (dev);
-       
-    if (card != NULL) {
-       int w;
-
-       if (card->dev[0] == dev)
-           w = 0;
-       else if (card->dev[1] == dev)
-           w = 1;
-       else
-           return;
-
-       card->opencnt[w]--;
-       if (card->opencnt[w] <= 0) {
-           card->opencnt[w] = 0;
-
-           if (card->dev_for_play == dev) {
-               stopPlay (card);
-               card->is_open_play = 0;
-               card->dev_for_play = -1;
-           }
-
-           if (card->dev_for_record == dev) {
-               stopRecord (card);
-               card->is_open_record = 0;
-               card->dev_for_record = -1;
-           }
-       }
-    }
-}
-
-/* Standard ioctl handler. */
-static int
-nm256_audio_ioctl(int dev, unsigned int cmd, void __user *arg)
-{
-    int ret;
-    u32 oldinfo;
-    int w;
-
-    struct nm256_info *card = nm256_find_card (dev);
-
-    if (card == NULL)
-       return -ENODEV;
-
-    if (dev == card->dev[0])
-       w = 0;
-    else
-       w = 1;
-
-    /* 
-     * The code here is messy.  There are probably better ways to do
-     * it.  (It should be possible to handle it the same way the AC97 mixer 
-     * is done.)
-     */
-    switch (cmd)
-       {
-       case SOUND_PCM_WRITE_RATE:
-           if (get_user(ret, (int __user *) arg))
-               return -EFAULT;
-
-           if (ret != 0) {
-               oldinfo = card->sinfo[w].samplerate;
-               card->sinfo[w].samplerate = ret;
-               ret = nm256_setInfo(dev, card);
-               if (ret != 0)
-                   card->sinfo[w].samplerate = oldinfo;
-           }
-           if (ret == 0)
-               ret = card->sinfo[w].samplerate;
-           break;
-
-       case SOUND_PCM_READ_RATE:
-           ret = card->sinfo[w].samplerate;
-           break;
-
-       case SNDCTL_DSP_STEREO:
-           if (get_user(ret, (int __user *) arg))
-               return -EFAULT;
-
-           card->sinfo[w].stereo = ret ? 1 : 0;
-           ret = nm256_setInfo (dev, card);
-           if (ret == 0)
-               ret = card->sinfo[w].stereo;
-
-           break;
-
-       case SOUND_PCM_WRITE_CHANNELS:
-           if (get_user(ret, (int __user *) arg))
-               return -EFAULT;
-
-           if (ret < 1 || ret > 3)
-               ret = card->sinfo[w].stereo + 1;
-           else {
-               card->sinfo[w].stereo = ret - 1;
-               ret = nm256_setInfo (dev, card);
-               if (ret == 0)
-                   ret = card->sinfo[w].stereo + 1;
-           }
-           break;
-
-       case SOUND_PCM_READ_CHANNELS:
-           ret = card->sinfo[w].stereo + 1;
-           break;
-
-       case SNDCTL_DSP_SETFMT:
-           if (get_user(ret, (int __user *) arg))
-               return -EFAULT;
-
-           if (ret != 0) {
-               oldinfo = card->sinfo[w].bits;
-               card->sinfo[w].bits = ret;
-               ret = nm256_setInfo (dev, card);
-               if (ret != 0)
-                   card->sinfo[w].bits = oldinfo;
-           }
-           if (ret == 0)
-               ret = card->sinfo[w].bits;
-           break;
-
-       case SOUND_PCM_READ_BITS:
-           ret = card->sinfo[w].bits;
-           break;
-
-       default:
-           return -EINVAL;
-       }
-    return put_user(ret, (int __user *) arg);
-}
-
-/*
- * Given the sound device DEV and an associated physical buffer PHYSBUF, 
- * return a pointer to the actual buffer in kernel space. 
- *
- * This routine should exist as part of the soundcore routines.
- */
-
-static char *
-nm256_getDMAbuffer (int dev, unsigned long physbuf)
-{
-    struct audio_operations *adev = audio_devs[dev];
-    struct dma_buffparms *dmap = adev->dmap_out;
-    char *dma_start =
-       (char *)(physbuf - (unsigned long)dmap->raw_buf_phys 
-                + (unsigned long)dmap->raw_buf);
-
-    return dma_start;
-}
-
-
-/*
- * Output a block to sound device
- *
- * dev          - device number
- * buf          - physical address of buffer
- * total_count  - total byte count in buffer
- * intrflag     - set if this has been called from an interrupt 
- *                               (via DMAbuf_outputintr)
- * restart_dma  - set if engine needs to be re-initialised
- *
- * Called when:
- *  1. Starting output                                  (dmabuf.c:1327)
- *  2.                                                  (dmabuf.c:1504)
- *  3. A new buffer needs to be sent to the device      (dmabuf.c:1579)
- */
-static void
-nm256_audio_output_block(int dev, unsigned long physbuf,
-                                      int total_count, int intrflag)
-{
-    struct nm256_info *card = nm256_find_card (dev);
-
-    if (card != NULL) {
-       char *dma_buf = nm256_getDMAbuffer (dev, physbuf);
-       card->is_open_play = 1;
-       card->dev_for_play = dev;
-       nm256_write_block (card, dma_buf, total_count);
-    }
-}
-
-/* Ditto, but do recording instead.  */
-static void
-nm256_audio_start_input(int dev, unsigned long physbuf, int count,
-                       int intrflag)
-{
-    struct nm256_info *card = nm256_find_card (dev);
-
-    if (card != NULL) {
-       char *dma_buf = nm256_getDMAbuffer (dev, physbuf);
-       card->is_open_record = 1;
-       card->dev_for_record = dev;
-       nm256_startRecording (card, dma_buf, count);
-    }
-}
-
-/* 
- * Prepare for inputting samples to DEV. 
- * Each requested buffer will be BSIZE byes long, with a total of
- * BCOUNT buffers. 
- */
-
-static int
-nm256_audio_prepare_for_input(int dev, int bsize, int bcount)
-{
-    struct nm256_info *card = nm256_find_card (dev);
-
-    if (card == NULL) 
-       return -ENODEV;
-
-    if (card->is_open_record && card->dev_for_record != dev)
-       return -EBUSY;
-
-    audio_devs[dev]->dmap_in->flags |= DMA_NODMA;
-    return 0;
-}
-
-/*
- * Prepare for outputting samples to `dev'
- *
- * Each buffer that will be passed will be `bsize' bytes long,
- * with a total of `bcount' buffers.
- *
- * Called when:
- *  1. A trigger enables audio output                   (dmabuf.c:978)
- *  2. We get a write buffer without dma_mode setup     (dmabuf.c:1152)
- *  3. We restart a transfer                            (dmabuf.c:1324)
- */
-
-static int
-nm256_audio_prepare_for_output(int dev, int bsize, int bcount)
-{
-    struct nm256_info *card = nm256_find_card (dev);
-
-    if (card == NULL)
-       return -ENODEV;
-
-    if (card->is_open_play && card->dev_for_play != dev)
-       return -EBUSY;
-
-    audio_devs[dev]->dmap_out->flags |= DMA_NODMA;
-    return 0;
-}
-
-/* Stop the current operations associated with DEV.  */
-static void
-nm256_audio_reset(int dev)
-{
-    struct nm256_info *card = nm256_find_card (dev);
-
-    if (card != NULL) {
-       if (card->dev_for_play == dev)
-           stopPlay (card);
-       if (card->dev_for_record == dev)
-           stopRecord (card);
-    }
-}
-
-static int
-nm256_audio_local_qlen(int dev)
-{
-    return 0;
-}
-
-static struct audio_driver nm256_audio_driver =
-{
-       .owner                  = THIS_MODULE,
-       .open                   = nm256_audio_open,
-       .close                  = nm256_audio_close,
-       .output_block           = nm256_audio_output_block,
-       .start_input            = nm256_audio_start_input,
-       .ioctl                  = nm256_audio_ioctl,
-       .prepare_for_input      = nm256_audio_prepare_for_input,
-       .prepare_for_output     = nm256_audio_prepare_for_output,
-       .halt_io                = nm256_audio_reset,
-       .local_qlen             = nm256_audio_local_qlen,
-};
-
-static struct pci_device_id nm256_pci_tbl[] = {
-       {PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO,
-       PCI_ANY_ID, PCI_ANY_ID, 0, 0},
-       {PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO,
-       PCI_ANY_ID, PCI_ANY_ID, 0, 0},
-       {PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256XL_PLUS_AUDIO,
-       PCI_ANY_ID, PCI_ANY_ID, 0, 0},
-       {0,}
-};
-MODULE_DEVICE_TABLE(pci, nm256_pci_tbl);
-MODULE_LICENSE("GPL");
-
-
-static struct pci_driver nm256_pci_driver = {
-       .name           = "nm256_audio",
-       .id_table       = nm256_pci_tbl,
-       .probe          = nm256_probe,
-       .remove         = nm256_remove,
-};
-
-module_param(usecache, bool, 0);
-module_param(buffertop, int, 0);
-module_param(nm256_debug, bool, 0644);
-module_param(force_load, bool, 0);
-
-static int __init do_init_nm256(void)
-{
-    printk (KERN_INFO "NeoMagic 256AV/256ZX audio driver, version 1.1p\n");
-    return pci_register_driver(&nm256_pci_driver);
-}
-
-static void __exit cleanup_nm256 (void)
-{
-    pci_unregister_driver(&nm256_pci_driver);
-}
-
-module_init(do_init_nm256);
-module_exit(cleanup_nm256);
-
-/*
- * Local variables:
- *  c-basic-offset: 4
- * End:
- */
diff --git a/sound/oss/nm256_coeff.h b/sound/oss/nm256_coeff.h
deleted file mode 100644 (file)
index 6fc07f3..0000000
+++ /dev/null
@@ -1,4697 +0,0 @@
-#ifndef NM256_COEFF_H
-#define NM256_COEFF_H
-
-#define NM_TOTAL_COEFF_COUNT 0x3158
-
-static char coefficients[NM_TOTAL_COEFF_COUNT * 4] = { 
-       0xFF, 0xFF, 0x2F, 0x00, 0x4B, 0xFF, 0xA5, 0x01, 0xEF, 0xFC, 0x21,
-       0x05, 0x87, 0xF7, 0x62, 0x11, 0xE9, 0x45, 0x5E, 0xF9, 0xB5, 0x01,
-       0xDE, 0xFF, 0xA4, 0xFF, 0x60, 0x00, 0xCA, 0xFF, 0x0D, 0x00, 0xFD,
-       0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE6, 0x01, 0x3D, 0xFC, 0xD6, 0x06,
-       0x4C, 0xF3, 0xED, 0x20, 0x3D, 0x3D, 0x4A, 0xF3, 0x4E, 0x05, 0xB1,
-       0xFD, 0xE1, 0x00, 0xC3, 0xFF, 0x05, 0x00, 0x02, 0x00, 0xFD, 0xFF,
-       0x2A, 0x00, 0x5C, 0xFF, 0xAA, 0x01, 0x71, 0xFC, 0x07, 0x07, 0x7E,
-       0xF1, 0x44, 0x30, 0x44, 0x30, 0x7E, 0xF1, 0x07, 0x07, 0x71, 0xFC,
-       0xAA, 0x01, 0x5C, 0xFF, 0x2A, 0x00, 0xFD, 0xFF, 0x02, 0x00, 0x05,
-       0x00, 0xC3, 0xFF, 0xE1, 0x00, 0xB1, 0xFD, 0x4E, 0x05, 0x4A, 0xF3,
-       0x3D, 0x3D, 0xED, 0x20, 0x4C, 0xF3, 0xD6, 0x06, 0x3D, 0xFC, 0xE6,
-       0x01, 0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x0D, 0x00, 0xCA, 0xFF,
-       0x60, 0x00, 0xA4, 0xFF, 0xDE, 0xFF, 0xB5, 0x01, 0x5E, 0xF9, 0xE9,
-       0x45, 0x62, 0x11, 0x87, 0xF7, 0x21, 0x05, 0xEF, 0xFC, 0xA5, 0x01,
-       0x4B, 0xFF, 0x2F, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x1E, 0x00, 0x84,
-       0xFF, 0x11, 0x01, 0x34, 0xFE, 0x8F, 0x02, 0xC7, 0xFC, 0xAE, 0x03,
-       0xF7, 0x48, 0xAE, 0x03, 0xC7, 0xFC, 0x8F, 0x02, 0x34, 0xFE, 0x11,
-       0x01, 0x84, 0xFF, 0x1E, 0x00, 0xFE, 0xFF, 0x34, 0x00, 0x3D, 0xFF,
-       0xCA, 0x01, 0x95, 0xFC, 0xEA, 0x05, 0xBB, 0xF5, 0x25, 0x17, 0x3C,
-       0x43, 0x8D, 0xF6, 0x43, 0x03, 0xF5, 0xFE, 0x26, 0x00, 0x20, 0x00,
-       0xE2, 0xFF, 0x08, 0x00, 0xFD, 0xFF, 0x30, 0x00, 0x4D, 0xFF, 0xC5,
-       0x01, 0x4C, 0xFC, 0x26, 0x07, 0xA3, 0xF1, 0xAB, 0x2C, 0xBB, 0x33,
-       0x8F, 0xF1, 0xCA, 0x06, 0xA6, 0xFC, 0x85, 0x01, 0x6F, 0xFF, 0x24,
-       0x00, 0xFD, 0xFF, 0x03, 0x00, 0xFE, 0xFF, 0xD5, 0xFF, 0xBC, 0x00,
-       0xF0, 0xFD, 0xEC, 0x04, 0xD9, 0xF3, 0xB1, 0x3E, 0xCD, 0x1E, 0xC1,
-       0xF3, 0xAF, 0x06, 0x49, 0xFC, 0xE4, 0x01, 0x36, 0xFF, 0x36, 0x00,
-       0xFE, 0xFF, 0x16, 0x00, 0xA6, 0xFF, 0xBB, 0x00, 0xE9, 0xFE, 0x38,
-       0x01, 0x4B, 0xFF, 0x28, 0xFE, 0x3A, 0x48, 0x04, 0x0A, 0x2E, 0xFA,
-       0xDF, 0x03, 0x8A, 0xFD, 0x60, 0x01, 0x65, 0xFF, 0x27, 0x00, 0x00,
-       0x00, 0xFF, 0xFF, 0x2E, 0x00, 0x50, 0xFF, 0x98, 0x01, 0x0D, 0xFD,
-       0xE0, 0x04, 0x14, 0xF8, 0xC3, 0x0F, 0x89, 0x46, 0x4C, 0xFA, 0x38,
-       0x01, 0x25, 0x00, 0x7D, 0xFF, 0x73, 0x00, 0xC2, 0xFF, 0x0F, 0x00,
-       0xFD, 0xFF, 0x35, 0x00, 0x3A, 0xFF, 0xE3, 0x01, 0x31, 0xFC, 0x0F,
-       0x07, 0x84, 0xF2, 0x29, 0x25, 0x1A, 0x3A, 0x67, 0xF2, 0xF6, 0x05,
-       0x41, 0xFD, 0x24, 0x01, 0xA1, 0xFF, 0x12, 0x00, 0x00, 0x00, 0xFF,
-       0xFF, 0x15, 0x00, 0x97, 0xFF, 0x37, 0x01, 0x22, 0xFD, 0x23, 0x06,
-       0x2F, 0xF2, 0x11, 0x39, 0x7B, 0x26, 0x50, 0xF2, 0x1B, 0x07, 0x32,
-       0xFC, 0xE1, 0x01, 0x3C, 0xFF, 0x35, 0x00, 0xFD, 0xFF, 0x0E, 0x00,
-       0xC8, 0xFF, 0x64, 0x00, 0x9B, 0xFF, 0xEE, 0xFF, 0x98, 0x01, 0x93,
-       0xF9, 0x10, 0x46, 0x03, 0x11, 0xA7, 0xF7, 0x12, 0x05, 0xF6, 0xFC,
-       0xA2, 0x01, 0x4C, 0xFF, 0x2F, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x26,
-       0x00, 0x6A, 0xFF, 0x53, 0x01, 0xA6, 0xFD, 0xA6, 0x03, 0xA1, 0xFA,
-       0xDE, 0x08, 0x76, 0x48, 0x0C, 0xFF, 0xDE, 0xFE, 0x73, 0x01, 0xC9,
-       0xFE, 0xCA, 0x00, 0xA0, 0xFF, 0x17, 0x00, 0xFE, 0xFF, 0x36, 0x00,
-       0x36, 0xFF, 0xE1, 0x01, 0x52, 0xFC, 0x93, 0x06, 0x10, 0xF4, 0x78,
-       0x1D, 0x90, 0x3F, 0x3E, 0xF4, 0xAA, 0x04, 0x19, 0xFE, 0xA4, 0x00,
-       0xE2, 0xFF, 0xFA, 0xFF, 0x03, 0x00, 0xFD, 0xFF, 0x26, 0x00, 0x68,
-       0xFF, 0x93, 0x01, 0x92, 0xFC, 0xE2, 0x06, 0x83, 0xF1, 0x8C, 0x32,
-       0xED, 0x2D, 0x90, 0xF1, 0x1E, 0x07, 0x57, 0xFC, 0xBD, 0x01, 0x51,
-       0xFF, 0x2E, 0x00, 0xFD, 0xFF, 0x07, 0x00, 0xE8, 0xFF, 0x12, 0x00,
-       0x42, 0x00, 0xC4, 0xFE, 0x94, 0x03, 0x02, 0xF6, 0x89, 0x42, 0x76,
-       0x18, 0x5C, 0xF5, 0x12, 0x06, 0x84, 0xFC, 0xD1, 0x01, 0x3B, 0xFF,
-       0x34, 0x00, 0xFE, 0xFF, 0x1D, 0x00, 0x8A, 0xFF, 0x03, 0x01, 0x53,
-       0xFE, 0x53, 0x02, 0x39, 0xFD, 0xA9, 0x02, 0xF2, 0x48, 0xB9, 0x04,
-       0x54, 0xFC, 0xCA, 0x02, 0x16, 0xFE, 0x20, 0x01, 0x7F, 0xFF, 0x20,
-       0x00, 0x00, 0x00, 0xFF, 0xFF, 0x33, 0x00, 0x40, 0xFF, 0xC3, 0x01,
-       0xA7, 0xFC, 0xC0, 0x05, 0x1E, 0xF6, 0xD8, 0x15, 0xE7, 0x43, 0x20,
-       0xF7, 0xEF, 0x02, 0x27, 0xFF, 0x0A, 0x00, 0x2E, 0x00, 0xDD, 0xFF,
-       0x09, 0x00, 0xFD, 0xFF, 0x31, 0x00, 0x48, 0xFF, 0xCD, 0x01, 0x43,
-       0xFC, 0x2A, 0x07, 0xBC, 0xF1, 0x64, 0x2B, 0xE3, 0x34, 0xA3, 0xF1,
-       0xAE, 0x06, 0xBD, 0xFC, 0x77, 0x01, 0x77, 0xFF, 0x21, 0x00, 0xFE,
-       0xFF, 0x02, 0x00, 0x03, 0x00, 0xCA, 0xFF, 0xD4, 0x00, 0xC8, 0xFD,
-       0x2A, 0x05, 0x7D, 0xF3, 0xCA, 0x3D, 0x22, 0x20, 0x76, 0xF3, 0xC8,
-       0x06, 0x41, 0xFC, 0xE6, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF,
-       0x14, 0x00, 0xAC, 0xFF, 0xAC, 0x00, 0x08, 0xFF, 0xFD, 0x00, 0xB5,
-       0xFF, 0x4B, 0xFD, 0xF4, 0x47, 0x30, 0x0B, 0xBC, 0xF9, 0x17, 0x04,
-       0x6E, 0xFD, 0x6D, 0x01, 0x60, 0xFF, 0x29, 0x00, 0x00, 0x00, 0xFF,
-       0xFF, 0x2C, 0x00, 0x54, 0xFF, 0x8D, 0x01, 0x26, 0xFD, 0xAD, 0x04,
-       0x82, 0xF8, 0x87, 0x0E, 0xF9, 0x46, 0x0C, 0xFB, 0xD4, 0x00, 0x5D,
-       0x00, 0x5E, 0xFF, 0x82, 0x00, 0xBD, 0xFF, 0x10, 0x00, 0xFD, 0xFF,
-       0x36, 0x00, 0x38, 0xFF, 0xE5, 0x01, 0x33, 0xFC, 0x01, 0x07, 0xBE,
-       0xF2, 0xD6, 0x23, 0x1F, 0x3B, 0xA5, 0xF2, 0xC5, 0x05, 0x62, 0xFD,
-       0x10, 0x01, 0xAB, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x19,
-       0x00, 0x8E, 0xFF, 0x49, 0x01, 0x04, 0xFD, 0x4D, 0x06, 0x00, 0xF2,
-       0xFE, 0x37, 0xCB, 0x27, 0x21, 0xF2, 0x23, 0x07, 0x34, 0xFC, 0xDD,
-       0x01, 0x3F, 0xFF, 0x34, 0x00, 0xFD, 0xFF, 0x0C, 0x00, 0xCE, 0xFF,
-       0x56, 0x00, 0xB9, 0xFF, 0xB8, 0xFF, 0xF7, 0x01, 0xE2, 0xF8, 0x8D,
-       0x45, 0x46, 0x12, 0x3C, 0xF7, 0x43, 0x05, 0xDF, 0xFC, 0xAC, 0x01,
-       0x48, 0xFF, 0x30, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x24, 0x00, 0x70,
-       0xFF, 0x46, 0x01, 0xC3, 0xFD, 0x6D, 0x03, 0x14, 0xFB, 0xBE, 0x07,
-       0xA6, 0x48, 0xF8, 0xFF, 0x70, 0xFE, 0xAE, 0x01, 0xAA, 0xFE, 0xD9,
-       0x00, 0x9A, 0xFF, 0x19, 0x00, 0xFE, 0xFF, 0x36, 0x00, 0x37, 0xFF,
-       0xDE, 0x01, 0x5D, 0xFC, 0x74, 0x06, 0x63, 0xF4, 0x23, 0x1C, 0x66,
-       0x40, 0xAA, 0xF4, 0x65, 0x04, 0x44, 0xFE, 0x8B, 0x00, 0xEE, 0xFF,
-       0xF5, 0xFF, 0x04, 0x00, 0xFD, 0xFF, 0x29, 0x00, 0x61, 0xFF, 0x9F,
-       0x01, 0x80, 0xFC, 0xF7, 0x06, 0x7D, 0xF1, 0x5A, 0x31, 0x2C, 0x2F,
-       0x83, 0xF1, 0x13, 0x07, 0x64, 0xFC, 0xB3, 0x01, 0x57, 0xFF, 0x2C,
-       0x00, 0xFD, 0xFF, 0x06, 0x00, 0xED, 0xFF, 0x05, 0x00, 0x5D, 0x00,
-       0x95, 0xFE, 0xE2, 0x03, 0x7F, 0xF5, 0xCC, 0x41, 0xC7, 0x19, 0xFF,
-       0xF4, 0x37, 0x06, 0x75, 0xFC, 0xD6, 0x01, 0x39, 0xFF, 0x35, 0x00,
-       0xFE, 0xFF, 0x1B, 0x00, 0x90, 0xFF, 0xF4, 0x00, 0x72, 0xFE, 0x18,
-       0x02, 0xAA, 0xFD, 0xAB, 0x01, 0xDF, 0x48, 0xCA, 0x05, 0xE1, 0xFB,
-       0x05, 0x03, 0xF7, 0xFD, 0x2E, 0x01, 0x79, 0xFF, 0x21, 0x00, 0x00,
-       0x00, 0xFF, 0xFF, 0x32, 0x00, 0x43, 0xFF, 0xBB, 0x01, 0xBA, 0xFC,
-       0x95, 0x05, 0x83, 0xF6, 0x8C, 0x14, 0x87, 0x44, 0xBB, 0xF7, 0x98,
-       0x02, 0x5A, 0xFF, 0xEE, 0xFF, 0x3C, 0x00, 0xD8, 0xFF, 0x0A, 0x00,
-       0xFD, 0xFF, 0x32, 0x00, 0x44, 0xFF, 0xD3, 0x01, 0x3C, 0xFC, 0x2A,
-       0x07, 0xDC, 0xF1, 0x1A, 0x2A, 0x06, 0x36, 0xBE, 0xF1, 0x8E, 0x06,
-       0xD5, 0xFC, 0x67, 0x01, 0x7F, 0xFF, 0x1E, 0x00, 0xFE, 0xFF, 0x01,
-       0x00, 0x07, 0x00, 0xBE, 0xFF, 0xEA, 0x00, 0xA2, 0xFD, 0x65, 0x05,
-       0x28, 0xF3, 0xDB, 0x3C, 0x78, 0x21, 0x30, 0xF3, 0xDF, 0x06, 0x3A,
-       0xFC, 0xE6, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x13, 0x00,
-       0xB2, 0xFF, 0x9D, 0x00, 0x27, 0xFF, 0xC3, 0x00, 0x1F, 0x00, 0x76,
-       0xFC, 0xA3, 0x47, 0x60, 0x0C, 0x4A, 0xF9, 0x4E, 0x04, 0x53, 0xFD,
-       0x79, 0x01, 0x5C, 0xFF, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B,
-       0x00, 0x58, 0xFF, 0x82, 0x01, 0x3F, 0xFD, 0x78, 0x04, 0xF2, 0xF8,
-       0x50, 0x0D, 0x5E, 0x47, 0xD5, 0xFB, 0x6F, 0x00, 0x96, 0x00, 0x40,
-       0xFF, 0x91, 0x00, 0xB7, 0xFF, 0x12, 0x00, 0xFD, 0xFF, 0x36, 0x00,
-       0x37, 0xFF, 0xE6, 0x01, 0x36, 0xFC, 0xEF, 0x06, 0xFC, 0xF2, 0x81,
-       0x22, 0x1C, 0x3C, 0xEC, 0xF2, 0x90, 0x05, 0x85, 0xFD, 0xFB, 0x00,
-       0xB6, 0xFF, 0x0A, 0x00, 0x01, 0x00, 0xFE, 0xFF, 0x1C, 0x00, 0x85,
-       0xFF, 0x5B, 0x01, 0xE9, 0xFC, 0x73, 0x06, 0xD8, 0xF1, 0xE5, 0x36,
-       0x19, 0x29, 0xF8, 0xF1, 0x29, 0x07, 0x37, 0xFC, 0xD8, 0x01, 0x42,
-       0xFF, 0x33, 0x00, 0xFD, 0xFF, 0x0B, 0x00, 0xD3, 0xFF, 0x47, 0x00,
-       0xD7, 0xFF, 0x82, 0xFF, 0x53, 0x02, 0x39, 0xF8, 0xFD, 0x44, 0x8D,
-       0x13, 0xD3, 0xF6, 0x72, 0x05, 0xCA, 0xFC, 0xB5, 0x01, 0x45, 0xFF,
-       0x31, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x23, 0x00, 0x75, 0xFF, 0x39,
-       0x01, 0xE0, 0xFD, 0x33, 0x03, 0x87, 0xFB, 0xA2, 0x06, 0xCB, 0x48,
-       0xEA, 0x00, 0x01, 0xFE, 0xE9, 0x01, 0x8A, 0xFE, 0xE8, 0x00, 0x95,
-       0xFF, 0x1A, 0x00, 0xFE, 0xFF, 0x35, 0x00, 0x38, 0xFF, 0xDA, 0x01,
-       0x6A, 0xFC, 0x53, 0x06, 0xBA, 0xF4, 0xCE, 0x1A, 0x32, 0x41, 0x1F,
-       0xF5, 0x1D, 0x04, 0x71, 0xFE, 0x71, 0x00, 0xFB, 0xFF, 0xF0, 0xFF,
-       0x05, 0x00, 0xFD, 0xFF, 0x2B, 0x00, 0x5B, 0xFF, 0xAB, 0x01, 0x6F,
-       0xFC, 0x08, 0x07, 0x7E, 0xF1, 0x21, 0x30, 0x67, 0x30, 0x7D, 0xF1,
-       0x05, 0x07, 0x73, 0xFC, 0xA8, 0x01, 0x5C, 0xFF, 0x2A, 0x00, 0xFD,
-       0xFF, 0x05, 0x00, 0xF2, 0xFF, 0xF8, 0xFF, 0x77, 0x00, 0x67, 0xFE,
-       0x2D, 0x04, 0x04, 0xF5, 0x07, 0x41, 0x1B, 0x1B, 0xA6, 0xF4, 0x5A,
-       0x06, 0x67, 0xFC, 0xDB, 0x01, 0x38, 0xFF, 0x36, 0x00, 0xFE, 0xFF,
-       0x1A, 0x00, 0x96, 0xFF, 0xE5, 0x00, 0x91, 0xFE, 0xDC, 0x01, 0x1A,
-       0xFE, 0xB3, 0x00, 0xC3, 0x48, 0xE1, 0x06, 0x6E, 0xFB, 0x40, 0x03,
-       0xDA, 0xFD, 0x3C, 0x01, 0x74, 0xFF, 0x23, 0x00, 0x00, 0x00, 0xFF,
-       0xFF, 0x31, 0x00, 0x46, 0xFF, 0xB3, 0x01, 0xCF, 0xFC, 0x67, 0x05,
-       0xEA, 0xF6, 0x44, 0x13, 0x1E, 0x45, 0x5E, 0xF8, 0x3F, 0x02, 0x8E,
-       0xFF, 0xD0, 0xFF, 0x4A, 0x00, 0xD2, 0xFF, 0x0B, 0x00, 0xFD, 0xFF,
-       0x33, 0x00, 0x41, 0xFF, 0xD9, 0x01, 0x36, 0xFC, 0x28, 0x07, 0x01,
-       0xF2, 0xCE, 0x28, 0x23, 0x37, 0xE0, 0xF1, 0x6B, 0x06, 0xEF, 0xFC,
-       0x57, 0x01, 0x87, 0xFF, 0x1B, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x0B,
-       0x00, 0xB4, 0xFF, 0x00, 0x01, 0x7E, 0xFD, 0x9C, 0x05, 0xDC, 0xF2,
-       0xE4, 0x3B, 0xCD, 0x22, 0xEE, 0xF2, 0xF3, 0x06, 0x35, 0xFC, 0xE6,
-       0x01, 0x37, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x11, 0x00, 0xB8, 0xFF,
-       0x8E, 0x00, 0x46, 0xFF, 0x8A, 0x00, 0x86, 0x00, 0xA7, 0xFB, 0x48,
-       0x47, 0x95, 0x0D, 0xD9, 0xF8, 0x84, 0x04, 0x39, 0xFD, 0x85, 0x01,
-       0x57, 0xFF, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x5D,
-       0xFF, 0x76, 0x01, 0x59, 0xFD, 0x42, 0x04, 0x63, 0xF9, 0x1C, 0x0C,
-       0xB6, 0x47, 0xA4, 0xFC, 0x07, 0x00, 0xD0, 0x00, 0x20, 0xFF, 0xA0,
-       0x00, 0xB1, 0xFF, 0x13, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x36, 0xFF,
-       0xE6, 0x01, 0x3B, 0xFC, 0xDA, 0x06, 0x3F, 0xF3, 0x2C, 0x21, 0x11,
-       0x3D, 0x3A, 0xF3, 0x58, 0x05, 0xAA, 0xFD, 0xE5, 0x00, 0xC1, 0xFF,
-       0x06, 0x00, 0x01, 0x00, 0xFE, 0xFF, 0x1F, 0x00, 0x7D, 0xFF, 0x6B,
-       0x01, 0xCF, 0xFC, 0x96, 0x06, 0xB7, 0xF1, 0xC6, 0x35, 0x64, 0x2A,
-       0xD4, 0xF1, 0x2B, 0x07, 0x3D, 0xFC, 0xD2, 0x01, 0x45, 0xFF, 0x32,
-       0x00, 0xFD, 0xFF, 0x0A, 0x00, 0xD9, 0xFF, 0x39, 0x00, 0xF4, 0xFF,
-       0x4E, 0xFF, 0xAC, 0x02, 0x98, 0xF7, 0x65, 0x44, 0xD6, 0x14, 0x6C,
-       0xF6, 0x9F, 0x05, 0xB6, 0xFC, 0xBD, 0x01, 0x42, 0xFF, 0x32, 0x00,
-       0xFF, 0xFF, 0x00, 0x00, 0x21, 0x00, 0x7A, 0xFF, 0x2B, 0x01, 0xFE,
-       0xFD, 0xF8, 0x02, 0xFB, 0xFB, 0x8D, 0x05, 0xE5, 0x48, 0xE3, 0x01,
-       0x91, 0xFD, 0x25, 0x02, 0x6B, 0xFE, 0xF7, 0x00, 0x8F, 0xFF, 0x1C,
-       0x00, 0xFE, 0xFF, 0x35, 0x00, 0x3A, 0xFF, 0xD5, 0x01, 0x78, 0xFC,
-       0x2F, 0x06, 0x13, 0xF5, 0x7C, 0x19, 0xF7, 0x41, 0x9B, 0xF5, 0xD1,
-       0x03, 0x9F, 0xFE, 0x57, 0x00, 0x08, 0x00, 0xEC, 0xFF, 0x06, 0x00,
-       0xFD, 0xFF, 0x2D, 0x00, 0x55, 0xFF, 0xB5, 0x01, 0x61, 0xFC, 0x16,
-       0x07, 0x85, 0xF1, 0xE6, 0x2E, 0x9E, 0x31, 0x7D, 0xF1, 0xF3, 0x06,
-       0x84, 0xFC, 0x9D, 0x01, 0x63, 0xFF, 0x28, 0x00, 0xFD, 0xFF, 0x04,
-       0x00, 0xF6, 0xFF, 0xEB, 0xFF, 0x91, 0x00, 0x3B, 0xFE, 0x75, 0x04,
-       0x92, 0xF4, 0x36, 0x40, 0x6E, 0x1C, 0x50, 0xF4, 0x7B, 0x06, 0x5B,
-       0xFC, 0xDF, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x18, 0x00,
-       0x9C, 0xFF, 0xD6, 0x00, 0xB1, 0xFE, 0xA1, 0x01, 0x89, 0xFE, 0xC3,
-       0xFF, 0x9C, 0x48, 0xFD, 0x07, 0xFA, 0xFA, 0x7A, 0x03, 0xBC, 0xFD,
-       0x49, 0x01, 0x6E, 0xFF, 0x24, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x30,
-       0x00, 0x49, 0xFF, 0xAA, 0x01, 0xE4, 0xFC, 0x38, 0x05, 0x54, 0xF7,
-       0xFE, 0x11, 0xAA, 0x45, 0x09, 0xF9, 0xE2, 0x01, 0xC4, 0xFF, 0xB3,
-       0xFF, 0x59, 0x00, 0xCD, 0xFF, 0x0D, 0x00, 0xFD, 0xFF, 0x34, 0x00,
-       0x3E, 0xFF, 0xDE, 0x01, 0x33, 0xFC, 0x22, 0x07, 0x2B, 0xF2, 0x80,
-       0x27, 0x3B, 0x38, 0x0A, 0xF2, 0x44, 0x06, 0x0B, 0xFD, 0x45, 0x01,
-       0x90, 0xFF, 0x18, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x0F, 0x00, 0xA9,
-       0xFF, 0x15, 0x01, 0x5B, 0xFD, 0xD0, 0x05, 0x97, 0xF2, 0xE6, 0x3A,
-       0x21, 0x24, 0xB1, 0xF2, 0x04, 0x07, 0x33, 0xFC, 0xE5, 0x01, 0x39,
-       0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x10, 0x00, 0xBE, 0xFF, 0x7F, 0x00,
-       0x65, 0xFF, 0x51, 0x00, 0xEB, 0x00, 0xE1, 0xFA, 0xE1, 0x46, 0xCD,
-       0x0E, 0x6A, 0xF8, 0xB8, 0x04, 0x20, 0xFD, 0x90, 0x01, 0x53, 0xFF,
-       0x2D, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x28, 0x00, 0x62, 0xFF, 0x6A,
-       0x01, 0x74, 0xFD, 0x0A, 0x04, 0xD5, 0xF9, 0xED, 0x0A, 0x03, 0x48,
-       0x7C, 0xFD, 0x9E, 0xFF, 0x0A, 0x01, 0x01, 0xFF, 0xAF, 0x00, 0xAB,
-       0xFF, 0x14, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE5, 0x01,
-       0x42, 0xFC, 0xC3, 0x06, 0x87, 0xF3, 0xD7, 0x1F, 0xFE, 0x3D, 0x91,
-       0xF3, 0x1D, 0x05, 0xD1, 0xFD, 0xCE, 0x00, 0xCC, 0xFF, 0x02, 0x00,
-       0x02, 0x00, 0xFE, 0xFF, 0x22, 0x00, 0x75, 0xFF, 0x7A, 0x01, 0xB8,
-       0xFC, 0xB4, 0x06, 0x9E, 0xF1, 0xA2, 0x34, 0xAD, 0x2B, 0xB6, 0xF1,
-       0x29, 0x07, 0x45, 0xFC, 0xCB, 0x01, 0x49, 0xFF, 0x31, 0x00, 0xFD,
-       0xFF, 0x09, 0x00, 0xDE, 0xFF, 0x2B, 0x00, 0x11, 0x00, 0x1B, 0xFF,
-       0x02, 0x03, 0xFE, 0xF6, 0xC3, 0x43, 0x22, 0x16, 0x07, 0xF6, 0xCA,
-       0x05, 0xA3, 0xFC, 0xC5, 0x01, 0x3F, 0xFF, 0x33, 0x00, 0xFF, 0xFF,
-       0x00, 0x00, 0x20, 0x00, 0x80, 0xFF, 0x1C, 0x01, 0x1C, 0xFE, 0xBD,
-       0x02, 0x6E, 0xFC, 0x7D, 0x04, 0xF3, 0x48, 0xE2, 0x02, 0x1F, 0xFD,
-       0x60, 0x02, 0x4C, 0xFE, 0x06, 0x01, 0x89, 0xFF, 0x1D, 0x00, 0xFE,
-       0xFF, 0x34, 0x00, 0x3C, 0xFF, 0xCF, 0x01, 0x88, 0xFC, 0x09, 0x06,
-       0x71, 0xF5, 0x2B, 0x18, 0xB2, 0x42, 0x20, 0xF6, 0x83, 0x03, 0xCF,
-       0xFE, 0x3C, 0x00, 0x15, 0x00, 0xE6, 0xFF, 0x07, 0x00, 0xFD, 0xFF,
-       0x2E, 0x00, 0x50, 0xFF, 0xBF, 0x01, 0x54, 0xFC, 0x20, 0x07, 0x94,
-       0xF1, 0xA6, 0x2D, 0xD0, 0x32, 0x85, 0xF1, 0xDD, 0x06, 0x96, 0xFC,
-       0x90, 0x01, 0x69, 0xFF, 0x26, 0x00, 0xFD, 0xFF, 0x03, 0x00, 0xFB,
-       0xFF, 0xDF, 0xFF, 0xA9, 0x00, 0x10, 0xFE, 0xB9, 0x04, 0x27, 0xF4,
-       0x5E, 0x3F, 0xC3, 0x1D, 0xFE, 0xF3, 0x99, 0x06, 0x50, 0xFC, 0xE2,
-       0x01, 0x36, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x17, 0x00, 0xA2, 0xFF,
-       0xC7, 0x00, 0xD0, 0xFE, 0x65, 0x01, 0xF6, 0xFE, 0xD9, 0xFE, 0x6A,
-       0x48, 0x1F, 0x09, 0x87, 0xFA, 0xB3, 0x03, 0xA0, 0xFD, 0x56, 0x01,
-       0x69, 0xFF, 0x26, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x2F, 0x00, 0x4D,
-       0xFF, 0xA0, 0x01, 0xFB, 0xFC, 0x07, 0x05, 0xBF, 0xF7, 0xBB, 0x10,
-       0x2B, 0x46, 0xBB, 0xF9, 0x83, 0x01, 0xFA, 0xFF, 0x95, 0xFF, 0x68,
-       0x00, 0xC7, 0xFF, 0x0E, 0x00, 0xFD, 0xFF, 0x35, 0x00, 0x3C, 0xFF,
-       0xE1, 0x01, 0x31, 0xFC, 0x19, 0x07, 0x5B, 0xF2, 0x30, 0x26, 0x4B,
-       0x39, 0x3B, 0xF2, 0x1A, 0x06, 0x29, 0xFD, 0x33, 0x01, 0x99, 0xFF,
-       0x15, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x13, 0x00, 0x9F, 0xFF, 0x28,
-       0x01, 0x3A, 0xFD, 0x00, 0x06, 0x5A, 0xF2, 0xDF, 0x39, 0x73, 0x25,
-       0x79, 0xF2, 0x12, 0x07, 0x31, 0xFC, 0xE3, 0x01, 0x3B, 0xFF, 0x35,
-       0x00, 0xFD, 0xFF, 0x0F, 0x00, 0xC4, 0xFF, 0x70, 0x00, 0x84, 0xFF,
-       0x19, 0x00, 0x4D, 0x01, 0x22, 0xFA, 0x70, 0x46, 0x0A, 0x10, 0xFC,
-       0xF7, 0xEB, 0x04, 0x08, 0xFD, 0x9A, 0x01, 0x4F, 0xFF, 0x2E, 0x00,
-       0xFF, 0xFF, 0x00, 0x00, 0x27, 0x00, 0x66, 0xFF, 0x5E, 0x01, 0x90,
-       0xFD, 0xD2, 0x03, 0x47, 0xFA, 0xC3, 0x09, 0x48, 0x48, 0x5A, 0xFE,
-       0x33, 0xFF, 0x45, 0x01, 0xE2, 0xFE, 0xBE, 0x00, 0xA5, 0xFF, 0x16,
-       0x00, 0xFE, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE3, 0x01, 0x4B, 0xFC,
-       0xA9, 0x06, 0xD2, 0xF3, 0x81, 0x1E, 0xE4, 0x3E, 0xEF, 0xF3, 0xDE,
-       0x04, 0xF9, 0xFD, 0xB7, 0x00, 0xD8, 0xFF, 0xFD, 0xFF, 0x03, 0x00,
-       0xFD, 0xFF, 0x24, 0x00, 0x6D, 0xFF, 0x88, 0x01, 0xA2, 0xFC, 0xD0,
-       0x06, 0x8C, 0xF1, 0x78, 0x33, 0xF2, 0x2C, 0x9E, 0xF1, 0x24, 0x07,
-       0x4E, 0xFC, 0xC3, 0x01, 0x4E, 0xFF, 0x2F, 0x00, 0xFD, 0xFF, 0x08,
-       0x00, 0xE4, 0xFF, 0x1D, 0x00, 0x2D, 0x00, 0xEA, 0xFE, 0x56, 0x03,
-       0x6D, 0xF6, 0x17, 0x43, 0x70, 0x17, 0xA6, 0xF5, 0xF3, 0x05, 0x91,
-       0xFC, 0xCC, 0x01, 0x3D, 0xFF, 0x34, 0x00, 0xFE, 0xFF, 0x1E, 0x00,
-       0x86, 0xFF, 0x0E, 0x01, 0x3B, 0xFE, 0x82, 0x02, 0xE0, 0xFC, 0x73,
-       0x03, 0xF6, 0x48, 0xE9, 0x03, 0xAD, 0xFC, 0x9C, 0x02, 0x2D, 0xFE,
-       0x14, 0x01, 0x83, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x33,
-       0x00, 0x3E, 0xFF, 0xC9, 0x01, 0x99, 0xFC, 0xE1, 0x05, 0xD1, 0xF5,
-       0xDC, 0x16, 0x65, 0x43, 0xAD, 0xF6, 0x31, 0x03, 0x00, 0xFF, 0x20,
-       0x00, 0x23, 0x00, 0xE1, 0xFF, 0x08, 0x00, 0xFD, 0xFF, 0x30, 0x00,
-       0x4C, 0xFF, 0xC7, 0x01, 0x4A, 0xFC, 0x27, 0x07, 0xA8, 0xF1, 0x62,
-       0x2C, 0xFD, 0x33, 0x93, 0xF1, 0xC4, 0x06, 0xAB, 0xFC, 0x82, 0x01,
-       0x71, 0xFF, 0x23, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0xFF, 0xFF, 0xD3,
-       0xFF, 0xC1, 0x00, 0xE7, 0xFD, 0xFA, 0x04, 0xC4, 0xF3, 0x7E, 0x3E,
-       0x19, 0x1F, 0xB0, 0xF3, 0xB5, 0x06, 0x47, 0xFC, 0xE4, 0x01, 0x36,
-       0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x15, 0x00, 0xA8, 0xFF, 0xB8, 0x00,
-       0xF0, 0xFE, 0x2B, 0x01, 0x63, 0xFF, 0xF6, 0xFD, 0x2C, 0x48, 0x47,
-       0x0A, 0x14, 0xFA, 0xEB, 0x03, 0x84, 0xFD, 0x63, 0x01, 0x64, 0xFF,
-       0x27, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x2D, 0x00, 0x51, 0xFF, 0x96,
-       0x01, 0x13, 0xFD, 0xD5, 0x04, 0x2C, 0xF8, 0x7D, 0x0F, 0xA3, 0x46,
-       0x76, 0xFA, 0x22, 0x01, 0x32, 0x00, 0x76, 0xFF, 0x76, 0x00, 0xC1,
-       0xFF, 0x0F, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x3A, 0xFF, 0xE4, 0x01,
-       0x32, 0xFC, 0x0C, 0x07, 0x91, 0xF2, 0xDD, 0x24, 0x54, 0x3A, 0x74,
-       0xF2, 0xEB, 0x05, 0x49, 0xFD, 0x20, 0x01, 0xA3, 0xFF, 0x11, 0x00,
-       0x00, 0x00, 0xFF, 0xFF, 0x16, 0x00, 0x95, 0xFF, 0x3B, 0x01, 0x1B,
-       0xFD, 0x2D, 0x06, 0x24, 0xF2, 0xD3, 0x38, 0xC6, 0x26, 0x45, 0xF2,
-       0x1D, 0x07, 0x32, 0xFC, 0xE0, 0x01, 0x3D, 0xFF, 0x35, 0x00, 0xFD,
-       0xFF, 0x0D, 0x00, 0xC9, 0xFF, 0x61, 0x00, 0xA2, 0xFF, 0xE2, 0xFF,
-       0xAE, 0x01, 0x6B, 0xF9, 0xF2, 0x45, 0x4A, 0x11, 0x8F, 0xF7, 0x1D,
-       0x05, 0xF1, 0xFC, 0xA4, 0x01, 0x4B, 0xFF, 0x2F, 0x00, 0xFF, 0xFF,
-       0x00, 0x00, 0x25, 0x00, 0x6C, 0xFF, 0x51, 0x01, 0xAC, 0xFD, 0x9A,
-       0x03, 0xBA, 0xFA, 0x9E, 0x08, 0x81, 0x48, 0x40, 0xFF, 0xC6, 0xFE,
-       0x80, 0x01, 0xC2, 0xFE, 0xCE, 0x00, 0x9F, 0xFF, 0x17, 0x00, 0xFE,
-       0xFF, 0x36, 0x00, 0x37, 0xFF, 0xE1, 0x01, 0x55, 0xFC, 0x8C, 0x06,
-       0x22, 0xF4, 0x2C, 0x1D, 0xC0, 0x3F, 0x55, 0xF4, 0x9B, 0x04, 0x23,
-       0xFE, 0x9F, 0x00, 0xE4, 0xFF, 0xF9, 0xFF, 0x04, 0x00, 0xFD, 0xFF,
-       0x27, 0x00, 0x66, 0xFF, 0x96, 0x01, 0x8E, 0xFC, 0xE7, 0x06, 0x81,
-       0xF1, 0x48, 0x32, 0x34, 0x2E, 0x8D, 0xF1, 0x1C, 0x07, 0x5A, 0xFC,
-       0xBB, 0x01, 0x53, 0xFF, 0x2E, 0x00, 0xFD, 0xFF, 0x07, 0x00, 0xE9,
-       0xFF, 0x0F, 0x00, 0x48, 0x00, 0xB9, 0xFE, 0xA6, 0x03, 0xE4, 0xF5,
-       0x60, 0x42, 0xC1, 0x18, 0x47, 0xF5, 0x1A, 0x06, 0x81, 0xFC, 0xD2,
-       0x01, 0x3B, 0xFF, 0x35, 0x00, 0xFE, 0xFF, 0x1C, 0x00, 0x8B, 0xFF,
-       0xFF, 0x00, 0x5A, 0xFE, 0x46, 0x02, 0x52, 0xFD, 0x70, 0x02, 0xED,
-       0x48, 0xF5, 0x04, 0x3B, 0xFC, 0xD7, 0x02, 0x0F, 0xFE, 0x23, 0x01,
-       0x7E, 0xFF, 0x20, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x33, 0x00, 0x40,
-       0xFF, 0xC1, 0x01, 0xAB, 0xFC, 0xB7, 0x05, 0x34, 0xF6, 0x8E, 0x15,
-       0x0B, 0x44, 0x42, 0xF7, 0xDC, 0x02, 0x32, 0xFF, 0x04, 0x00, 0x31,
-       0x00, 0xDC, 0xFF, 0x09, 0x00, 0xFD, 0xFF, 0x31, 0x00, 0x47, 0xFF,
-       0xCE, 0x01, 0x41, 0xFC, 0x2A, 0x07, 0xC2, 0xF1, 0x1B, 0x2B, 0x25,
-       0x35, 0xA8, 0xF1, 0xA7, 0x06, 0xC2, 0xFC, 0x74, 0x01, 0x78, 0xFF,
-       0x20, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0x04, 0x00, 0xC7, 0xFF, 0xD9,
-       0x00, 0xBF, 0xFD, 0x38, 0x05, 0x69, 0xF3, 0x96, 0x3D, 0x6F, 0x20,
-       0x66, 0xF3, 0xCE, 0x06, 0x3F, 0xFC, 0xE6, 0x01, 0x36, 0xFF, 0x36,
-       0x00, 0xFD, 0xFF, 0x14, 0x00, 0xAE, 0xFF, 0xA9, 0x00, 0x0F, 0xFF,
-       0xF0, 0x00, 0xCD, 0xFF, 0x1B, 0xFD, 0xE4, 0x47, 0x73, 0x0B, 0xA2,
-       0xF9, 0x23, 0x04, 0x68, 0xFD, 0x70, 0x01, 0x5F, 0xFF, 0x29, 0x00,
-       0x00, 0x00, 0xFF, 0xFF, 0x2C, 0x00, 0x55, 0xFF, 0x8B, 0x01, 0x2B,
-       0xFD, 0xA1, 0x04, 0x9B, 0xF8, 0x42, 0x0E, 0x0F, 0x47, 0x38, 0xFB,
-       0xBE, 0x00, 0x6A, 0x00, 0x58, 0xFF, 0x85, 0x00, 0xBB, 0xFF, 0x10,
-       0x00, 0xFD, 0xFF, 0x36, 0x00, 0x38, 0xFF, 0xE6, 0x01, 0x34, 0xFC,
-       0xFD, 0x06, 0xCB, 0xF2, 0x8A, 0x23, 0x58, 0x3B, 0xB4, 0xF2, 0xBA,
-       0x05, 0x6A, 0xFD, 0x0B, 0x01, 0xAE, 0xFF, 0x0D, 0x00, 0x00, 0x00,
-       0xFF, 0xFF, 0x19, 0x00, 0x8C, 0xFF, 0x4D, 0x01, 0xFE, 0xFC, 0x56,
-       0x06, 0xF7, 0xF1, 0xBF, 0x37, 0x15, 0x28, 0x18, 0xF2, 0x25, 0x07,
-       0x34, 0xFC, 0xDC, 0x01, 0x3F, 0xFF, 0x34, 0x00, 0xFD, 0xFF, 0x0C,
-       0x00, 0xCF, 0xFF, 0x52, 0x00, 0xC0, 0xFF, 0xAC, 0xFF, 0x0C, 0x02,
-       0xBC, 0xF8, 0x6D, 0x45, 0x8E, 0x12, 0x24, 0xF7, 0x4D, 0x05, 0xDB,
-       0xFC, 0xAE, 0x01, 0x48, 0xFF, 0x30, 0x00, 0xFF, 0xFF, 0x00, 0x00,
-       0x24, 0x00, 0x71, 0xFF, 0x43, 0x01, 0xC9, 0xFD, 0x60, 0x03, 0x2E,
-       0xFB, 0x7E, 0x07, 0xAF, 0x48, 0x2D, 0x00, 0x58, 0xFE, 0xBB, 0x01,
-       0xA3, 0xFE, 0xDD, 0x00, 0x99, 0xFF, 0x19, 0x00, 0xFE, 0xFF, 0x36,
-       0x00, 0x37, 0xFF, 0xDD, 0x01, 0x60, 0xFC, 0x6D, 0x06, 0x76, 0xF4,
-       0xD8, 0x1B, 0x95, 0x40, 0xC3, 0xF4, 0x56, 0x04, 0x4E, 0xFE, 0x85,
-       0x00, 0xF1, 0xFF, 0xF4, 0xFF, 0x04, 0x00, 0xFD, 0xFF, 0x29, 0x00,
-       0x60, 0xFF, 0xA2, 0x01, 0x7C, 0xFC, 0xFB, 0x06, 0x7C, 0xF1, 0x15,
-       0x31, 0x73, 0x2F, 0x81, 0xF1, 0x10, 0x07, 0x67, 0xFC, 0xB1, 0x01,
-       0x58, 0xFF, 0x2C, 0x00, 0xFD, 0xFF, 0x06, 0x00, 0xEE, 0xFF, 0x02,
-       0x00, 0x63, 0x00, 0x8A, 0xFE, 0xF3, 0x03, 0x63, 0xF5, 0xA1, 0x41,
-       0x12, 0x1A, 0xEB, 0xF4, 0x3F, 0x06, 0x72, 0xFC, 0xD7, 0x01, 0x39,
-       0xFF, 0x35, 0x00, 0xFE, 0xFF, 0x1B, 0x00, 0x91, 0xFF, 0xF1, 0x00,
-       0x79, 0xFE, 0x0A, 0x02, 0xC3, 0xFD, 0x73, 0x01, 0xDB, 0x48, 0x07,
-       0x06, 0xC7, 0xFB, 0x12, 0x03, 0xF1, 0xFD, 0x31, 0x01, 0x78, 0xFF,
-       0x22, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x32, 0x00, 0x43, 0xFF, 0xBA,
-       0x01, 0xBF, 0xFC, 0x8B, 0x05, 0x99, 0xF6, 0x43, 0x14, 0xA9, 0x44,
-       0xDE, 0xF7, 0x85, 0x02, 0x65, 0xFF, 0xE7, 0xFF, 0x3F, 0x00, 0xD6,
-       0xFF, 0x0A, 0x00, 0xFD, 0xFF, 0x32, 0x00, 0x44, 0xFF, 0xD5, 0x01,
-       0x3A, 0xFC, 0x2A, 0x07, 0xE3, 0xF1, 0xD1, 0x29, 0x46, 0x36, 0xC5,
-       0xF1, 0x87, 0x06, 0xDA, 0xFC, 0x64, 0x01, 0x80, 0xFF, 0x1E, 0x00,
-       0xFE, 0xFF, 0x01, 0x00, 0x08, 0x00, 0xBC, 0xFF, 0xEF, 0x00, 0x9A,
-       0xFD, 0x72, 0x05, 0x16, 0xF3, 0xA5, 0x3C, 0xC4, 0x21, 0x21, 0xF3,
-       0xE4, 0x06, 0x39, 0xFC, 0xE6, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFD,
-       0xFF, 0x12, 0x00, 0xB3, 0xFF, 0x99, 0x00, 0x2E, 0xFF, 0xB6, 0x00,
-       0x36, 0x00, 0x47, 0xFC, 0x90, 0x47, 0xA4, 0x0C, 0x31, 0xF9, 0x5A,
-       0x04, 0x4E, 0xFD, 0x7C, 0x01, 0x5B, 0xFF, 0x2A, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x2B, 0x00, 0x59, 0xFF, 0x80, 0x01, 0x45, 0xFD, 0x6C,
-       0x04, 0x0B, 0xF9, 0x0B, 0x0D, 0x73, 0x47, 0x02, 0xFC, 0x58, 0x00,
-       0xA3, 0x00, 0x39, 0xFF, 0x94, 0x00, 0xB5, 0xFF, 0x12, 0x00, 0xFD,
-       0xFF, 0x36, 0x00, 0x37, 0xFF, 0xE6, 0x01, 0x37, 0xFC, 0xEB, 0x06,
-       0x0B, 0xF3, 0x35, 0x22, 0x52, 0x3C, 0xFD, 0xF2, 0x84, 0x05, 0x8D,
-       0xFD, 0xF6, 0x00, 0xB8, 0xFF, 0x09, 0x00, 0x01, 0x00, 0xFE, 0xFF,
-       0x1D, 0x00, 0x83, 0xFF, 0x5E, 0x01, 0xE3, 0xFC, 0x7B, 0x06, 0xD0,
-       0xF1, 0xA5, 0x36, 0x62, 0x29, 0xEF, 0xF1, 0x29, 0x07, 0x39, 0xFC,
-       0xD7, 0x01, 0x42, 0xFF, 0x33, 0x00, 0xFD, 0xFF, 0x0B, 0x00, 0xD5,
-       0xFF, 0x44, 0x00, 0xDD, 0xFF, 0x77, 0xFF, 0x67, 0x02, 0x14, 0xF8,
-       0xDC, 0x44, 0xD5, 0x13, 0xBC, 0xF6, 0x7C, 0x05, 0xC5, 0xFC, 0xB7,
-       0x01, 0x44, 0xFF, 0x31, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x22, 0x00,
-       0x76, 0xFF, 0x35, 0x01, 0xE7, 0xFD, 0x26, 0x03, 0xA1, 0xFB, 0x64,
-       0x06, 0xD2, 0x48, 0x21, 0x01, 0xE8, 0xFD, 0xF7, 0x01, 0x83, 0xFE,
-       0xEC, 0x00, 0x93, 0xFF, 0x1A, 0x00, 0xFE, 0xFF, 0x35, 0x00, 0x39,
-       0xFF, 0xD9, 0x01, 0x6D, 0xFC, 0x4B, 0x06, 0xCD, 0xF4, 0x83, 0x1A,
-       0x5F, 0x41, 0x3A, 0xF5, 0x0C, 0x04, 0x7B, 0xFE, 0x6C, 0x00, 0xFE,
-       0xFF, 0xEF, 0xFF, 0x05, 0x00, 0xFD, 0xFF, 0x2B, 0x00, 0x5A, 0xFF,
-       0xAD, 0x01, 0x6C, 0xFC, 0x0C, 0x07, 0x7F, 0xF1, 0xDC, 0x2F, 0xAD,
-       0x30, 0x7D, 0xF1, 0x01, 0x07, 0x76, 0xFC, 0xA6, 0x01, 0x5E, 0xFF,
-       0x2A, 0x00, 0xFD, 0xFF, 0x05, 0x00, 0xF3, 0xFF, 0xF5, 0xFF, 0x7D,
-       0x00, 0x5D, 0xFE, 0x3E, 0x04, 0xEA, 0xF4, 0xD9, 0x40, 0x66, 0x1B,
-       0x93, 0xF4, 0x62, 0x06, 0x64, 0xFC, 0xDC, 0x01, 0x38, 0xFF, 0x36,
-       0x00, 0xFE, 0xFF, 0x19, 0x00, 0x97, 0xFF, 0xE2, 0x00, 0x98, 0xFE,
-       0xCF, 0x01, 0x33, 0xFE, 0x7D, 0x00, 0xBB, 0x48, 0x1F, 0x07, 0x54,
-       0xFB, 0x4C, 0x03, 0xD3, 0xFD, 0x3F, 0x01, 0x73, 0xFF, 0x23, 0x00,
-       0x00, 0x00, 0xFF, 0xFF, 0x31, 0x00, 0x46, 0xFF, 0xB1, 0x01, 0xD3,
-       0xFC, 0x5D, 0x05, 0x01, 0xF7, 0xFB, 0x12, 0x3F, 0x45, 0x83, 0xF8,
-       0x2A, 0x02, 0x9A, 0xFF, 0xCA, 0xFF, 0x4E, 0x00, 0xD1, 0xFF, 0x0C,
-       0x00, 0xFD, 0xFF, 0x34, 0x00, 0x40, 0xFF, 0xDA, 0x01, 0x35, 0xFC,
-       0x27, 0x07, 0x09, 0xF2, 0x85, 0x28, 0x63, 0x37, 0xE9, 0xF1, 0x63,
-       0x06, 0xF5, 0xFC, 0x53, 0x01, 0x89, 0xFF, 0x1A, 0x00, 0xFE, 0xFF,
-       0x00, 0x00, 0x0C, 0x00, 0xB1, 0xFF, 0x04, 0x01, 0x76, 0xFD, 0xA8,
-       0x05, 0xCC, 0xF2, 0xAB, 0x3B, 0x18, 0x23, 0xE0, 0xF2, 0xF7, 0x06,
-       0x35, 0xFC, 0xE6, 0x01, 0x38, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x11,
-       0x00, 0xB9, 0xFF, 0x8A, 0x00, 0x4D, 0xFF, 0x7D, 0x00, 0x9C, 0x00,
-       0x7B, 0xFB, 0x31, 0x47, 0xD9, 0x0D, 0xC0, 0xF8, 0x8F, 0x04, 0x34,
-       0xFD, 0x87, 0x01, 0x56, 0xFF, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x29, 0x00, 0x5E, 0xFF, 0x74, 0x01, 0x5F, 0xFD, 0x35, 0x04, 0x7C,
-       0xF9, 0xD8, 0x0B, 0xC9, 0x47, 0xD4, 0xFC, 0xF0, 0xFF, 0xDD, 0x00,
-       0x19, 0xFF, 0xA4, 0x00, 0xAF, 0xFF, 0x13, 0x00, 0xFD, 0xFF, 0x36,
-       0x00, 0x36, 0xFF, 0xE6, 0x01, 0x3D, 0xFC, 0xD5, 0x06, 0x4F, 0xF3,
-       0xE0, 0x20, 0x45, 0x3D, 0x4D, 0xF3, 0x4B, 0x05, 0xB3, 0xFD, 0xE0,
-       0x00, 0xC3, 0xFF, 0x05, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0x20, 0x00,
-       0x7B, 0xFF, 0x6E, 0x01, 0xCA, 0xFC, 0x9D, 0x06, 0xB1, 0xF1, 0x86,
-       0x35, 0xAE, 0x2A, 0xCD, 0xF1, 0x2B, 0x07, 0x3F, 0xFC, 0xD1, 0x01,
-       0x46, 0xFF, 0x32, 0x00, 0xFD, 0xFF, 0x0A, 0x00, 0xDA, 0xFF, 0x36,
-       0x00, 0xFA, 0xFF, 0x43, 0xFF, 0xBF, 0x02, 0x75, 0xF7, 0x42, 0x44,
-       0x20, 0x15, 0x55, 0xF6, 0xA9, 0x05, 0xB2, 0xFC, 0xBF, 0x01, 0x41,
-       0xFF, 0x32, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x21, 0x00, 0x7C, 0xFF,
-       0x27, 0x01, 0x05, 0xFE, 0xEB, 0x02, 0x14, 0xFC, 0x50, 0x05, 0xEA,
-       0x48, 0x1B, 0x02, 0x78, 0xFD, 0x32, 0x02, 0x64, 0xFE, 0xFA, 0x00,
-       0x8D, 0xFF, 0x1C, 0x00, 0xFE, 0xFF, 0x35, 0x00, 0x3A, 0xFF, 0xD4,
-       0x01, 0x7C, 0xFC, 0x27, 0x06, 0x28, 0xF5, 0x31, 0x19, 0x21, 0x42,
-       0xB8, 0xF5, 0xC0, 0x03, 0xAA, 0xFE, 0x51, 0x00, 0x0B, 0x00, 0xEA,
-       0xFF, 0x06, 0x00, 0xFD, 0xFF, 0x2D, 0x00, 0x54, 0xFF, 0xB7, 0x01,
-       0x5E, 0xFC, 0x19, 0x07, 0x88, 0xF1, 0x9F, 0x2E, 0xE3, 0x31, 0x7E,
-       0xF1, 0xEE, 0x06, 0x88, 0xFC, 0x9A, 0x01, 0x64, 0xFF, 0x28, 0x00,
-       0xFD, 0xFF, 0x04, 0x00, 0xF7, 0xFF, 0xE8, 0xFF, 0x96, 0x00, 0x31,
-       0xFE, 0x84, 0x04, 0x79, 0xF4, 0x07, 0x40, 0xBA, 0x1C, 0x3E, 0xF4,
-       0x82, 0x06, 0x58, 0xFC, 0xE0, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFE,
-       0xFF, 0x18, 0x00, 0x9D, 0xFF, 0xD3, 0x00, 0xB8, 0xFE, 0x93, 0x01,
-       0xA1, 0xFE, 0x8E, 0xFF, 0x92, 0x48, 0x3D, 0x08, 0xE1, 0xFA, 0x86,
-       0x03, 0xB6, 0xFD, 0x4C, 0x01, 0x6D, 0xFF, 0x25, 0x00, 0x00, 0x00,
-       0xFF, 0xFF, 0x30, 0x00, 0x4A, 0xFF, 0xA8, 0x01, 0xE9, 0xFC, 0x2D,
-       0x05, 0x6B, 0xF7, 0xB6, 0x11, 0xC8, 0x45, 0x30, 0xF9, 0xCD, 0x01,
-       0xD0, 0xFF, 0xAC, 0xFF, 0x5C, 0x00, 0xCB, 0xFF, 0x0D, 0x00, 0xFD,
-       0xFF, 0x34, 0x00, 0x3E, 0xFF, 0xDF, 0x01, 0x33, 0xFC, 0x20, 0x07,
-       0x35, 0xF2, 0x36, 0x27, 0x78, 0x38, 0x14, 0xF2, 0x3B, 0x06, 0x11,
-       0xFD, 0x41, 0x01, 0x92, 0xFF, 0x17, 0x00, 0xFF, 0xFF, 0x00, 0x00,
-       0x10, 0x00, 0xA7, 0xFF, 0x19, 0x01, 0x53, 0xFD, 0xDB, 0x05, 0x88,
-       0xF2, 0xAD, 0x3A, 0x6D, 0x24, 0xA4, 0xF2, 0x08, 0x07, 0x32, 0xFC,
-       0xE5, 0x01, 0x39, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x10, 0x00, 0xBF,
-       0xFF, 0x7B, 0x00, 0x6C, 0xFF, 0x44, 0x00, 0x01, 0x01, 0xB6, 0xFA,
-       0xC8, 0x46, 0x13, 0x0F, 0x51, 0xF8, 0xC4, 0x04, 0x1B, 0xFD, 0x92,
-       0x01, 0x52, 0xFF, 0x2D, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x28, 0x00,
-       0x63, 0xFF, 0x67, 0x01, 0x7A, 0xFD, 0xFE, 0x03, 0xEE, 0xF9, 0xAA,
-       0x0A, 0x16, 0x48, 0xAC, 0xFD, 0x86, 0xFF, 0x17, 0x01, 0xFA, 0xFE,
-       0xB3, 0x00, 0xAA, 0xFF, 0x15, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x36,
-       0xFF, 0xE5, 0x01, 0x44, 0xFC, 0xBD, 0x06, 0x97, 0xF3, 0x8A, 0x1F,
-       0x31, 0x3E, 0xA5, 0xF3, 0x0F, 0x05, 0xDA, 0xFD, 0xC9, 0x00, 0xCF,
-       0xFF, 0x01, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0x22, 0x00, 0x73, 0xFF,
-       0x7D, 0x01, 0xB3, 0xFC, 0xBB, 0x06, 0x9A, 0xF1, 0x60, 0x34, 0xF5,
-       0x2B, 0xB0, 0xF1, 0x28, 0x07, 0x47, 0xFC, 0xCA, 0x01, 0x4A, 0xFF,
-       0x30, 0x00, 0xFD, 0xFF, 0x09, 0x00, 0xDF, 0xFF, 0x28, 0x00, 0x17,
-       0x00, 0x10, 0xFF, 0x15, 0x03, 0xDD, 0xF6, 0x9E, 0x43, 0x6C, 0x16,
-       0xF1, 0xF5, 0xD3, 0x05, 0x9F, 0xFC, 0xC6, 0x01, 0x3F, 0xFF, 0x33,
-       0x00, 0xFF, 0xFF, 0x00, 0x00, 0x1F, 0x00, 0x81, 0xFF, 0x19, 0x01,
-       0x23, 0xFE, 0xB0, 0x02, 0x87, 0xFC, 0x41, 0x04, 0xF4, 0x48, 0x1C,
-       0x03, 0x06, 0xFD, 0x6E, 0x02, 0x45, 0xFE, 0x09, 0x01, 0x88, 0xFF,
-       0x1D, 0x00, 0xFE, 0xFF, 0x34, 0x00, 0x3C, 0xFF, 0xCE, 0x01, 0x8C,
-       0xFC, 0x00, 0x06, 0x86, 0xF5, 0xE0, 0x17, 0xDB, 0x42, 0x3F, 0xF6,
-       0x71, 0x03, 0xD9, 0xFE, 0x36, 0x00, 0x18, 0x00, 0xE5, 0xFF, 0x07,
-       0x00, 0xFD, 0xFF, 0x2F, 0x00, 0x4F, 0xFF, 0xC1, 0x01, 0x52, 0xFC,
-       0x22, 0x07, 0x98, 0xF1, 0x5E, 0x2D, 0x13, 0x33, 0x87, 0xF1, 0xD8,
-       0x06, 0x9B, 0xFC, 0x8D, 0x01, 0x6B, 0xFF, 0x25, 0x00, 0xFD, 0xFF,
-       0x03, 0x00, 0xFC, 0xFF, 0xDC, 0xFF, 0xAF, 0x00, 0x07, 0xFE, 0xC8,
-       0x04, 0x10, 0xF4, 0x2D, 0x3F, 0x0F, 0x1E, 0xED, 0xF3, 0xA0, 0x06,
-       0x4E, 0xFC, 0xE3, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x16,
-       0x00, 0xA3, 0xFF, 0xC3, 0x00, 0xD7, 0xFE, 0x58, 0x01, 0x0F, 0xFF,
-       0xA6, 0xFE, 0x5D, 0x48, 0x61, 0x09, 0x6E, 0xFA, 0xC0, 0x03, 0x99,
-       0xFD, 0x59, 0x01, 0x68, 0xFF, 0x26, 0x00, 0x00, 0x00, 0xFF, 0xFF,
-       0x2E, 0x00, 0x4E, 0xFF, 0x9E, 0x01, 0x00, 0xFD, 0xFC, 0x04, 0xD7,
-       0xF7, 0x75, 0x10, 0x48, 0x46, 0xE4, 0xF9, 0x6E, 0x01, 0x06, 0x00,
-       0x8E, 0xFF, 0x6B, 0x00, 0xC6, 0xFF, 0x0E, 0x00, 0xFD, 0xFF, 0x35,
-       0x00, 0x3B, 0xFF, 0xE2, 0x01, 0x31, 0xFC, 0x16, 0x07, 0x67, 0xF2,
-       0xE5, 0x25, 0x87, 0x39, 0x47, 0xF2, 0x10, 0x06, 0x30, 0xFD, 0x2F,
-       0x01, 0x9C, 0xFF, 0x14, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x13, 0x00,
-       0x9D, 0xFF, 0x2D, 0x01, 0x33, 0xFD, 0x0B, 0x06, 0x4D, 0xF2, 0xA5,
-       0x39, 0xBF, 0x25, 0x6D, 0xF2, 0x15, 0x07, 0x31, 0xFC, 0xE2, 0x01,
-       0x3B, 0xFF, 0x35, 0x00, 0xFD, 0xFF, 0x0E, 0x00, 0xC5, 0xFF, 0x6D,
-       0x00, 0x8B, 0xFF, 0x0D, 0x00, 0x63, 0x01, 0xF9, 0xF9, 0x55, 0x46,
-       0x51, 0x10, 0xE3, 0xF7, 0xF7, 0x04, 0x03, 0xFD, 0x9D, 0x01, 0x4E,
-       0xFF, 0x2E, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x26, 0x00, 0x68, 0xFF,
-       0x5B, 0x01, 0x96, 0xFD, 0xC6, 0x03, 0x61, 0xFA, 0x81, 0x09, 0x57,
-       0x48, 0x8D, 0xFE, 0x1B, 0xFF, 0x52, 0x01, 0xDB, 0xFE, 0xC2, 0x00,
-       0xA4, 0xFF, 0x16, 0x00, 0xFE, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE3,
-       0x01, 0x4D, 0xFC, 0xA3, 0x06, 0xE4, 0xF3, 0x36, 0x1E, 0x16, 0x3F,
-       0x05, 0xF4, 0xCF, 0x04, 0x02, 0xFE, 0xB2, 0x00, 0xDB, 0xFF, 0xFC,
-       0xFF, 0x03, 0x00, 0xFD, 0xFF, 0x25, 0x00, 0x6C, 0xFF, 0x8B, 0x01,
-       0x9D, 0xFC, 0xD5, 0x06, 0x89, 0xF1, 0x35, 0x33, 0x3A, 0x2D, 0x9A,
-       0xF1, 0x23, 0x07, 0x51, 0xFC, 0xC2, 0x01, 0x4F, 0xFF, 0x2F, 0x00,
-       0xFD, 0xFF, 0x07, 0x00, 0xE5, 0xFF, 0x1A, 0x00, 0x33, 0x00, 0xDF,
-       0xFE, 0x68, 0x03, 0x4E, 0xF6, 0xEE, 0x42, 0xBB, 0x17, 0x90, 0xF5,
-       0xFC, 0x05, 0x8E, 0xFC, 0xCD, 0x01, 0x3C, 0xFF, 0x34, 0x00, 0xFE,
-       0xFF, 0x1E, 0x00, 0x87, 0xFF, 0x0B, 0x01, 0x42, 0xFE, 0x74, 0x02,
-       0xF9, 0xFC, 0x39, 0x03, 0xF5, 0x48, 0x24, 0x04, 0x94, 0xFC, 0xA9,
-       0x02, 0x27, 0xFE, 0x18, 0x01, 0x82, 0xFF, 0x1F, 0x00, 0x00, 0x00,
-       0xFF, 0xFF, 0x33, 0x00, 0x3E, 0xFF, 0xC7, 0x01, 0x9D, 0xFC, 0xD8,
-       0x05, 0xE7, 0xF5, 0x91, 0x16, 0x89, 0x43, 0xCD, 0xF6, 0x1E, 0x03,
-       0x0B, 0xFF, 0x1A, 0x00, 0x26, 0x00, 0xE0, 0xFF, 0x08, 0x00, 0xFD,
-       0xFF, 0x30, 0x00, 0x4B, 0xFF, 0xC9, 0x01, 0x48, 0xFC, 0x28, 0x07,
-       0xAD, 0xF1, 0x19, 0x2C, 0x3F, 0x34, 0x97, 0xF1, 0xBE, 0x06, 0xB0,
-       0xFC, 0x7F, 0x01, 0x72, 0xFF, 0x23, 0x00, 0xFE, 0xFF, 0x02, 0x00,
-       0x00, 0x00, 0xD0, 0xFF, 0xC7, 0x00, 0xDE, 0xFD, 0x08, 0x05, 0xB0,
-       0xF3, 0x4A, 0x3E, 0x64, 0x1F, 0xA0, 0xF3, 0xBB, 0x06, 0x45, 0xFC,
-       0xE5, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x15, 0x00, 0xA9,
-       0xFF, 0xB4, 0x00, 0xF7, 0xFE, 0x1D, 0x01, 0x7A, 0xFF, 0xC5, 0xFD,
-       0x1D, 0x48, 0x89, 0x0A, 0xFB, 0xF9, 0xF8, 0x03, 0x7D, 0xFD, 0x66,
-       0x01, 0x63, 0xFF, 0x28, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x2D, 0x00,
-       0x52, 0xFF, 0x93, 0x01, 0x18, 0xFD, 0xC9, 0x04, 0x45, 0xF8, 0x36,
-       0x0F, 0xBB, 0x46, 0xA1, 0xFA, 0x0C, 0x01, 0x3E, 0x00, 0x70, 0xFF,
-       0x7A, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x39,
-       0xFF, 0xE4, 0x01, 0x32, 0xFC, 0x09, 0x07, 0x9D, 0xF2, 0x92, 0x24,
-       0x8F, 0x3A, 0x82, 0xF2, 0xE1, 0x05, 0x50, 0xFD, 0x1B, 0x01, 0xA6,
-       0xFF, 0x10, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x17, 0x00, 0x93, 0xFF,
-       0x3F, 0x01, 0x15, 0xFD, 0x36, 0x06, 0x19, 0xF2, 0x97, 0x38, 0x11,
-       0x27, 0x3B, 0xF2, 0x1F, 0x07, 0x32, 0xFC, 0xDF, 0x01, 0x3D, 0xFF,
-       0x34, 0x00, 0xFD, 0xFF, 0x0D, 0x00, 0xCB, 0xFF, 0x5E, 0x00, 0xA9,
-       0xFF, 0xD6, 0xFF, 0xC3, 0x01, 0x43, 0xF9, 0xD7, 0x45, 0x92, 0x11,
-       0x77, 0xF7, 0x28, 0x05, 0xEC, 0xFC, 0xA7, 0x01, 0x4A, 0xFF, 0x2F,
-       0x00, 0xFF, 0xFF, 0x00, 0x00, 0x25, 0x00, 0x6D, 0xFF, 0x4E, 0x01,
-       0xB3, 0xFD, 0x8D, 0x03, 0xD4, 0xFA, 0x5D, 0x08, 0x8D, 0x48, 0x74,
-       0xFF, 0xAE, 0xFE, 0x8D, 0x01, 0xBB, 0xFE, 0xD1, 0x00, 0x9E, 0xFF,
-       0x18, 0x00, 0xFE, 0xFF, 0x36, 0x00, 0x37, 0xFF, 0xE0, 0x01, 0x57,
-       0xFC, 0x85, 0x06, 0x34, 0xF4, 0xE0, 0x1C, 0xF0, 0x3F, 0x6D, 0xF4,
-       0x8C, 0x04, 0x2C, 0xFE, 0x99, 0x00, 0xE7, 0xFF, 0xF8, 0xFF, 0x04,
-       0x00, 0xFD, 0xFF, 0x27, 0x00, 0x65, 0xFF, 0x98, 0x01, 0x8A, 0xFC,
-       0xEC, 0x06, 0x7F, 0xF1, 0x04, 0x32, 0x7B, 0x2E, 0x8A, 0xF1, 0x1A,
-       0x07, 0x5D, 0xFC, 0xB8, 0x01, 0x54, 0xFF, 0x2D, 0x00, 0xFD, 0xFF,
-       0x06, 0x00, 0xEA, 0xFF, 0x0C, 0x00, 0x4E, 0x00, 0xAF, 0xFE, 0xB8,
-       0x03, 0xC7, 0xF5, 0x38, 0x42, 0x0C, 0x19, 0x32, 0xF5, 0x23, 0x06,
-       0x7D, 0xFC, 0xD3, 0x01, 0x3A, 0xFF, 0x35, 0x00, 0xFE, 0xFF, 0x1C,
-       0x00, 0x8D, 0xFF, 0xFC, 0x00, 0x61, 0xFE, 0x39, 0x02, 0x6B, 0xFD,
-       0x37, 0x02, 0xEB, 0x48, 0x31, 0x05, 0x21, 0xFC, 0xE4, 0x02, 0x08,
-       0xFE, 0x26, 0x01, 0x7C, 0xFF, 0x21, 0x00, 0x00, 0x00, 0xFF, 0xFF,
-       0x32, 0x00, 0x41, 0xFF, 0xC0, 0x01, 0xAF, 0xFC, 0xAD, 0x05, 0x4A,
-       0xF6, 0x44, 0x15, 0x2F, 0x44, 0x64, 0xF7, 0xC9, 0x02, 0x3D, 0xFF,
-       0xFE, 0xFF, 0x34, 0x00, 0xDB, 0xFF, 0x09, 0x00, 0xFD, 0xFF, 0x32,
-       0x00, 0x47, 0xFF, 0xD0, 0x01, 0x40, 0xFC, 0x2A, 0x07, 0xCA, 0xF1,
-       0xD1, 0x2A, 0x65, 0x35, 0xAE, 0xF1, 0xA0, 0x06, 0xC7, 0xFC, 0x70,
-       0x01, 0x7A, 0xFF, 0x20, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0x05, 0x00,
-       0xC5, 0xFF, 0xDE, 0x00, 0xB7, 0xFD, 0x45, 0x05, 0x56, 0xF3, 0x61,
-       0x3D, 0xBA, 0x20, 0x56, 0xF3, 0xD3, 0x06, 0x3E, 0xFC, 0xE6, 0x01,
-       0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x13, 0x00, 0xAF, 0xFF, 0xA5,
-       0x00, 0x16, 0xFF, 0xE3, 0x00, 0xE4, 0xFF, 0xEB, 0xFC, 0xD2, 0x47,
-       0xB6, 0x0B, 0x89, 0xF9, 0x2F, 0x04, 0x62, 0xFD, 0x72, 0x01, 0x5E,
-       0xFF, 0x29, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x2C, 0x00, 0x56, 0xFF,
-       0x88, 0x01, 0x31, 0xFD, 0x95, 0x04, 0xB4, 0xF8, 0xFC, 0x0D, 0x26,
-       0x47, 0x64, 0xFB, 0xA7, 0x00, 0x77, 0x00, 0x51, 0xFF, 0x89, 0x00,
-       0xBA, 0xFF, 0x11, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x38, 0xFF, 0xE6,
-       0x01, 0x34, 0xFC, 0xF9, 0x06, 0xD9, 0xF2, 0x3F, 0x23, 0x90, 0x3B,
-       0xC4, 0xF2, 0xAE, 0x05, 0x72, 0xFD, 0x07, 0x01, 0xB0, 0xFF, 0x0C,
-       0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1A, 0x00, 0x8A, 0xFF, 0x51, 0x01,
-       0xF8, 0xFC, 0x5E, 0x06, 0xED, 0xF1, 0x82, 0x37, 0x60, 0x28, 0x0E,
-       0xF2, 0x26, 0x07, 0x35, 0xFC, 0xDB, 0x01, 0x40, 0xFF, 0x34, 0x00,
-       0xFD, 0xFF, 0x0C, 0x00, 0xD0, 0xFF, 0x4F, 0x00, 0xC7, 0xFF, 0xA0,
-       0xFF, 0x20, 0x02, 0x96, 0xF8, 0x4E, 0x45, 0xD7, 0x12, 0x0D, 0xF7,
-       0x58, 0x05, 0xD6, 0xFC, 0xB0, 0x01, 0x47, 0xFF, 0x30, 0x00, 0xFF,
-       0xFF, 0x00, 0x00, 0x23, 0x00, 0x72, 0xFF, 0x40, 0x01, 0xD0, 0xFD,
-       0x53, 0x03, 0x47, 0xFB, 0x3F, 0x07, 0xB8, 0x48, 0x62, 0x00, 0x3F,
-       0xFE, 0xC8, 0x01, 0x9C, 0xFE, 0xE0, 0x00, 0x98, 0xFF, 0x19, 0x00,
-       0xFE, 0xFF, 0x36, 0x00, 0x38, 0xFF, 0xDC, 0x01, 0x63, 0xFC, 0x66,
-       0x06, 0x89, 0xF4, 0x8C, 0x1B, 0xC3, 0x40, 0xDD, 0xF4, 0x46, 0x04,
-       0x58, 0xFE, 0x80, 0x00, 0xF4, 0xFF, 0xF3, 0xFF, 0x05, 0x00, 0xFD,
-       0xFF, 0x29, 0x00, 0x5F, 0xFF, 0xA5, 0x01, 0x78, 0xFC, 0xFF, 0x06,
-       0x7D, 0xF1, 0xCF, 0x30, 0xB8, 0x2F, 0x80, 0xF1, 0x0D, 0x07, 0x6A,
-       0xFC, 0xAE, 0x01, 0x59, 0xFF, 0x2B, 0x00, 0xFD, 0xFF, 0x05, 0x00,
-       0xEF, 0xFF, 0xFF, 0xFF, 0x69, 0x00, 0x80, 0xFE, 0x04, 0x04, 0x48,
-       0xF5, 0x74, 0x41, 0x5D, 0x1A, 0xD7, 0xF4, 0x47, 0x06, 0x6F, 0xFC,
-       0xD8, 0x01, 0x39, 0xFF, 0x35, 0x00, 0xFE, 0xFF, 0x1B, 0x00, 0x93,
-       0xFF, 0xED, 0x00, 0x80, 0xFE, 0xFD, 0x01, 0xDC, 0xFD, 0x3C, 0x01,
-       0xD5, 0x48, 0x45, 0x06, 0xAE, 0xFB, 0x1F, 0x03, 0xEA, 0xFD, 0x34,
-       0x01, 0x77, 0xFF, 0x22, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x31, 0x00,
-       0x44, 0xFF, 0xB8, 0x01, 0xC3, 0xFC, 0x81, 0x05, 0xB0, 0xF6, 0xFA,
-       0x13, 0xCC, 0x44, 0x02, 0xF8, 0x71, 0x02, 0x71, 0xFF, 0xE1, 0xFF,
-       0x42, 0x00, 0xD5, 0xFF, 0x0B, 0x00, 0xFD, 0xFF, 0x33, 0x00, 0x43,
-       0xFF, 0xD6, 0x01, 0x39, 0xFC, 0x2A, 0x07, 0xEB, 0xF1, 0x87, 0x29,
-       0x85, 0x36, 0xCC, 0xF1, 0x7F, 0x06, 0xE0, 0xFC, 0x60, 0x01, 0x82,
-       0xFF, 0x1D, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x09, 0x00, 0xBA, 0xFF,
-       0xF4, 0x00, 0x91, 0xFD, 0x7E, 0x05, 0x05, 0xF3, 0x6E, 0x3C, 0x10,
-       0x22, 0x12, 0xF3, 0xE9, 0x06, 0x38, 0xFC, 0xE6, 0x01, 0x37, 0xFF,
-       0x36, 0x00, 0xFD, 0xFF, 0x12, 0x00, 0xB5, 0xFF, 0x96, 0x00, 0x35,
-       0xFF, 0xA9, 0x00, 0x4D, 0x00, 0x19, 0xFC, 0x7C, 0x47, 0xE8, 0x0C,
-       0x18, 0xF9, 0x66, 0x04, 0x48, 0xFD, 0x7E, 0x01, 0x5A, 0xFF, 0x2B,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x5A, 0xFF, 0x7D, 0x01,
-       0x4B, 0xFD, 0x60, 0x04, 0x24, 0xF9, 0xC6, 0x0C, 0x86, 0x47, 0x30,
-       0xFC, 0x41, 0x00, 0xB0, 0x00, 0x32, 0xFF, 0x98, 0x00, 0xB4, 0xFF,
-       0x12, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x37, 0xFF, 0xE6, 0x01, 0x38,
-       0xFC, 0xE6, 0x06, 0x19, 0xF3, 0xEA, 0x21, 0x8A, 0x3C, 0x0E, 0xF3,
-       0x78, 0x05, 0x96, 0xFD, 0xF1, 0x00, 0xBB, 0xFF, 0x08, 0x00, 0x01,
-       0x00, 0xFE, 0xFF, 0x1D, 0x00, 0x81, 0xFF, 0x62, 0x01, 0xDD, 0xFC,
-       0x83, 0x06, 0xC9, 0xF1, 0x66, 0x36, 0xAC, 0x29, 0xE7, 0xF1, 0x2A,
-       0x07, 0x3A, 0xFC, 0xD5, 0x01, 0x43, 0xFF, 0x33, 0x00, 0xFD, 0xFF,
-       0x0B, 0x00, 0xD6, 0xFF, 0x41, 0x00, 0xE4, 0xFF, 0x6B, 0xFF, 0x7B,
-       0x02, 0xF0, 0xF7, 0xBA, 0x44, 0x1E, 0x14, 0xA5, 0xF6, 0x86, 0x05,
-       0xC1, 0xFC, 0xB9, 0x01, 0x44, 0xFF, 0x32, 0x00, 0xFF, 0xFF, 0x00,
-       0x00, 0x22, 0x00, 0x77, 0xFF, 0x32, 0x01, 0xED, 0xFD, 0x19, 0x03,
-       0xBB, 0xFB, 0x26, 0x06, 0xD7, 0x48, 0x58, 0x01, 0xCF, 0xFD, 0x04,
-       0x02, 0x7D, 0xFE, 0xEF, 0x00, 0x92, 0xFF, 0x1B, 0x00, 0xFE, 0xFF,
-       0x35, 0x00, 0x39, 0xFF, 0xD8, 0x01, 0x70, 0xFC, 0x43, 0x06, 0xE1,
-       0xF4, 0x38, 0x1A, 0x8C, 0x41, 0x55, 0xF5, 0xFC, 0x03, 0x85, 0xFE,
-       0x66, 0x00, 0x01, 0x00, 0xEE, 0xFF, 0x06, 0x00, 0xFD, 0xFF, 0x2B,
-       0x00, 0x59, 0xFF, 0xB0, 0x01, 0x69, 0xFC, 0x0F, 0x07, 0x80, 0xF1,
-       0x96, 0x2F, 0xF2, 0x30, 0x7C, 0xF1, 0xFD, 0x06, 0x7A, 0xFC, 0xA3,
-       0x01, 0x5F, 0xFF, 0x29, 0x00, 0xFD, 0xFF, 0x05, 0x00, 0xF4, 0xFF,
-       0xF2, 0xFF, 0x83, 0x00, 0x53, 0xFE, 0x4E, 0x04, 0xD0, 0xF4, 0xAB,
-       0x40, 0xB2, 0x1B, 0x7F, 0xF4, 0x69, 0x06, 0x62, 0xFC, 0xDD, 0x01,
-       0x38, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x19, 0x00, 0x98, 0xFF, 0xDE,
-       0x00, 0x9F, 0xFE, 0xC2, 0x01, 0x4B, 0xFE, 0x48, 0x00, 0xB3, 0x48,
-       0x5E, 0x07, 0x3B, 0xFB, 0x59, 0x03, 0xCD, 0xFD, 0x42, 0x01, 0x71,
-       0xFF, 0x24, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x30, 0x00, 0x47, 0xFF,
-       0xAF, 0x01, 0xD8, 0xFC, 0x52, 0x05, 0x19, 0xF7, 0xB2, 0x12, 0x5C,
-       0x45, 0xA9, 0xF8, 0x16, 0x02, 0xA6, 0xFF, 0xC3, 0xFF, 0x51, 0x00,
-       0xD0, 0xFF, 0x0C, 0x00, 0xFD, 0xFF, 0x34, 0x00, 0x40, 0xFF, 0xDB,
-       0x01, 0x35, 0xFC, 0x25, 0x07, 0x13, 0xF2, 0x3A, 0x28, 0xA0, 0x37,
-       0xF2, 0xF1, 0x5A, 0x06, 0xFB, 0xFC, 0x4F, 0x01, 0x8B, 0xFF, 0x1A,
-       0x00, 0xFF, 0xFF, 0x00, 0x00, 0x0D, 0x00, 0xAF, 0xFF, 0x09, 0x01,
-       0x6E, 0xFD, 0xB4, 0x05, 0xBC, 0xF2, 0x73, 0x3B, 0x64, 0x23, 0xD2,
-       0xF2, 0xFB, 0x06, 0x34, 0xFC, 0xE6, 0x01, 0x38, 0xFF, 0x36, 0x00,
-       0xFD, 0xFF, 0x11, 0x00, 0xBB, 0xFF, 0x87, 0x00, 0x54, 0xFF, 0x70,
-       0x00, 0xB3, 0x00, 0x4E, 0xFB, 0x1A, 0x47, 0x1F, 0x0E, 0xA8, 0xF8,
-       0x9B, 0x04, 0x2E, 0xFD, 0x8A, 0x01, 0x55, 0xFF, 0x2C, 0x00, 0xFF,
-       0xFF, 0x00, 0x00, 0x29, 0x00, 0x5F, 0xFF, 0x71, 0x01, 0x65, 0xFD,
-       0x29, 0x04, 0x96, 0xF9, 0x95, 0x0B, 0xDC, 0x47, 0x03, 0xFD, 0xD9,
-       0xFF, 0xEA, 0x00, 0x12, 0xFF, 0xA7, 0x00, 0xAE, 0xFF, 0x14, 0x00,
-       0xFD, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE6, 0x01, 0x3E, 0xFC, 0xD0,
-       0x06, 0x5E, 0xF3, 0x94, 0x20, 0x7B, 0x3D, 0x60, 0xF3, 0x3E, 0x05,
-       0xBB, 0xFD, 0xDB, 0x00, 0xC6, 0xFF, 0x04, 0x00, 0x02, 0x00, 0xFE,
-       0xFF, 0x20, 0x00, 0x79, 0xFF, 0x72, 0x01, 0xC4, 0xFC, 0xA4, 0x06,
-       0xAB, 0xF1, 0x46, 0x35, 0xF7, 0x2A, 0xC6, 0xF1, 0x2A, 0x07, 0x40,
-       0xFC, 0xCF, 0x01, 0x47, 0xFF, 0x31, 0x00, 0xFD, 0xFF, 0x09, 0x00,
-       0xDB, 0xFF, 0x33, 0x00, 0x01, 0x00, 0x38, 0xFF, 0xD3, 0x02, 0x53,
-       0xF7, 0x1F, 0x44, 0x69, 0x15, 0x3F, 0xF6, 0xB2, 0x05, 0xAD, 0xFC,
-       0xC1, 0x01, 0x41, 0xFF, 0x32, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x20,
-       0x00, 0x7D, 0xFF, 0x24, 0x01, 0x0C, 0xFE, 0xDE, 0x02, 0x2E, 0xFC,
-       0x13, 0x05, 0xEC, 0x48, 0x54, 0x02, 0x5E, 0xFD, 0x3F, 0x02, 0x5D,
-       0xFE, 0xFE, 0x00, 0x8C, 0xFF, 0x1C, 0x00, 0xFE, 0xFF, 0x35, 0x00,
-       0x3B, 0xFF, 0xD3, 0x01, 0x7F, 0xFC, 0x1F, 0x06, 0x3C, 0xF5, 0xE6,
-       0x18, 0x4D, 0x42, 0xD5, 0xF5, 0xAF, 0x03, 0xB4, 0xFE, 0x4B, 0x00,
-       0x0E, 0x00, 0xE9, 0xFF, 0x07, 0x00, 0xFD, 0xFF, 0x2D, 0x00, 0x53,
-       0xFF, 0xBA, 0x01, 0x5B, 0xFC, 0x1B, 0x07, 0x8B, 0xF1, 0x58, 0x2E,
-       0x26, 0x32, 0x80, 0xF1, 0xEA, 0x06, 0x8C, 0xFC, 0x97, 0x01, 0x66,
-       0xFF, 0x27, 0x00, 0xFD, 0xFF, 0x04, 0x00, 0xF8, 0xFF, 0xE6, 0xFF,
-       0x9C, 0x00, 0x27, 0xFE, 0x94, 0x04, 0x61, 0xF4, 0xD7, 0x3F, 0x06,
-       0x1D, 0x2B, 0xF4, 0x89, 0x06, 0x56, 0xFC, 0xE0, 0x01, 0x37, 0xFF,
-       0x36, 0x00, 0xFE, 0xFF, 0x17, 0x00, 0x9E, 0xFF, 0xCF, 0x00, 0xBF,
-       0xFE, 0x86, 0x01, 0xBA, 0xFE, 0x5A, 0xFF, 0x86, 0x48, 0x7D, 0x08,
-       0xC7, 0xFA, 0x93, 0x03, 0xB0, 0xFD, 0x4F, 0x01, 0x6C, 0xFF, 0x25,
-       0x00, 0x00, 0x00, 0xFF, 0xFF, 0x2F, 0x00, 0x4B, 0xFF, 0xA6, 0x01,
-       0xEE, 0xFC, 0x23, 0x05, 0x83, 0xF7, 0x6E, 0x11, 0xE5, 0x45, 0x57,
-       0xF9, 0xB8, 0x01, 0xDC, 0xFF, 0xA5, 0xFF, 0x5F, 0x00, 0xCA, 0xFF,
-       0x0D, 0x00, 0xFD, 0xFF, 0x35, 0x00, 0x3D, 0xFF, 0xDF, 0x01, 0x32,
-       0xFC, 0x1E, 0x07, 0x40, 0xF2, 0xEB, 0x26, 0xB5, 0x38, 0x1F, 0xF2,
-       0x32, 0x06, 0x18, 0xFD, 0x3D, 0x01, 0x94, 0xFF, 0x16, 0x00, 0xFF,
-       0xFF, 0x00, 0x00, 0x11, 0x00, 0xA4, 0xFF, 0x1D, 0x01, 0x4C, 0xFD,
-       0xE6, 0x05, 0x7B, 0xF2, 0x71, 0x3A, 0xB8, 0x24, 0x97, 0xF2, 0x0B,
-       0x07, 0x32, 0xFC, 0xE4, 0x01, 0x39, 0xFF, 0x36, 0x00, 0xFD, 0xFF,
-       0x0F, 0x00, 0xC0, 0xFF, 0x78, 0x00, 0x73, 0xFF, 0x38, 0x00, 0x17,
-       0x01, 0x8B, 0xFA, 0xAF, 0x46, 0x59, 0x0F, 0x39, 0xF8, 0xCF, 0x04,
-       0x15, 0xFD, 0x95, 0x01, 0x51, 0xFF, 0x2D, 0x00, 0xFF, 0xFF, 0x00,
-       0x00, 0x28, 0x00, 0x64, 0xFF, 0x65, 0x01, 0x81, 0xFD, 0xF2, 0x03,
-       0x08, 0xFA, 0x68, 0x0A, 0x25, 0x48, 0xDE, 0xFD, 0x6E, 0xFF, 0x24,
-       0x01, 0xF3, 0xFE, 0xB6, 0x00, 0xA8, 0xFF, 0x15, 0x00, 0xFD, 0xFF,
-       0x36, 0x00, 0x36, 0xFF, 0xE5, 0x01, 0x46, 0xFC, 0xB8, 0x06, 0xA8,
-       0xF3, 0x3F, 0x1F, 0x64, 0x3E, 0xBA, 0xF3, 0x01, 0x05, 0xE2, 0xFD,
-       0xC4, 0x00, 0xD2, 0xFF, 0x00, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0x23,
-       0x00, 0x71, 0xFF, 0x81, 0x01, 0xAE, 0xFC, 0xC1, 0x06, 0x95, 0xF1,
-       0x1E, 0x34, 0x3E, 0x2C, 0xAB, 0xF1, 0x27, 0x07, 0x49, 0xFC, 0xC8,
-       0x01, 0x4B, 0xFF, 0x30, 0x00, 0xFD, 0xFF, 0x08, 0x00, 0xE1, 0xFF,
-       0x25, 0x00, 0x1D, 0x00, 0x05, 0xFF, 0x28, 0x03, 0xBD, 0xF6, 0x77,
-       0x43, 0xB6, 0x16, 0xDC, 0xF5, 0xDD, 0x05, 0x9B, 0xFC, 0xC8, 0x01,
-       0x3E, 0xFF, 0x33, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x1F, 0x00, 0x83,
-       0xFF, 0x16, 0x01, 0x2A, 0xFE, 0xA3, 0x02, 0xA1, 0xFC, 0x06, 0x04,
-       0xF5, 0x48, 0x56, 0x03, 0xED, 0xFC, 0x7B, 0x02, 0x3E, 0xFE, 0x0C,
-       0x01, 0x86, 0xFF, 0x1E, 0x00, 0xFE, 0xFF, 0x34, 0x00, 0x3D, 0xFF,
-       0xCC, 0x01, 0x8F, 0xFC, 0xF8, 0x05, 0x9B, 0xF5, 0x96, 0x17, 0x02,
-       0x43, 0x5E, 0xF6, 0x5F, 0x03, 0xE4, 0xFE, 0x30, 0x00, 0x1B, 0x00,
-       0xE4, 0xFF, 0x08, 0x00, 0xFD, 0xFF, 0x2F, 0x00, 0x4E, 0xFF, 0xC3,
-       0x01, 0x4F, 0xFC, 0x24, 0x07, 0x9C, 0xF1, 0x17, 0x2D, 0x57, 0x33,
-       0x8A, 0xF1, 0xD3, 0x06, 0x9F, 0xFC, 0x8A, 0x01, 0x6D, 0xFF, 0x25,
-       0x00, 0xFD, 0xFF, 0x03, 0x00, 0xFD, 0xFF, 0xD9, 0xFF, 0xB4, 0x00,
-       0xFD, 0xFD, 0xD7, 0x04, 0xFA, 0xF3, 0xFC, 0x3E, 0x5B, 0x1E, 0xDB,
-       0xF3, 0xA6, 0x06, 0x4C, 0xFC, 0xE3, 0x01, 0x36, 0xFF, 0x36, 0x00,
-       0xFE, 0xFF, 0x16, 0x00, 0xA4, 0xFF, 0xC0, 0x00, 0xDE, 0xFE, 0x4B,
-       0x01, 0x27, 0xFF, 0x73, 0xFE, 0x4F, 0x48, 0xA2, 0x09, 0x54, 0xFA,
-       0xCC, 0x03, 0x93, 0xFD, 0x5C, 0x01, 0x67, 0xFF, 0x27, 0x00, 0x00,
-       0x00, 0xFF, 0xFF, 0x2E, 0x00, 0x4E, 0xFF, 0x9C, 0x01, 0x05, 0xFD,
-       0xF1, 0x04, 0xF0, 0xF7, 0x2D, 0x10, 0x61, 0x46, 0x0D, 0xFA, 0x58,
-       0x01, 0x13, 0x00, 0x87, 0xFF, 0x6E, 0x00, 0xC4, 0xFF, 0x0E, 0x00,
-       0xFD, 0xFF, 0x35, 0x00, 0x3B, 0xFF, 0xE3, 0x01, 0x31, 0xFC, 0x14,
-       0x07, 0x73, 0xF2, 0x99, 0x25, 0xC2, 0x39, 0x54, 0xF2, 0x05, 0x06,
-       0x37, 0xFD, 0x2B, 0x01, 0x9E, 0xFF, 0x13, 0x00, 0xFF, 0xFF, 0xFF,
-       0xFF, 0x14, 0x00, 0x9B, 0xFF, 0x31, 0x01, 0x2C, 0xFD, 0x15, 0x06,
-       0x41, 0xF2, 0x6A, 0x39, 0x0A, 0x26, 0x61, 0xF2, 0x17, 0x07, 0x31,
-       0xFC, 0xE2, 0x01, 0x3B, 0xFF, 0x35, 0x00, 0xFD, 0xFF, 0x0E, 0x00,
-       0xC6, 0xFF, 0x69, 0x00, 0x91, 0xFF, 0x00, 0x00, 0x78, 0x01, 0xD0,
-       0xF9, 0x39, 0x46, 0x98, 0x10, 0xCB, 0xF7, 0x02, 0x05, 0xFE, 0xFC,
-       0x9F, 0x01, 0x4D, 0xFF, 0x2E, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x26,
-       0x00, 0x69, 0xFF, 0x58, 0x01, 0x9D, 0xFD, 0xB9, 0x03, 0x7B, 0xFA,
-       0x40, 0x09, 0x63, 0x48, 0xBF, 0xFE, 0x03, 0xFF, 0x5F, 0x01, 0xD4,
-       0xFE, 0xC5, 0x00, 0xA2, 0xFF, 0x16, 0x00, 0xFE, 0xFF, 0x36, 0x00,
-       0x36, 0xFF, 0xE2, 0x01, 0x4F, 0xFC, 0x9C, 0x06, 0xF5, 0xF3, 0xEA,
-       0x1D, 0x47, 0x3F, 0x1B, 0xF4, 0xC1, 0x04, 0x0B, 0xFE, 0xAC, 0x00,
-       0xDE, 0xFF, 0xFB, 0xFF, 0x03, 0x00, 0xFD, 0xFF, 0x25, 0x00, 0x6A,
-       0xFF, 0x8E, 0x01, 0x99, 0xFC, 0xDB, 0x06, 0x86, 0xF1, 0xF2, 0x32,
-       0x82, 0x2D, 0x96, 0xF1, 0x21, 0x07, 0x53, 0xFC, 0xC0, 0x01, 0x50,
-       0xFF, 0x2E, 0x00, 0xFD, 0xFF, 0x07, 0x00, 0xE6, 0xFF, 0x17, 0x00,
-       0x39, 0x00, 0xD4, 0xFE, 0x7A, 0x03, 0x2F, 0xF6, 0xC7, 0x42, 0x06,
-       0x18, 0x7B, 0xF5, 0x05, 0x06, 0x8A, 0xFC, 0xCF, 0x01, 0x3C, 0xFF,
-       0x34, 0x00, 0xFE, 0xFF, 0x1D, 0x00, 0x88, 0xFF, 0x07, 0x01, 0x49,
-       0xFE, 0x67, 0x02, 0x13, 0xFD, 0xFF, 0x02, 0xF4, 0x48, 0x5F, 0x04,
-       0x7A, 0xFC, 0xB6, 0x02, 0x20, 0xFE, 0x1B, 0x01, 0x81, 0xFF, 0x1F,
-       0x00, 0x00, 0x00, 0xFF, 0xFF, 0x33, 0x00, 0x3F, 0xFF, 0xC6, 0x01,
-       0xA1, 0xFC, 0xCF, 0x05, 0xFC, 0xF5, 0x47, 0x16, 0xB0, 0x43, 0xEE,
-       0xF6, 0x0C, 0x03, 0x16, 0xFF, 0x14, 0x00, 0x29, 0x00, 0xDF, 0xFF,
-       0x09, 0x00, 0xFD, 0xFF, 0x30, 0x00, 0x4A, 0xFF, 0xCA, 0x01, 0x46,
-       0xFC, 0x29, 0x07, 0xB3, 0xF1, 0xD1, 0x2B, 0x81, 0x34, 0x9C, 0xF1,
-       0xB8, 0x06, 0xB5, 0xFC, 0x7C, 0x01, 0x74, 0xFF, 0x22, 0x00, 0xFE,
-       0xFF, 0x02, 0x00, 0x01, 0x00, 0xCE, 0xFF, 0xCC, 0x00, 0xD5, 0xFD,
-       0x16, 0x05, 0x9B, 0xF3, 0x18, 0x3E, 0xB1, 0x1F, 0x8F, 0xF3, 0xC0,
-       0x06, 0x43, 0xFC, 0xE5, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF,
-       0x15, 0x00, 0xAA, 0xFF, 0xB1, 0x00, 0xFE, 0xFE, 0x10, 0x01, 0x92,
-       0xFF, 0x94, 0xFD, 0x0D, 0x48, 0xCB, 0x0A, 0xE2, 0xF9, 0x04, 0x04,
-       0x77, 0xFD, 0x69, 0x01, 0x62, 0xFF, 0x28, 0x00, 0x00, 0x00, 0xFF,
-       0xFF, 0x2D, 0x00, 0x52, 0xFF, 0x91, 0x01, 0x1E, 0xFD, 0xBE, 0x04,
-       0x5E, 0xF8, 0xF0, 0x0E, 0xD3, 0x46, 0xCB, 0xFA, 0xF6, 0x00, 0x4B,
-       0x00, 0x69, 0xFF, 0x7D, 0x00, 0xBE, 0xFF, 0x10, 0x00, 0xFD, 0xFF,
-       0x36, 0x00, 0x39, 0xFF, 0xE5, 0x01, 0x32, 0xFC, 0x06, 0x07, 0xAA,
-       0xF2, 0x46, 0x24, 0xC8, 0x3A, 0x90, 0xF2, 0xD6, 0x05, 0x57, 0xFD,
-       0x17, 0x01, 0xA8, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x18,
-       0x00, 0x91, 0xFF, 0x43, 0x01, 0x0E, 0xFD, 0x40, 0x06, 0x0F, 0xF2,
-       0x5B, 0x38, 0x5C, 0x27, 0x30, 0xF2, 0x21, 0x07, 0x33, 0xFC, 0xDE,
-       0x01, 0x3E, 0xFF, 0x34, 0x00, 0xFD, 0xFF, 0x0D, 0x00, 0xCC, 0xFF,
-       0x5A, 0x00, 0xAF, 0xFF, 0xCA, 0xFF, 0xD8, 0x01, 0x1C, 0xF9, 0xB8,
-       0x45, 0xDA, 0x11, 0x60, 0xF7, 0x33, 0x05, 0xE7, 0xFC, 0xA9, 0x01,
-       0x4A, 0xFF, 0x30, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x25, 0x00, 0x6E,
-       0xFF, 0x4B, 0x01, 0xB9, 0xFD, 0x80, 0x03, 0xEE, 0xFA, 0x1D, 0x08,
-       0x98, 0x48, 0xA8, 0xFF, 0x95, 0xFE, 0x9A, 0x01, 0xB4, 0xFE, 0xD4,
-       0x00, 0x9C, 0xFF, 0x18, 0x00, 0xFE, 0xFF, 0x36, 0x00, 0x37, 0xFF,
-       0xDF, 0x01, 0x5A, 0xFC, 0x7E, 0x06, 0x47, 0xF4, 0x94, 0x1C, 0x1F,
-       0x40, 0x85, 0xF4, 0x7D, 0x04, 0x36, 0xFE, 0x93, 0x00, 0xEA, 0xFF,
-       0xF7, 0xFF, 0x04, 0x00, 0xFD, 0xFF, 0x28, 0x00, 0x63, 0xFF, 0x9B,
-       0x01, 0x86, 0xFC, 0xF1, 0x06, 0x7E, 0xF1, 0xC0, 0x31, 0xC2, 0x2E,
-       0x87, 0xF1, 0x17, 0x07, 0x5F, 0xFC, 0xB6, 0x01, 0x55, 0xFF, 0x2D,
-       0x00, 0xFD, 0xFF, 0x06, 0x00, 0xEB, 0xFF, 0x09, 0x00, 0x54, 0x00,
-       0xA4, 0xFE, 0xC9, 0x03, 0xAA, 0xF5, 0x0C, 0x42, 0x56, 0x19, 0x1E,
-       0xF5, 0x2B, 0x06, 0x7A, 0xFC, 0xD4, 0x01, 0x3A, 0xFF, 0x35, 0x00,
-       0xFE, 0xFF, 0x1C, 0x00, 0x8E, 0xFF, 0xF9, 0x00, 0x68, 0xFE, 0x2C,
-       0x02, 0x84, 0xFD, 0xFF, 0x01, 0xE6, 0x48, 0x6E, 0x05, 0x07, 0xFC,
-       0xF1, 0x02, 0x01, 0xFE, 0x29, 0x01, 0x7B, 0xFF, 0x21, 0x00, 0x00,
-       0x00, 0xFF, 0xFF, 0x32, 0x00, 0x42, 0xFF, 0xBE, 0x01, 0xB4, 0xFC,
-       0xA4, 0x05, 0x61, 0xF6, 0xFB, 0x14, 0x53, 0x44, 0x86, 0xF7, 0xB6,
-       0x02, 0x49, 0xFF, 0xF7, 0xFF, 0x37, 0x00, 0xD9, 0xFF, 0x0A, 0x00,
-       0xFD, 0xFF, 0x32, 0x00, 0x46, 0xFF, 0xD1, 0x01, 0x3E, 0xFC, 0x2B,
-       0x07, 0xD0, 0xF1, 0x89, 0x2A, 0xA6, 0x35, 0xB4, 0xF1, 0x99, 0x06,
-       0xCD, 0xFC, 0x6D, 0x01, 0x7C, 0xFF, 0x1F, 0x00, 0xFE, 0xFF, 0x01,
-       0x00, 0x06, 0x00, 0xC2, 0xFF, 0xE3, 0x00, 0xAE, 0xFD, 0x52, 0x05,
-       0x44, 0xF3, 0x2A, 0x3D, 0x06, 0x21, 0x47, 0xF3, 0xD8, 0x06, 0x3C,
-       0xFC, 0xE6, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x13, 0x00,
-       0xB0, 0xFF, 0xA2, 0x00, 0x1D, 0xFF, 0xD6, 0x00, 0xFC, 0xFF, 0xBC,
-       0xFC, 0xC0, 0x47, 0xFA, 0x0B, 0x70, 0xF9, 0x3C, 0x04, 0x5C, 0xFD,
-       0x75, 0x01, 0x5D, 0xFF, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B,
-       0x00, 0x57, 0xFF, 0x86, 0x01, 0x36, 0xFD, 0x89, 0x04, 0xCD, 0xF8,
-       0xB7, 0x0D, 0x3D, 0x47, 0x91, 0xFB, 0x91, 0x00, 0x83, 0x00, 0x4A,
-       0xFF, 0x8C, 0x00, 0xB9, 0xFF, 0x11, 0x00, 0xFD, 0xFF, 0x36, 0x00,
-       0x38, 0xFF, 0xE6, 0x01, 0x35, 0xFC, 0xF5, 0x06, 0xE7, 0xF2, 0xF2,
-       0x22, 0xC7, 0x3B, 0xD4, 0xF2, 0xA2, 0x05, 0x7A, 0xFD, 0x02, 0x01,
-       0xB2, 0xFF, 0x0B, 0x00, 0x01, 0x00, 0xFE, 0xFF, 0x1B, 0x00, 0x88,
-       0xFF, 0x55, 0x01, 0xF2, 0xFC, 0x67, 0x06, 0xE4, 0xF1, 0x44, 0x37,
-       0xAA, 0x28, 0x05, 0xF2, 0x27, 0x07, 0x36, 0xFC, 0xDA, 0x01, 0x41,
-       0xFF, 0x33, 0x00, 0xFD, 0xFF, 0x0B, 0x00, 0xD2, 0xFF, 0x4C, 0x00,
-       0xCD, 0xFF, 0x94, 0xFF, 0x34, 0x02, 0x70, 0xF8, 0x2E, 0x45, 0x20,
-       0x13, 0xF6, 0xF6, 0x62, 0x05, 0xD1, 0xFC, 0xB2, 0x01, 0x46, 0xFF,
-       0x31, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x23, 0x00, 0x73, 0xFF, 0x3D,
-       0x01, 0xD6, 0xFD, 0x46, 0x03, 0x61, 0xFB, 0x00, 0x07, 0xBF, 0x48,
-       0x98, 0x00, 0x26, 0xFE, 0xD5, 0x01, 0x95, 0xFE, 0xE3, 0x00, 0x96,
-       0xFF, 0x1A, 0x00, 0xFE, 0xFF, 0x36, 0x00, 0x38, 0xFF, 0xDB, 0x01,
-       0x66, 0xFC, 0x5E, 0x06, 0x9C, 0xF4, 0x40, 0x1B, 0xEF, 0x40, 0xF7,
-       0xF4, 0x35, 0x04, 0x62, 0xFE, 0x7A, 0x00, 0xF7, 0xFF, 0xF2, 0xFF,
-       0x05, 0x00, 0xFD, 0xFF, 0x2A, 0x00, 0x5D, 0xFF, 0xA7, 0x01, 0x75,
-       0xFC, 0x03, 0x07, 0x7D, 0xF1, 0x8A, 0x30, 0xFF, 0x2F, 0x7E, 0xF1,
-       0x0A, 0x07, 0x6E, 0xFC, 0xAC, 0x01, 0x5A, 0xFF, 0x2B, 0x00, 0xFD,
-       0xFF, 0x05, 0x00, 0xF0, 0xFF, 0xFC, 0xFF, 0x6E, 0x00, 0x76, 0xFE,
-       0x15, 0x04, 0x2C, 0xF5, 0x49, 0x41, 0xA9, 0x1A, 0xC3, 0xF4, 0x4F,
-       0x06, 0x6C, 0xFC, 0xD9, 0x01, 0x38, 0xFF, 0x35, 0x00, 0xFE, 0xFF,
-       0x1A, 0x00, 0x94, 0xFF, 0xEA, 0x00, 0x87, 0xFE, 0xF0, 0x01, 0xF5,
-       0xFD, 0x05, 0x01, 0xCE, 0x48, 0x83, 0x06, 0x94, 0xFB, 0x2C, 0x03,
-       0xE4, 0xFD, 0x37, 0x01, 0x76, 0xFF, 0x22, 0x00, 0x00, 0x00, 0xFF,
-       0xFF, 0x31, 0x00, 0x45, 0xFF, 0xB6, 0x01, 0xC8, 0xFC, 0x77, 0x05,
-       0xC7, 0xF6, 0xB1, 0x13, 0xED, 0x44, 0x26, 0xF8, 0x5D, 0x02, 0x7D,
-       0xFF, 0xDA, 0xFF, 0x46, 0x00, 0xD4, 0xFF, 0x0B, 0x00, 0xFD, 0xFF,
-       0x33, 0x00, 0x42, 0xFF, 0xD7, 0x01, 0x38, 0xFC, 0x29, 0x07, 0xF3,
-       0xF1, 0x3E, 0x29, 0xC6, 0x36, 0xD4, 0xF1, 0x77, 0x06, 0xE6, 0xFC,
-       0x5C, 0x01, 0x84, 0xFF, 0x1C, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x0A,
-       0x00, 0xB7, 0xFF, 0xF9, 0x00, 0x89, 0xFD, 0x8A, 0x05, 0xF4, 0xF2,
-       0x37, 0x3C, 0x5B, 0x22, 0x03, 0xF3, 0xED, 0x06, 0x37, 0xFC, 0xE6,
-       0x01, 0x37, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x12, 0x00, 0xB6, 0xFF,
-       0x93, 0x00, 0x3C, 0xFF, 0x9D, 0x00, 0x63, 0x00, 0xEB, 0xFB, 0x69,
-       0x47, 0x2D, 0x0D, 0xFF, 0xF8, 0x72, 0x04, 0x42, 0xFD, 0x81, 0x01,
-       0x59, 0xFF, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x5B,
-       0xFF, 0x7A, 0x01, 0x50, 0xFD, 0x54, 0x04, 0x3D, 0xF9, 0x82, 0x0C,
-       0x9A, 0x47, 0x5E, 0xFC, 0x2A, 0x00, 0xBD, 0x00, 0x2B, 0xFF, 0x9B,
-       0x00, 0xB3, 0xFF, 0x12, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x37, 0xFF,
-       0xE6, 0x01, 0x3A, 0xFC, 0xE2, 0x06, 0x28, 0xF3, 0x9E, 0x21, 0xC0,
-       0x3C, 0x1F, 0xF3, 0x6C, 0x05, 0x9E, 0xFD, 0xED, 0x00, 0xBD, 0xFF,
-       0x07, 0x00, 0x01, 0x00, 0xFE, 0xFF, 0x1E, 0x00, 0x80, 0xFF, 0x66,
-       0x01, 0xD8, 0xFC, 0x8B, 0x06, 0xC1, 0xF1, 0x27, 0x36, 0xF6, 0x29,
-       0xDF, 0xF1, 0x2A, 0x07, 0x3B, 0xFC, 0xD4, 0x01, 0x44, 0xFF, 0x32,
-       0x00, 0xFD, 0xFF, 0x0A, 0x00, 0xD7, 0xFF, 0x3E, 0x00, 0xEA, 0xFF,
-       0x60, 0xFF, 0x8F, 0x02, 0xCD, 0xF7, 0x99, 0x44, 0x68, 0x14, 0x8E,
-       0xF6, 0x90, 0x05, 0xBC, 0xFC, 0xBA, 0x01, 0x43, 0xFF, 0x32, 0x00,
-       0xFF, 0xFF, 0x00, 0x00, 0x22, 0x00, 0x79, 0xFF, 0x2F, 0x01, 0xF4,
-       0xFD, 0x0C, 0x03, 0xD4, 0xFB, 0xE9, 0x05, 0xDE, 0x48, 0x8F, 0x01,
-       0xB6, 0xFD, 0x11, 0x02, 0x76, 0xFE, 0xF2, 0x00, 0x91, 0xFF, 0x1B,
-       0x00, 0xFE, 0xFF, 0x35, 0x00, 0x39, 0xFF, 0xD7, 0x01, 0x73, 0xFC,
-       0x3B, 0x06, 0xF5, 0xF4, 0xED, 0x19, 0xB7, 0x41, 0x71, 0xF5, 0xEB,
-       0x03, 0x90, 0xFE, 0x60, 0x00, 0x04, 0x00, 0xED, 0xFF, 0x06, 0x00,
-       0xFD, 0xFF, 0x2C, 0x00, 0x57, 0xFF, 0xB2, 0x01, 0x65, 0xFC, 0x12,
-       0x07, 0x82, 0xF1, 0x50, 0x2F, 0x38, 0x31, 0x7C, 0xF1, 0xF9, 0x06,
-       0x7E, 0xFC, 0xA1, 0x01, 0x61, 0xFF, 0x29, 0x00, 0xFD, 0xFF, 0x04,
-       0x00, 0xF5, 0xFF, 0xEF, 0xFF, 0x88, 0x00, 0x49, 0xFE, 0x5D, 0x04,
-       0xB7, 0xF4, 0x7D, 0x40, 0xFD, 0x1B, 0x6C, 0xF4, 0x70, 0x06, 0x5F,
-       0xFC, 0xDE, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x19, 0x00,
-       0x9A, 0xFF, 0xDB, 0x00, 0xA6, 0xFE, 0xB4, 0x01, 0x64, 0xFE, 0x12,
-       0x00, 0xAA, 0x48, 0x9E, 0x07, 0x21, 0xFB, 0x66, 0x03, 0xC6, 0xFD,
-       0x45, 0x01, 0x70, 0xFF, 0x24, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x30,
-       0x00, 0x48, 0xFF, 0xAD, 0x01, 0xDD, 0xFC, 0x48, 0x05, 0x30, 0xF7,
-       0x6B, 0x12, 0x7D, 0x45, 0xCF, 0xF8, 0x01, 0x02, 0xB2, 0xFF, 0xBD,
-       0xFF, 0x54, 0x00, 0xCE, 0xFF, 0x0C, 0x00, 0xFD, 0xFF, 0x34, 0x00,
-       0x3F, 0xFF, 0xDC, 0x01, 0x34, 0xFC, 0x24, 0x07, 0x1C, 0xF2, 0xF0,
-       0x27, 0xDF, 0x37, 0xFB, 0xF1, 0x51, 0x06, 0x01, 0xFD, 0x4B, 0x01,
-       0x8D, 0xFF, 0x19, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x0E, 0x00, 0xAC,
-       0xFF, 0x0E, 0x01, 0x66, 0xFD, 0xBF, 0x05, 0xAD, 0xF2, 0x3B, 0x3B,
-       0xB0, 0x23, 0xC4, 0xF2, 0xFF, 0x06, 0x33, 0xFC, 0xE5, 0x01, 0x38,
-       0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x10, 0x00, 0xBC, 0xFF, 0x84, 0x00,
-       0x5B, 0xFF, 0x64, 0x00, 0xC9, 0x00, 0x22, 0xFB, 0x02, 0x47, 0x64,
-       0x0E, 0x8F, 0xF8, 0xA7, 0x04, 0x29, 0xFD, 0x8C, 0x01, 0x54, 0xFF,
-       0x2C, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x29, 0x00, 0x60, 0xFF, 0x6E,
-       0x01, 0x6B, 0xFD, 0x1D, 0x04, 0xAF, 0xF9, 0x51, 0x0B, 0xEC, 0x47,
-       0x33, 0xFD, 0xC1, 0xFF, 0xF7, 0x00, 0x0C, 0xFF, 0xAA, 0x00, 0xAD,
-       0xFF, 0x14, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE6, 0x01,
-       0x40, 0xFC, 0xCB, 0x06, 0x6E, 0xF3, 0x49, 0x20, 0xB0, 0x3D, 0x73,
-       0xF3, 0x31, 0x05, 0xC4, 0xFD, 0xD6, 0x00, 0xC8, 0xFF, 0x03, 0x00,
-       0x02, 0x00, 0xFE, 0xFF, 0x21, 0x00, 0x77, 0xFF, 0x75, 0x01, 0xBF,
-       0xFC, 0xAB, 0x06, 0xA6, 0xF1, 0x05, 0x35, 0x40, 0x2B, 0xBF, 0xF1,
-       0x2A, 0x07, 0x42, 0xFC, 0xCE, 0x01, 0x48, 0xFF, 0x31, 0x00, 0xFD,
-       0xFF, 0x09, 0x00, 0xDC, 0xFF, 0x2F, 0x00, 0x07, 0x00, 0x2C, 0xFF,
-       0xE6, 0x02, 0x31, 0xF7, 0xFA, 0x43, 0xB3, 0x15, 0x29, 0xF6, 0xBC,
-       0x05, 0xA9, 0xFC, 0xC2, 0x01, 0x40, 0xFF, 0x33, 0x00, 0xFF, 0xFF,
-       0x00, 0x00, 0x20, 0x00, 0x7E, 0xFF, 0x21, 0x01, 0x12, 0xFE, 0xD1,
-       0x02, 0x47, 0xFC, 0xD7, 0x04, 0xF0, 0x48, 0x8D, 0x02, 0x45, 0xFD,
-       0x4D, 0x02, 0x56, 0xFE, 0x01, 0x01, 0x8B, 0xFF, 0x1D, 0x00, 0xFE,
-       0xFF, 0x34, 0x00, 0x3B, 0xFF, 0xD1, 0x01, 0x83, 0xFC, 0x16, 0x06,
-       0x51, 0xF5, 0x9B, 0x18, 0x75, 0x42, 0xF3, 0xF5, 0x9D, 0x03, 0xBF,
-       0xFE, 0x45, 0x00, 0x11, 0x00, 0xE8, 0xFF, 0x07, 0x00, 0xFD, 0xFF,
-       0x2E, 0x00, 0x52, 0xFF, 0xBC, 0x01, 0x58, 0xFC, 0x1D, 0x07, 0x8E,
-       0xF1, 0x11, 0x2E, 0x6B, 0x32, 0x81, 0xF1, 0xE5, 0x06, 0x90, 0xFC,
-       0x94, 0x01, 0x67, 0xFF, 0x26, 0x00, 0xFD, 0xFF, 0x04, 0x00, 0xF9,
-       0xFF, 0xE3, 0xFF, 0xA1, 0x00, 0x1E, 0xFE, 0xA3, 0x04, 0x49, 0xF4,
-       0xA8, 0x3F, 0x52, 0x1D, 0x19, 0xF4, 0x90, 0x06, 0x53, 0xFC, 0xE1,
-       0x01, 0x36, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x17, 0x00, 0xA0, 0xFF,
-       0xCC, 0x00, 0xC6, 0xFE, 0x79, 0x01, 0xD2, 0xFE, 0x26, 0xFF, 0x7C,
-       0x48, 0xBE, 0x08, 0xAE, 0xFA, 0xA0, 0x03, 0xA9, 0xFD, 0x52, 0x01,
-       0x6B, 0xFF, 0x25, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x2F, 0x00, 0x4C,
-       0xFF, 0xA3, 0x01, 0xF3, 0xFC, 0x18, 0x05, 0x9B, 0xF7, 0x27, 0x11,
-       0x02, 0x46, 0x7F, 0xF9, 0xA3, 0x01, 0xE8, 0xFF, 0x9F, 0xFF, 0x63,
-       0x00, 0xC9, 0xFF, 0x0D, 0x00, 0xFD, 0xFF, 0x35, 0x00, 0x3C, 0xFF,
-       0xE0, 0x01, 0x32, 0xFC, 0x1C, 0x07, 0x4B, 0xF2, 0xA0, 0x26, 0xF2,
-       0x38, 0x2A, 0xF2, 0x28, 0x06, 0x1F, 0xFD, 0x39, 0x01, 0x96, 0xFF,
-       0x16, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x11, 0x00, 0xA2, 0xFF, 0x22,
-       0x01, 0x45, 0xFD, 0xF1, 0x05, 0x6D, 0xF2, 0x38, 0x3A, 0x03, 0x25,
-       0x8B, 0xF2, 0x0E, 0x07, 0x32, 0xFC, 0xE4, 0x01, 0x3A, 0xFF, 0x36,
-       0x00, 0xFD, 0xFF, 0x0F, 0x00, 0xC2, 0xFF, 0x75, 0x00, 0x7A, 0xFF,
-       0x2B, 0x00, 0x2D, 0x01, 0x61, 0xFA, 0x97, 0x46, 0xA0, 0x0F, 0x20,
-       0xF8, 0xDA, 0x04, 0x10, 0xFD, 0x97, 0x01, 0x50, 0xFF, 0x2E, 0x00,
-       0xFF, 0xFF, 0x00, 0x00, 0x27, 0x00, 0x65, 0xFF, 0x62, 0x01, 0x87,
-       0xFD, 0xE5, 0x03, 0x21, 0xFA, 0x25, 0x0A, 0x33, 0x48, 0x0F, 0xFE,
-       0x57, 0xFF, 0x31, 0x01, 0xEC, 0xFE, 0xB9, 0x00, 0xA7, 0xFF, 0x15,
-       0x00, 0xFE, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE4, 0x01, 0x48, 0xFC,
-       0xB2, 0x06, 0xB9, 0xF3, 0xF3, 0x1E, 0x98, 0x3E, 0xCF, 0xF3, 0xF3,
-       0x04, 0xEB, 0xFD, 0xBF, 0x00, 0xD4, 0xFF, 0xFF, 0xFF, 0x03, 0x00,
-       0xFE, 0xFF, 0x23, 0x00, 0x70, 0xFF, 0x84, 0x01, 0xA9, 0xFC, 0xC7,
-       0x06, 0x91, 0xF1, 0xDC, 0x33, 0x87, 0x2C, 0xA5, 0xF1, 0x26, 0x07,
-       0x4B, 0xFC, 0xC6, 0x01, 0x4C, 0xFF, 0x30, 0x00, 0xFD, 0xFF, 0x08,
-       0x00, 0xE2, 0xFF, 0x21, 0x00, 0x23, 0x00, 0xFA, 0xFE, 0x3A, 0x03,
-       0x9D, 0xF6, 0x50, 0x43, 0x00, 0x17, 0xC6, 0xF5, 0xE6, 0x05, 0x97,
-       0xFC, 0xC9, 0x01, 0x3E, 0xFF, 0x34, 0x00, 0xFE, 0xFF, 0x00, 0x00,
-       0x1E, 0x00, 0x84, 0xFF, 0x13, 0x01, 0x31, 0xFE, 0x95, 0x02, 0xBA,
-       0xFC, 0xCB, 0x03, 0xF7, 0x48, 0x91, 0x03, 0xD3, 0xFC, 0x88, 0x02,
-       0x38, 0xFE, 0x10, 0x01, 0x85, 0xFF, 0x1E, 0x00, 0xFE, 0xFF, 0x34,
-       0x00, 0x3D, 0xFF, 0xCB, 0x01, 0x93, 0xFC, 0xEF, 0x05, 0xB0, 0xF5,
-       0x4B, 0x17, 0x2A, 0x43, 0x7D, 0xF6, 0x4D, 0x03, 0xEF, 0xFE, 0x2A,
-       0x00, 0x1E, 0x00, 0xE3, 0xFF, 0x08, 0x00, 0xFD, 0xFF, 0x2F, 0x00,
-       0x4D, 0xFF, 0xC4, 0x01, 0x4D, 0xFC, 0x25, 0x07, 0xA1, 0xF1, 0xCE,
-       0x2C, 0x99, 0x33, 0x8E, 0xF1, 0xCD, 0x06, 0xA4, 0xFC, 0x87, 0x01,
-       0x6E, 0xFF, 0x24, 0x00, 0xFD, 0xFF, 0x03, 0x00, 0xFE, 0xFF, 0xD7,
-       0xFF, 0xBA, 0x00, 0xF4, 0xFD, 0xE5, 0x04, 0xE4, 0xF3, 0xCA, 0x3E,
-       0xA7, 0x1E, 0xCA, 0xF3, 0xAC, 0x06, 0x4A, 0xFC, 0xE4, 0x01, 0x36,
-       0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x16, 0x00, 0xA6, 0xFF, 0xBD, 0x00,
-       0xE5, 0xFE, 0x3E, 0x01, 0x3F, 0xFF, 0x41, 0xFE, 0x41, 0x48, 0xE4,
-       0x09, 0x3B, 0xFA, 0xD9, 0x03, 0x8D, 0xFD, 0x5F, 0x01, 0x66, 0xFF,
-       0x27, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x2E, 0x00, 0x4F, 0xFF, 0x99,
-       0x01, 0x0B, 0xFD, 0xE6, 0x04, 0x08, 0xF8, 0xE7, 0x0F, 0x7C, 0x46,
-       0x37, 0xFA, 0x42, 0x01, 0x1F, 0x00, 0x81, 0xFF, 0x71, 0x00, 0xC3,
-       0xFF, 0x0F, 0x00, 0xFD, 0xFF, 0x35, 0x00, 0x3A, 0xFF, 0xE3, 0x01,
-       0x31, 0xFC, 0x11, 0x07, 0x7F, 0xF2, 0x4E, 0x25, 0xFD, 0x39, 0x60,
-       0xF2, 0xFB, 0x05, 0x3E, 0xFD, 0x26, 0x01, 0xA0, 0xFF, 0x12, 0x00,
-       0x00, 0x00, 0xFF, 0xFF, 0x15, 0x00, 0x98, 0xFF, 0x35, 0x01, 0x25,
-       0xFD, 0x1E, 0x06, 0x35, 0xF2, 0x2E, 0x39, 0x55, 0x26, 0x56, 0xF2,
-       0x1A, 0x07, 0x31, 0xFC, 0xE1, 0x01, 0x3C, 0xFF, 0x35, 0x00, 0xFD,
-       0xFF, 0x0E, 0x00, 0xC7, 0xFF, 0x66, 0x00, 0x98, 0xFF, 0xF4, 0xFF,
-       0x8E, 0x01, 0xA7, 0xF9, 0x1D, 0x46, 0xDF, 0x10, 0xB3, 0xF7, 0x0D,
-       0x05, 0xF8, 0xFC, 0xA1, 0x01, 0x4C, 0xFF, 0x2F, 0x00, 0xFF, 0xFF,
-       0x00, 0x00, 0x26, 0x00, 0x6A, 0xFF, 0x55, 0x01, 0xA3, 0xFD, 0xAD,
-       0x03, 0x94, 0xFA, 0xFF, 0x08, 0x70, 0x48, 0xF3, 0xFE, 0xEA, 0xFE,
-       0x6C, 0x01, 0xCD, 0xFE, 0xC9, 0x00, 0xA1, 0xFF, 0x17, 0x00, 0xFE,
-       0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE2, 0x01, 0x51, 0xFC, 0x96, 0x06,
-       0x07, 0xF4, 0x9E, 0x1D, 0x77, 0x3F, 0x32, 0xF4, 0xB2, 0x04, 0x15,
-       0xFE, 0xA7, 0x00, 0xE0, 0xFF, 0xFA, 0xFF, 0x03, 0x00, 0xFD, 0xFF,
-       0x26, 0x00, 0x69, 0xFF, 0x91, 0x01, 0x94, 0xFC, 0xE0, 0x06, 0x84,
-       0xF1, 0xAF, 0x32, 0xCA, 0x2D, 0x92, 0xF1, 0x1F, 0x07, 0x56, 0xFC,
-       0xBE, 0x01, 0x51, 0xFF, 0x2E, 0x00, 0xFD, 0xFF, 0x07, 0x00, 0xE7,
-       0xFF, 0x14, 0x00, 0x3F, 0x00, 0xC9, 0xFE, 0x8C, 0x03, 0x11, 0xF6,
-       0x9E, 0x42, 0x50, 0x18, 0x66, 0xF5, 0x0D, 0x06, 0x86, 0xFC, 0xD0,
-       0x01, 0x3B, 0xFF, 0x34, 0x00, 0xFE, 0xFF, 0x1D, 0x00, 0x8A, 0xFF,
-       0x04, 0x01, 0x50, 0xFE, 0x5A, 0x02, 0x2C, 0xFD, 0xC6, 0x02, 0xF2,
-       0x48, 0x9B, 0x04, 0x61, 0xFC, 0xC3, 0x02, 0x19, 0xFE, 0x1E, 0x01,
-       0x7F, 0xFF, 0x20, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x33, 0x00, 0x40,
-       0xFF, 0xC4, 0x01, 0xA5, 0xFC, 0xC5, 0x05, 0x13, 0xF6, 0xFD, 0x15,
-       0xD4, 0x43, 0x0F, 0xF7, 0xF9, 0x02, 0x21, 0xFF, 0x0D, 0x00, 0x2C,
-       0x00, 0xDE, 0xFF, 0x09, 0x00, 0xFD, 0xFF, 0x31, 0x00, 0x49, 0xFF,
-       0xCC, 0x01, 0x44, 0xFC, 0x29, 0x07, 0xB9, 0xF1, 0x89, 0x2B, 0xC3,
-       0x34, 0xA0, 0xF1, 0xB1, 0x06, 0xBA, 0xFC, 0x79, 0x01, 0x76, 0xFF,
-       0x21, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0x02, 0x00, 0xCB, 0xFF, 0xD1,
-       0x00, 0xCC, 0xFD, 0x24, 0x05, 0x87, 0xF3, 0xE4, 0x3D, 0xFD, 0x1F,
-       0x7F, 0xF3, 0xC6, 0x06, 0x41, 0xFC, 0xE5, 0x01, 0x36, 0xFF, 0x36,
-       0x00, 0xFD, 0xFF, 0x14, 0x00, 0xAC, 0xFF, 0xAE, 0x00, 0x05, 0xFF,
-       0x03, 0x01, 0xAA, 0xFF, 0x63, 0xFD, 0xFD, 0x47, 0x0E, 0x0B, 0xC8,
-       0xF9, 0x11, 0x04, 0x71, 0xFD, 0x6C, 0x01, 0x61, 0xFF, 0x28, 0x00,
-       0x00, 0x00, 0xFF, 0xFF, 0x2D, 0x00, 0x53, 0xFF, 0x8F, 0x01, 0x23,
-       0xFD, 0xB2, 0x04, 0x76, 0xF8, 0xAA, 0x0E, 0xED, 0x46, 0xF7, 0xFA,
-       0xDF, 0x00, 0x57, 0x00, 0x62, 0xFF, 0x80, 0x00, 0xBD, 0xFF, 0x10,
-       0x00, 0xFD, 0xFF, 0x36, 0x00, 0x39, 0xFF, 0xE5, 0x01, 0x33, 0xFC,
-       0x03, 0x07, 0xB7, 0xF2, 0xFC, 0x23, 0x03, 0x3B, 0x9E, 0xF2, 0xCB,
-       0x05, 0x5F, 0xFD, 0x12, 0x01, 0xAA, 0xFF, 0x0E, 0x00, 0x00, 0x00,
-       0xFF, 0xFF, 0x18, 0x00, 0x8F, 0xFF, 0x47, 0x01, 0x08, 0xFD, 0x49,
-       0x06, 0x05, 0xF2, 0x1D, 0x38, 0xA6, 0x27, 0x26, 0xF2, 0x23, 0x07,
-       0x33, 0xFC, 0xDD, 0x01, 0x3E, 0xFF, 0x34, 0x00, 0xFD, 0xFF, 0x0C,
-       0x00, 0xCD, 0xFF, 0x57, 0x00, 0xB6, 0xFF, 0xBE, 0xFF, 0xED, 0x01,
-       0xF5, 0xF8, 0x9B, 0x45, 0x22, 0x12, 0x48, 0xF7, 0x3D, 0x05, 0xE2,
-       0xFC, 0xAB, 0x01, 0x49, 0xFF, 0x30, 0x00, 0xFF, 0xFF, 0x00, 0x00,
-       0x24, 0x00, 0x6F, 0xFF, 0x48, 0x01, 0xC0, 0xFD, 0x73, 0x03, 0x07,
-       0xFB, 0xDD, 0x07, 0xA1, 0x48, 0xDD, 0xFF, 0x7D, 0xFE, 0xA7, 0x01,
-       0xAD, 0xFE, 0xD8, 0x00, 0x9B, 0xFF, 0x18, 0x00, 0xFE, 0xFF, 0x36,
-       0x00, 0x37, 0xFF, 0xDF, 0x01, 0x5C, 0xFC, 0x78, 0x06, 0x5A, 0xF4,
-       0x49, 0x1C, 0x4E, 0x40, 0x9E, 0xF4, 0x6D, 0x04, 0x3F, 0xFE, 0x8E,
-       0x00, 0xED, 0xFF, 0xF6, 0xFF, 0x04, 0x00, 0xFD, 0xFF, 0x28, 0x00,
-       0x62, 0xFF, 0x9E, 0x01, 0x82, 0xFC, 0xF5, 0x06, 0x7D, 0xF1, 0x7B,
-       0x31, 0x09, 0x2F, 0x84, 0xF1, 0x15, 0x07, 0x62, 0xFC, 0xB4, 0x01,
-       0x56, 0xFF, 0x2C, 0x00, 0xFD, 0xFF, 0x06, 0x00, 0xEC, 0xFF, 0x06,
-       0x00, 0x5A, 0x00, 0x9A, 0xFE, 0xDA, 0x03, 0x8D, 0xF5, 0xE1, 0x41,
-       0xA1, 0x19, 0x09, 0xF5, 0x33, 0x06, 0x77, 0xFC, 0xD6, 0x01, 0x3A,
-       0xFF, 0x35, 0x00, 0xFE, 0xFF, 0x1B, 0x00, 0x8F, 0xFF, 0xF5, 0x00,
-       0x6F, 0xFE, 0x1E, 0x02, 0x9D, 0xFD, 0xC7, 0x01, 0xE1, 0x48, 0xAB,
-       0x05, 0xEE, 0xFB, 0xFE, 0x02, 0xFB, 0xFD, 0x2C, 0x01, 0x7A, 0xFF,
-       0x21, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x32, 0x00, 0x42, 0xFF, 0xBC,
-       0x01, 0xB8, 0xFC, 0x9A, 0x05, 0x77, 0xF6, 0xB1, 0x14, 0x77, 0x44,
-       0xA9, 0xF7, 0xA2, 0x02, 0x54, 0xFF, 0xF1, 0xFF, 0x3A, 0x00, 0xD8,
-       0xFF, 0x0A, 0x00, 0xFD, 0xFF, 0x32, 0x00, 0x45, 0xFF, 0xD3, 0x01,
-       0x3C, 0xFC, 0x2A, 0x07, 0xD8, 0xF1, 0x3F, 0x2A, 0xE6, 0x35, 0xBB,
-       0xF1, 0x92, 0x06, 0xD2, 0xFC, 0x69, 0x01, 0x7E, 0xFF, 0x1F, 0x00,
-       0xFE, 0xFF, 0x01, 0x00, 0x07, 0x00, 0xC0, 0xFF, 0xE8, 0x00, 0xA6,
-       0xFD, 0x5F, 0x05, 0x31, 0xF3, 0xF6, 0x3C, 0x52, 0x21, 0x37, 0xF3,
-       0xDD, 0x06, 0x3B, 0xFC, 0xE6, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFD,
-       0xFF, 0x13, 0x00, 0xB1, 0xFF, 0x9F, 0x00, 0x24, 0xFF, 0xC9, 0x00,
-       0x13, 0x00, 0x8D, 0xFC, 0xAE, 0x47, 0x3E, 0x0C, 0x56, 0xF9, 0x48,
-       0x04, 0x56, 0xFD, 0x78, 0x01, 0x5C, 0xFF, 0x2A, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x2B, 0x00, 0x58, 0xFF, 0x83, 0x01, 0x3C, 0xFD, 0x7E,
-       0x04, 0xE6, 0xF8, 0x72, 0x0D, 0x52, 0x47, 0xBE, 0xFB, 0x7A, 0x00,
-       0x90, 0x00, 0x43, 0xFF, 0x8F, 0x00, 0xB7, 0xFF, 0x11, 0x00, 0xFD,
-       0xFF, 0x36, 0x00, 0x37, 0xFF, 0xE6, 0x01, 0x36, 0xFC, 0xF1, 0x06,
-       0xF5, 0xF2, 0xA7, 0x22, 0xFF, 0x3B, 0xE4, 0xF2, 0x96, 0x05, 0x81,
-       0xFD, 0xFD, 0x00, 0xB5, 0xFF, 0x0B, 0x00, 0x01, 0x00, 0xFE, 0xFF,
-       0x1C, 0x00, 0x86, 0xFF, 0x59, 0x01, 0xEC, 0xFC, 0x6F, 0x06, 0xDC,
-       0xF1, 0x04, 0x37, 0xF3, 0x28, 0xFC, 0xF1, 0x28, 0x07, 0x37, 0xFC,
-       0xD8, 0x01, 0x41, 0xFF, 0x33, 0x00, 0xFD, 0xFF, 0x0B, 0x00, 0xD3,
-       0xFF, 0x49, 0x00, 0xD4, 0xFF, 0x88, 0xFF, 0x49, 0x02, 0x4B, 0xF8,
-       0x0D, 0x45, 0x68, 0x13, 0xDF, 0xF6, 0x6C, 0x05, 0xCC, 0xFC, 0xB4,
-       0x01, 0x45, 0xFF, 0x31, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x23, 0x00,
-       0x74, 0xFF, 0x3A, 0x01, 0xDD, 0xFD, 0x39, 0x03, 0x7B, 0xFB, 0xC1,
-       0x06, 0xC7, 0x48, 0xCF, 0x00, 0x0D, 0xFE, 0xE3, 0x01, 0x8E, 0xFE,
-       0xE7, 0x00, 0x95, 0xFF, 0x1A, 0x00, 0xFE, 0xFF, 0x36, 0x00, 0x38,
-       0xFF, 0xDA, 0x01, 0x69, 0xFC, 0x57, 0x06, 0xAF, 0xF4, 0xF5, 0x1A,
-       0x1D, 0x41, 0x11, 0xF5, 0x25, 0x04, 0x6C, 0xFE, 0x74, 0x00, 0xF9,
-       0xFF, 0xF1, 0xFF, 0x05, 0x00, 0xFD, 0xFF, 0x2A, 0x00, 0x5C, 0xFF,
-       0xAA, 0x01, 0x71, 0xFC, 0x07, 0x07, 0x7E, 0xF1, 0x44, 0x30, 0x44,
-       0x30, 0x7E, 0xF1, 0x07, 0x07, 0x71, 0xFC, 0xAA, 0x01, 0x5C, 0xFF,
-       0x2A, 0x00, 0xFD, 0xFF, 0x05, 0x00, 0xF1, 0xFF, 0xF9, 0xFF, 0x74,
-       0x00, 0x6C, 0xFE, 0x25, 0x04, 0x11, 0xF5, 0x1D, 0x41, 0xF5, 0x1A,
-       0xAF, 0xF4, 0x57, 0x06, 0x69, 0xFC, 0xDA, 0x01, 0x38, 0xFF, 0x36,
-       0x00, 0xFE, 0xFF, 0x1A, 0x00, 0x95, 0xFF, 0xE7, 0x00, 0x8E, 0xFE,
-       0xE3, 0x01, 0x0D, 0xFE, 0xCF, 0x00, 0xC7, 0x48, 0xC1, 0x06, 0x7B,
-       0xFB, 0x39, 0x03, 0xDD, 0xFD, 0x3A, 0x01, 0x74, 0xFF, 0x23, 0x00,
-       0x00, 0x00, 0xFF, 0xFF, 0x31, 0x00, 0x45, 0xFF, 0xB4, 0x01, 0xCC,
-       0xFC, 0x6C, 0x05, 0xDF, 0xF6, 0x68, 0x13, 0x0D, 0x45, 0x4B, 0xF8,
-       0x49, 0x02, 0x88, 0xFF, 0xD4, 0xFF, 0x49, 0x00, 0xD3, 0xFF, 0x0B,
-       0x00, 0xFD, 0xFF, 0x33, 0x00, 0x41, 0xFF, 0xD8, 0x01, 0x37, 0xFC,
-       0x28, 0x07, 0xFC, 0xF1, 0xF3, 0x28, 0x04, 0x37, 0xDC, 0xF1, 0x6F,
-       0x06, 0xEC, 0xFC, 0x59, 0x01, 0x86, 0xFF, 0x1C, 0x00, 0xFE, 0xFF,
-       0x01, 0x00, 0x0B, 0x00, 0xB5, 0xFF, 0xFD, 0x00, 0x81, 0xFD, 0x96,
-       0x05, 0xE4, 0xF2, 0xFF, 0x3B, 0xA7, 0x22, 0xF5, 0xF2, 0xF1, 0x06,
-       0x36, 0xFC, 0xE6, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x11,
-       0x00, 0xB7, 0xFF, 0x8F, 0x00, 0x43, 0xFF, 0x90, 0x00, 0x7A, 0x00,
-       0xBE, 0xFB, 0x52, 0x47, 0x72, 0x0D, 0xE6, 0xF8, 0x7E, 0x04, 0x3C,
-       0xFD, 0x83, 0x01, 0x58, 0xFF, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x2A, 0x00, 0x5C, 0xFF, 0x78, 0x01, 0x56, 0xFD, 0x48, 0x04, 0x56,
-       0xF9, 0x3E, 0x0C, 0xAE, 0x47, 0x8D, 0xFC, 0x13, 0x00, 0xC9, 0x00,
-       0x24, 0xFF, 0x9F, 0x00, 0xB1, 0xFF, 0x13, 0x00, 0xFD, 0xFF, 0x36,
-       0x00, 0x36, 0xFF, 0xE6, 0x01, 0x3B, 0xFC, 0xDD, 0x06, 0x37, 0xF3,
-       0x52, 0x21, 0xF6, 0x3C, 0x31, 0xF3, 0x5F, 0x05, 0xA6, 0xFD, 0xE8,
-       0x00, 0xC0, 0xFF, 0x07, 0x00, 0x01, 0x00, 0xFE, 0xFF, 0x1F, 0x00,
-       0x7E, 0xFF, 0x69, 0x01, 0xD2, 0xFC, 0x92, 0x06, 0xBB, 0xF1, 0xE6,
-       0x35, 0x3F, 0x2A, 0xD8, 0xF1, 0x2A, 0x07, 0x3C, 0xFC, 0xD3, 0x01,
-       0x45, 0xFF, 0x32, 0x00, 0xFD, 0xFF, 0x0A, 0x00, 0xD8, 0xFF, 0x3A,
-       0x00, 0xF1, 0xFF, 0x54, 0xFF, 0xA2, 0x02, 0xA9, 0xF7, 0x77, 0x44,
-       0xB1, 0x14, 0x77, 0xF6, 0x9A, 0x05, 0xB8, 0xFC, 0xBC, 0x01, 0x42,
-       0xFF, 0x32, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x21, 0x00, 0x7A, 0xFF,
-       0x2C, 0x01, 0xFB, 0xFD, 0xFE, 0x02, 0xEE, 0xFB, 0xAB, 0x05, 0xE1,
-       0x48, 0xC7, 0x01, 0x9D, 0xFD, 0x1E, 0x02, 0x6F, 0xFE, 0xF5, 0x00,
-       0x8F, 0xFF, 0x1B, 0x00, 0xFE, 0xFF, 0x35, 0x00, 0x3A, 0xFF, 0xD6,
-       0x01, 0x77, 0xFC, 0x33, 0x06, 0x09, 0xF5, 0xA1, 0x19, 0xE1, 0x41,
-       0x8D, 0xF5, 0xDA, 0x03, 0x9A, 0xFE, 0x5A, 0x00, 0x06, 0x00, 0xEC,
-       0xFF, 0x06, 0x00, 0xFD, 0xFF, 0x2C, 0x00, 0x56, 0xFF, 0xB4, 0x01,
-       0x62, 0xFC, 0x15, 0x07, 0x84, 0xF1, 0x09, 0x2F, 0x7B, 0x31, 0x7D,
-       0xF1, 0xF5, 0x06, 0x82, 0xFC, 0x9E, 0x01, 0x62, 0xFF, 0x28, 0x00,
-       0xFD, 0xFF, 0x04, 0x00, 0xF6, 0xFF, 0xED, 0xFF, 0x8E, 0x00, 0x3F,
-       0xFE, 0x6D, 0x04, 0x9E, 0xF4, 0x4E, 0x40, 0x49, 0x1C, 0x5A, 0xF4,
-       0x78, 0x06, 0x5C, 0xFC, 0xDF, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFE,
-       0xFF, 0x18, 0x00, 0x9B, 0xFF, 0xD8, 0x00, 0xAD, 0xFE, 0xA7, 0x01,
-       0x7D, 0xFE, 0xDD, 0xFF, 0xA1, 0x48, 0xDD, 0x07, 0x07, 0xFB, 0x73,
-       0x03, 0xC0, 0xFD, 0x48, 0x01, 0x6F, 0xFF, 0x24, 0x00, 0x00, 0x00,
-       0xFF, 0xFF, 0x30, 0x00, 0x49, 0xFF, 0xAB, 0x01, 0xE2, 0xFC, 0x3D,
-       0x05, 0x48, 0xF7, 0x22, 0x12, 0x9B, 0x45, 0xF5, 0xF8, 0xED, 0x01,
-       0xBE, 0xFF, 0xB6, 0xFF, 0x57, 0x00, 0xCD, 0xFF, 0x0C, 0x00, 0xFD,
-       0xFF, 0x34, 0x00, 0x3E, 0xFF, 0xDD, 0x01, 0x33, 0xFC, 0x23, 0x07,
-       0x26, 0xF2, 0xA6, 0x27, 0x1D, 0x38, 0x05, 0xF2, 0x49, 0x06, 0x08,
-       0xFD, 0x47, 0x01, 0x8F, 0xFF, 0x18, 0x00, 0xFF, 0xFF, 0x00, 0x00,
-       0x0E, 0x00, 0xAA, 0xFF, 0x12, 0x01, 0x5F, 0xFD, 0xCB, 0x05, 0x9E,
-       0xF2, 0x03, 0x3B, 0xFC, 0x23, 0xB7, 0xF2, 0x03, 0x07, 0x33, 0xFC,
-       0xE5, 0x01, 0x39, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x10, 0x00, 0xBD,
-       0xFF, 0x80, 0x00, 0x62, 0xFF, 0x57, 0x00, 0xDF, 0x00, 0xF7, 0xFA,
-       0xED, 0x46, 0xAA, 0x0E, 0x76, 0xF8, 0xB2, 0x04, 0x23, 0xFD, 0x8F,
-       0x01, 0x53, 0xFF, 0x2D, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x28, 0x00,
-       0x61, 0xFF, 0x6C, 0x01, 0x71, 0xFD, 0x11, 0x04, 0xC8, 0xF9, 0x0E,
-       0x0B, 0xFD, 0x47, 0x63, 0xFD, 0xAA, 0xFF, 0x03, 0x01, 0x05, 0xFF,
-       0xAE, 0x00, 0xAC, 0xFF, 0x14, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x36,
-       0xFF, 0xE5, 0x01, 0x41, 0xFC, 0xC6, 0x06, 0x7F, 0xF3, 0xFD, 0x1F,
-       0xE4, 0x3D, 0x87, 0xF3, 0x24, 0x05, 0xCC, 0xFD, 0xD1, 0x00, 0xCB,
-       0xFF, 0x02, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0x21, 0x00, 0x76, 0xFF,
-       0x79, 0x01, 0xBA, 0xFC, 0xB1, 0x06, 0xA0, 0xF1, 0xC3, 0x34, 0x89,
-       0x2B, 0xB9, 0xF1, 0x29, 0x07, 0x44, 0xFC, 0xCC, 0x01, 0x49, 0xFF,
-       0x31, 0x00, 0xFD, 0xFF, 0x09, 0x00, 0xDE, 0xFF, 0x2C, 0x00, 0x0D,
-       0x00, 0x21, 0xFF, 0xF9, 0x02, 0x0F, 0xF7, 0xD4, 0x43, 0xFD, 0x15,
-       0x13, 0xF6, 0xC5, 0x05, 0xA5, 0xFC, 0xC4, 0x01, 0x40, 0xFF, 0x33,
-       0x00, 0xFF, 0xFF, 0x00, 0x00, 0x20, 0x00, 0x7F, 0xFF, 0x1E, 0x01,
-       0x19, 0xFE, 0xC3, 0x02, 0x61, 0xFC, 0x9B, 0x04, 0xF2, 0x48, 0xC6,
-       0x02, 0x2C, 0xFD, 0x5A, 0x02, 0x50, 0xFE, 0x04, 0x01, 0x8A, 0xFF,
-       0x1D, 0x00, 0xFE, 0xFF, 0x34, 0x00, 0x3B, 0xFF, 0xD0, 0x01, 0x86,
-       0xFC, 0x0D, 0x06, 0x66, 0xF5, 0x50, 0x18, 0x9E, 0x42, 0x11, 0xF6,
-       0x8C, 0x03, 0xC9, 0xFE, 0x3F, 0x00, 0x14, 0x00, 0xE7, 0xFF, 0x07,
-       0x00, 0xFD, 0xFF, 0x2E, 0x00, 0x51, 0xFF, 0xBE, 0x01, 0x56, 0xFC,
-       0x1F, 0x07, 0x92, 0xF1, 0xCA, 0x2D, 0xAF, 0x32, 0x84, 0xF1, 0xE0,
-       0x06, 0x94, 0xFC, 0x91, 0x01, 0x69, 0xFF, 0x26, 0x00, 0xFD, 0xFF,
-       0x03, 0x00, 0xFA, 0xFF, 0xE0, 0xFF, 0xA7, 0x00, 0x15, 0xFE, 0xB2,
-       0x04, 0x32, 0xF4, 0x77, 0x3F, 0x9E, 0x1D, 0x07, 0xF4, 0x96, 0x06,
-       0x51, 0xFC, 0xE2, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x17,
-       0x00, 0xA1, 0xFF, 0xC9, 0x00, 0xCD, 0xFE, 0x6C, 0x01, 0xEA, 0xFE,
-       0xF3, 0xFE, 0x70, 0x48, 0xFF, 0x08, 0x94, 0xFA, 0xAD, 0x03, 0xA3,
-       0xFD, 0x55, 0x01, 0x6A, 0xFF, 0x26, 0x00, 0x00, 0x00, 0xFF, 0xFF,
-       0x2F, 0x00, 0x4C, 0xFF, 0xA1, 0x01, 0xF8, 0xFC, 0x0D, 0x05, 0xB3,
-       0xF7, 0xDF, 0x10, 0x1D, 0x46, 0xA7, 0xF9, 0x8E, 0x01, 0xF4, 0xFF,
-       0x98, 0xFF, 0x66, 0x00, 0xC7, 0xFF, 0x0E, 0x00, 0xFD, 0xFF, 0x35,
-       0x00, 0x3C, 0xFF, 0xE1, 0x01, 0x31, 0xFC, 0x1A, 0x07, 0x56, 0xF2,
-       0x55, 0x26, 0x2E, 0x39, 0x35, 0xF2, 0x1E, 0x06, 0x25, 0xFD, 0x35,
-       0x01, 0x98, 0xFF, 0x15, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x12, 0x00,
-       0xA0, 0xFF, 0x26, 0x01, 0x3E, 0xFD, 0xFB, 0x05, 0x60, 0xF2, 0xFD,
-       0x39, 0x4E, 0x25, 0x7F, 0xF2, 0x11, 0x07, 0x31, 0xFC, 0xE3, 0x01,
-       0x3A, 0xFF, 0x35, 0x00, 0xFD, 0xFF, 0x0F, 0x00, 0xC3, 0xFF, 0x71,
-       0x00, 0x81, 0xFF, 0x1F, 0x00, 0x42, 0x01, 0x37, 0xFA, 0x7C, 0x46,
-       0xE7, 0x0F, 0x08, 0xF8, 0xE6, 0x04, 0x0B, 0xFD, 0x99, 0x01, 0x4F,
-       0xFF, 0x2E, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x27, 0x00, 0x66, 0xFF,
-       0x5F, 0x01, 0x8D, 0xFD, 0xD9, 0x03, 0x3B, 0xFA, 0xE4, 0x09, 0x41,
-       0x48, 0x41, 0xFE, 0x3F, 0xFF, 0x3E, 0x01, 0xE5, 0xFE, 0xBD, 0x00,
-       0xA6, 0xFF, 0x16, 0x00, 0xFE, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE4,
-       0x01, 0x4A, 0xFC, 0xAC, 0x06, 0xCA, 0xF3, 0xA7, 0x1E, 0xCA, 0x3E,
-       0xE4, 0xF3, 0xE5, 0x04, 0xF4, 0xFD, 0xBA, 0x00, 0xD7, 0xFF, 0xFE,
-       0xFF, 0x03, 0x00, 0xFD, 0xFF, 0x24, 0x00, 0x6E, 0xFF, 0x87, 0x01,
-       0xA4, 0xFC, 0xCD, 0x06, 0x8E, 0xF1, 0x99, 0x33, 0xCE, 0x2C, 0xA1,
-       0xF1, 0x25, 0x07, 0x4D, 0xFC, 0xC4, 0x01, 0x4D, 0xFF, 0x2F, 0x00,
-       0xFD, 0xFF, 0x08, 0x00, 0xE3, 0xFF, 0x1E, 0x00, 0x2A, 0x00, 0xEF,
-       0xFE, 0x4D, 0x03, 0x7D, 0xF6, 0x2A, 0x43, 0x4B, 0x17, 0xB0, 0xF5,
-       0xEF, 0x05, 0x93, 0xFC, 0xCB, 0x01, 0x3D, 0xFF, 0x34, 0x00, 0xFE,
-       0xFF, 0x1E, 0x00, 0x85, 0xFF, 0x10, 0x01, 0x38, 0xFE, 0x88, 0x02,
-       0xD3, 0xFC, 0x91, 0x03, 0xF7, 0x48, 0xCB, 0x03, 0xBA, 0xFC, 0x95,
-       0x02, 0x31, 0xFE, 0x13, 0x01, 0x84, 0xFF, 0x1E, 0x00, 0x00, 0x00,
-       0xFE, 0xFF, 0x34, 0x00, 0x3E, 0xFF, 0xC9, 0x01, 0x97, 0xFC, 0xE6,
-       0x05, 0xC6, 0xF5, 0x00, 0x17, 0x50, 0x43, 0x9D, 0xF6, 0x3A, 0x03,
-       0xFA, 0xFE, 0x23, 0x00, 0x21, 0x00, 0xE2, 0xFF, 0x08, 0x00, 0xFD,
-       0xFF, 0x30, 0x00, 0x4C, 0xFF, 0xC6, 0x01, 0x4B, 0xFC, 0x26, 0x07,
-       0xA5, 0xF1, 0x87, 0x2C, 0xDC, 0x33, 0x91, 0xF1, 0xC7, 0x06, 0xA9,
-       0xFC, 0x84, 0x01, 0x70, 0xFF, 0x23, 0x00, 0xFE, 0xFF, 0x03, 0x00,
-       0xFF, 0xFF, 0xD4, 0xFF, 0xBF, 0x00, 0xEB, 0xFD, 0xF3, 0x04, 0xCF,
-       0xF3, 0x98, 0x3E, 0xF3, 0x1E, 0xB9, 0xF3, 0xB2, 0x06, 0x48, 0xFC,
-       0xE4, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x15, 0x00, 0xA7,
-       0xFF, 0xB9, 0x00, 0xEC, 0xFE, 0x31, 0x01, 0x57, 0xFF, 0x0F, 0xFE,
-       0x33, 0x48, 0x25, 0x0A, 0x21, 0xFA, 0xE5, 0x03, 0x87, 0xFD, 0x62,
-       0x01, 0x65, 0xFF, 0x27, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x2E, 0x00,
-       0x50, 0xFF, 0x97, 0x01, 0x10, 0xFD, 0xDA, 0x04, 0x20, 0xF8, 0xA0,
-       0x0F, 0x97, 0x46, 0x61, 0xFA, 0x2D, 0x01, 0x2B, 0x00, 0x7A, 0xFF,
-       0x75, 0x00, 0xC2, 0xFF, 0x0F, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x3A,
-       0xFF, 0xE4, 0x01, 0x32, 0xFC, 0x0E, 0x07, 0x8B, 0xF2, 0x03, 0x25,
-       0x38, 0x3A, 0x6D, 0xF2, 0xF1, 0x05, 0x45, 0xFD, 0x22, 0x01, 0xA2,
-       0xFF, 0x11, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x16, 0x00, 0x96, 0xFF,
-       0x39, 0x01, 0x1F, 0xFD, 0x28, 0x06, 0x2A, 0xF2, 0xF2, 0x38, 0xA0,
-       0x26, 0x4B, 0xF2, 0x1C, 0x07, 0x32, 0xFC, 0xE0, 0x01, 0x3C, 0xFF,
-       0x35, 0x00, 0xFD, 0xFF, 0x0D, 0x00, 0xC9, 0xFF, 0x63, 0x00, 0x9F,
-       0xFF, 0xE8, 0xFF, 0xA3, 0x01, 0x7F, 0xF9, 0x02, 0x46, 0x27, 0x11,
-       0x9B, 0xF7, 0x18, 0x05, 0xF3, 0xFC, 0xA3, 0x01, 0x4C, 0xFF, 0x2F,
-       0x00, 0xFF, 0xFF, 0x00, 0x00, 0x25, 0x00, 0x6B, 0xFF, 0x52, 0x01,
-       0xA9, 0xFD, 0xA0, 0x03, 0xAE, 0xFA, 0xBE, 0x08, 0x7C, 0x48, 0x26,
-       0xFF, 0xD2, 0xFE, 0x79, 0x01, 0xC6, 0xFE, 0xCC, 0x00, 0xA0, 0xFF,
-       0x17, 0x00, 0xFE, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE1, 0x01, 0x53,
-       0xFC, 0x90, 0x06, 0x19, 0xF4, 0x52, 0x1D, 0xA8, 0x3F, 0x49, 0xF4,
-       0xA3, 0x04, 0x1E, 0xFE, 0xA1, 0x00, 0xE3, 0xFF, 0xF9, 0xFF, 0x04,
-       0x00, 0xFD, 0xFF, 0x26, 0x00, 0x67, 0xFF, 0x94, 0x01, 0x90, 0xFC,
-       0xE5, 0x06, 0x81, 0xF1, 0x6B, 0x32, 0x11, 0x2E, 0x8E, 0xF1, 0x1D,
-       0x07, 0x58, 0xFC, 0xBC, 0x01, 0x52, 0xFF, 0x2E, 0x00, 0xFD, 0xFF,
-       0x07, 0x00, 0xE8, 0xFF, 0x11, 0x00, 0x45, 0x00, 0xBF, 0xFE, 0x9D,
-       0x03, 0xF3, 0xF5, 0x75, 0x42, 0x9B, 0x18, 0x51, 0xF5, 0x16, 0x06,
-       0x83, 0xFC, 0xD1, 0x01, 0x3B, 0xFF, 0x34, 0x00, 0xFE, 0xFF, 0x1D,
-       0x00, 0x8B, 0xFF, 0x01, 0x01, 0x56, 0xFE, 0x4D, 0x02, 0x45, 0xFD,
-       0x8D, 0x02, 0xF0, 0x48, 0xD7, 0x04, 0x47, 0xFC, 0xD1, 0x02, 0x12,
-       0xFE, 0x21, 0x01, 0x7E, 0xFF, 0x20, 0x00, 0x00, 0x00, 0xFF, 0xFF,
-       0x33, 0x00, 0x40, 0xFF, 0xC2, 0x01, 0xA9, 0xFC, 0xBC, 0x05, 0x29,
-       0xF6, 0xB3, 0x15, 0xFA, 0x43, 0x31, 0xF7, 0xE6, 0x02, 0x2C, 0xFF,
-       0x07, 0x00, 0x2F, 0x00, 0xDC, 0xFF, 0x09, 0x00, 0xFD, 0xFF, 0x31,
-       0x00, 0x48, 0xFF, 0xCE, 0x01, 0x42, 0xFC, 0x2A, 0x07, 0xBF, 0xF1,
-       0x40, 0x2B, 0x05, 0x35, 0xA6, 0xF1, 0xAB, 0x06, 0xBF, 0xFC, 0x75,
-       0x01, 0x77, 0xFF, 0x21, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0x03, 0x00,
-       0xC8, 0xFF, 0xD6, 0x00, 0xC4, 0xFD, 0x31, 0x05, 0x73, 0xF3, 0xB0,
-       0x3D, 0x49, 0x20, 0x6E, 0xF3, 0xCB, 0x06, 0x40, 0xFC, 0xE6, 0x01,
-       0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x14, 0x00, 0xAD, 0xFF, 0xAA,
-       0x00, 0x0C, 0xFF, 0xF7, 0x00, 0xC1, 0xFF, 0x33, 0xFD, 0xEC, 0x47,
-       0x51, 0x0B, 0xAF, 0xF9, 0x1D, 0x04, 0x6B, 0xFD, 0x6E, 0x01, 0x60,
-       0xFF, 0x29, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x2C, 0x00, 0x54, 0xFF,
-       0x8C, 0x01, 0x29, 0xFD, 0xA7, 0x04, 0x8F, 0xF8, 0x64, 0x0E, 0x02,
-       0x47, 0x22, 0xFB, 0xC9, 0x00, 0x64, 0x00, 0x5B, 0xFF, 0x84, 0x00,
-       0xBC, 0xFF, 0x10, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x38, 0xFF, 0xE5,
-       0x01, 0x33, 0xFC, 0xFF, 0x06, 0xC4, 0xF2, 0xB0, 0x23, 0x3B, 0x3B,
-       0xAD, 0xF2, 0xBF, 0x05, 0x66, 0xFD, 0x0E, 0x01, 0xAC, 0xFF, 0x0E,
-       0x00, 0x00, 0x00, 0xFF, 0xFF, 0x19, 0x00, 0x8D, 0xFF, 0x4B, 0x01,
-       0x01, 0xFD, 0x51, 0x06, 0xFB, 0xF1, 0xDF, 0x37, 0xF0, 0x27, 0x1C,
-       0xF2, 0x24, 0x07, 0x34, 0xFC, 0xDC, 0x01, 0x3F, 0xFF, 0x34, 0x00,
-       0xFD, 0xFF, 0x0C, 0x00, 0xCE, 0xFF, 0x54, 0x00, 0xBD, 0xFF, 0xB2,
-       0xFF, 0x01, 0x02, 0xCF, 0xF8, 0x7D, 0x45, 0x6B, 0x12, 0x30, 0xF7,
-       0x48, 0x05, 0xDD, 0xFC, 0xAD, 0x01, 0x48, 0xFF, 0x30, 0x00, 0xFF,
-       0xFF, 0x00, 0x00, 0x24, 0x00, 0x70, 0xFF, 0x45, 0x01, 0xC6, 0xFD,
-       0x66, 0x03, 0x21, 0xFB, 0x9E, 0x07, 0xAA, 0x48, 0x12, 0x00, 0x64,
-       0xFE, 0xB4, 0x01, 0xA6, 0xFE, 0xDB, 0x00, 0x9A, 0xFF, 0x19, 0x00,
-       0xFE, 0xFF, 0x36, 0x00, 0x37, 0xFF, 0xDE, 0x01, 0x5F, 0xFC, 0x70,
-       0x06, 0x6C, 0xF4, 0xFD, 0x1B, 0x7D, 0x40, 0xB7, 0xF4, 0x5D, 0x04,
-       0x49, 0xFE, 0x88, 0x00, 0xEF, 0xFF, 0xF5, 0xFF, 0x04, 0x00, 0xFD,
-       0xFF, 0x29, 0x00, 0x61, 0xFF, 0xA1, 0x01, 0x7E, 0xFC, 0xF9, 0x06,
-       0x7C, 0xF1, 0x38, 0x31, 0x50, 0x2F, 0x82, 0xF1, 0x12, 0x07, 0x65,
-       0xFC, 0xB2, 0x01, 0x57, 0xFF, 0x2C, 0x00, 0xFD, 0xFF, 0x06, 0x00,
-       0xED, 0xFF, 0x04, 0x00, 0x60, 0x00, 0x90, 0xFE, 0xEB, 0x03, 0x71,
-       0xF5, 0xB7, 0x41, 0xED, 0x19, 0xF5, 0xF4, 0x3B, 0x06, 0x73, 0xFC,
-       0xD7, 0x01, 0x39, 0xFF, 0x35, 0x00, 0xFE, 0xFF, 0x1B, 0x00, 0x91,
-       0xFF, 0xF2, 0x00, 0x76, 0xFE, 0x11, 0x02, 0xB6, 0xFD, 0x8F, 0x01,
-       0xDE, 0x48, 0xE9, 0x05, 0xD4, 0xFB, 0x0C, 0x03, 0xF4, 0xFD, 0x2F,
-       0x01, 0x79, 0xFF, 0x22, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x32, 0x00,
-       0x43, 0xFF, 0xBA, 0x01, 0xBC, 0xFC, 0x90, 0x05, 0x8E, 0xF6, 0x68,
-       0x14, 0x99, 0x44, 0xCD, 0xF7, 0x8F, 0x02, 0x60, 0xFF, 0xEA, 0xFF,
-       0x3E, 0x00, 0xD7, 0xFF, 0x0A, 0x00, 0xFD, 0xFF, 0x32, 0x00, 0x44,
-       0xFF, 0xD4, 0x01, 0x3B, 0xFC, 0x2A, 0x07, 0xDF, 0xF1, 0xF6, 0x29,
-       0x27, 0x36, 0xC1, 0xF1, 0x8B, 0x06, 0xD8, 0xFC, 0x66, 0x01, 0x80,
-       0xFF, 0x1E, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x07, 0x00, 0xBD, 0xFF,
-       0xED, 0x00, 0x9E, 0xFD, 0x6C, 0x05, 0x1F, 0xF3, 0xC0, 0x3C, 0x9E,
-       0x21, 0x28, 0xF3, 0xE2, 0x06, 0x3A, 0xFC, 0xE6, 0x01, 0x37, 0xFF,
-       0x36, 0x00, 0xFD, 0xFF, 0x12, 0x00, 0xB3, 0xFF, 0x9B, 0x00, 0x2B,
-       0xFF, 0xBD, 0x00, 0x2A, 0x00, 0x5E, 0xFC, 0x9A, 0x47, 0x82, 0x0C,
-       0x3D, 0xF9, 0x54, 0x04, 0x50, 0xFD, 0x7A, 0x01, 0x5B, 0xFF, 0x2A,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x59, 0xFF, 0x81, 0x01,
-       0x42, 0xFD, 0x72, 0x04, 0xFF, 0xF8, 0x2D, 0x0D, 0x69, 0x47, 0xEB,
-       0xFB, 0x63, 0x00, 0x9D, 0x00, 0x3C, 0xFF, 0x93, 0x00, 0xB6, 0xFF,
-       0x12, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x37, 0xFF, 0xE6, 0x01, 0x37,
-       0xFC, 0xED, 0x06, 0x03, 0xF3, 0x5B, 0x22, 0x37, 0x3C, 0xF4, 0xF2,
-       0x8A, 0x05, 0x89, 0xFD, 0xF9, 0x00, 0xB7, 0xFF, 0x0A, 0x00, 0x01,
-       0x00, 0xFE, 0xFF, 0x1C, 0x00, 0x84, 0xFF, 0x5C, 0x01, 0xE6, 0xFC,
-       0x77, 0x06, 0xD4, 0xF1, 0xC6, 0x36, 0x3E, 0x29, 0xF3, 0xF1, 0x29,
-       0x07, 0x38, 0xFC, 0xD7, 0x01, 0x42, 0xFF, 0x33, 0x00, 0xFD, 0xFF,
-       0x0B, 0x00, 0xD4, 0xFF, 0x46, 0x00, 0xDA, 0xFF, 0x7D, 0xFF, 0x5D,
-       0x02, 0x26, 0xF8, 0xED, 0x44, 0xB1, 0x13, 0xC7, 0xF6, 0x77, 0x05,
-       0xC8, 0xFC, 0xB6, 0x01, 0x45, 0xFF, 0x31, 0x00, 0xFF, 0xFF, 0x00,
-       0x00, 0x22, 0x00, 0x76, 0xFF, 0x37, 0x01, 0xE4, 0xFD, 0x2C, 0x03,
-       0x94, 0xFB, 0x83, 0x06, 0xCE, 0x48, 0x05, 0x01, 0xF5, 0xFD, 0xF0,
-       0x01, 0x87, 0xFE, 0xEA, 0x00, 0x94, 0xFF, 0x1A, 0x00, 0xFE, 0xFF,
-       0x35, 0x00, 0x38, 0xFF, 0xD9, 0x01, 0x6C, 0xFC, 0x4F, 0x06, 0xC3,
-       0xF4, 0xA9, 0x1A, 0x49, 0x41, 0x2C, 0xF5, 0x15, 0x04, 0x76, 0xFE,
-       0x6E, 0x00, 0xFC, 0xFF, 0xF0, 0xFF, 0x05, 0x00, 0xFD, 0xFF, 0x2B,
-       0x00, 0x5A, 0xFF, 0xAC, 0x01, 0x6E, 0xFC, 0x0A, 0x07, 0x7E, 0xF1,
-       0xFF, 0x2F, 0x8A, 0x30, 0x7D, 0xF1, 0x03, 0x07, 0x75, 0xFC, 0xA7,
-       0x01, 0x5D, 0xFF, 0x2A, 0x00, 0xFD, 0xFF, 0x05, 0x00, 0xF2, 0xFF,
-       0xF7, 0xFF, 0x7A, 0x00, 0x62, 0xFE, 0x35, 0x04, 0xF7, 0xF4, 0xEF,
-       0x40, 0x40, 0x1B, 0x9C, 0xF4, 0x5E, 0x06, 0x66, 0xFC, 0xDB, 0x01,
-       0x38, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x1A, 0x00, 0x96, 0xFF, 0xE3,
-       0x00, 0x95, 0xFE, 0xD5, 0x01, 0x26, 0xFE, 0x98, 0x00, 0xBF, 0x48,
-       0x00, 0x07, 0x61, 0xFB, 0x46, 0x03, 0xD6, 0xFD, 0x3D, 0x01, 0x73,
-       0xFF, 0x23, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x31, 0x00, 0x46, 0xFF,
-       0xB2, 0x01, 0xD1, 0xFC, 0x62, 0x05, 0xF6, 0xF6, 0x20, 0x13, 0x2E,
-       0x45, 0x70, 0xF8, 0x34, 0x02, 0x94, 0xFF, 0xCD, 0xFF, 0x4C, 0x00,
-       0xD2, 0xFF, 0x0B, 0x00, 0xFD, 0xFF, 0x33, 0x00, 0x41, 0xFF, 0xDA,
-       0x01, 0x36, 0xFC, 0x27, 0x07, 0x05, 0xF2, 0xAA, 0x28, 0x44, 0x37,
-       0xE4, 0xF1, 0x67, 0x06, 0xF2, 0xFC, 0x55, 0x01, 0x88, 0xFF, 0x1B,
-       0x00, 0xFE, 0xFF, 0x01, 0x00, 0x0B, 0x00, 0xB2, 0xFF, 0x02, 0x01,
-       0x7A, 0xFD, 0xA2, 0x05, 0xD4, 0xF2, 0xC7, 0x3B, 0xF2, 0x22, 0xE7,
-       0xF2, 0xF5, 0x06, 0x35, 0xFC, 0xE6, 0x01, 0x38, 0xFF, 0x36, 0x00,
-       0xFD, 0xFF, 0x11, 0x00, 0xB9, 0xFF, 0x8C, 0x00, 0x4A, 0xFF, 0x83,
-       0x00, 0x91, 0x00, 0x91, 0xFB, 0x3D, 0x47, 0xB7, 0x0D, 0xCD, 0xF8,
-       0x89, 0x04, 0x36, 0xFD, 0x86, 0x01, 0x57, 0xFF, 0x2B, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x2A, 0x00, 0x5D, 0xFF, 0x75, 0x01, 0x5C, 0xFD,
-       0x3C, 0x04, 0x70, 0xF9, 0xFA, 0x0B, 0xC0, 0x47, 0xBC, 0xFC, 0xFC,
-       0xFF, 0xD6, 0x00, 0x1D, 0xFF, 0xA2, 0x00, 0xB0, 0xFF, 0x13, 0x00,
-       0xFD, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE6, 0x01, 0x3C, 0xFC, 0xD8,
-       0x06, 0x47, 0xF3, 0x06, 0x21, 0x2A, 0x3D, 0x44, 0xF3, 0x52, 0x05,
-       0xAE, 0xFD, 0xE3, 0x00, 0xC2, 0xFF, 0x06, 0x00, 0x01, 0x00, 0xFE,
-       0xFF, 0x1F, 0x00, 0x7C, 0xFF, 0x6D, 0x01, 0xCD, 0xFC, 0x99, 0x06,
-       0xB4, 0xF1, 0xA6, 0x35, 0x89, 0x2A, 0xD0, 0xF1, 0x2B, 0x07, 0x3E,
-       0xFC, 0xD1, 0x01, 0x46, 0xFF, 0x32, 0x00, 0xFD, 0xFF, 0x0A, 0x00,
-       0xD9, 0xFF, 0x37, 0x00, 0xF7, 0xFF, 0x49, 0xFF, 0xB6, 0x02, 0x86,
-       0xF7, 0x53, 0x44, 0xFB, 0x14, 0x61, 0xF6, 0xA4, 0x05, 0xB4, 0xFC,
-       0xBE, 0x01, 0x42, 0xFF, 0x32, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x21,
-       0x00, 0x7B, 0xFF, 0x29, 0x01, 0x01, 0xFE, 0xF1, 0x02, 0x07, 0xFC,
-       0x6E, 0x05, 0xE6, 0x48, 0xFF, 0x01, 0x84, 0xFD, 0x2C, 0x02, 0x68,
-       0xFE, 0xF9, 0x00, 0x8E, 0xFF, 0x1C, 0x00, 0xFE, 0xFF, 0x35, 0x00,
-       0x3A, 0xFF, 0xD4, 0x01, 0x7A, 0xFC, 0x2B, 0x06, 0x1E, 0xF5, 0x56,
-       0x19, 0x0C, 0x42, 0xAA, 0xF5, 0xC9, 0x03, 0xA4, 0xFE, 0x54, 0x00,
-       0x09, 0x00, 0xEB, 0xFF, 0x06, 0x00, 0xFD, 0xFF, 0x2D, 0x00, 0x55,
-       0xFF, 0xB6, 0x01, 0x5F, 0xFC, 0x17, 0x07, 0x87, 0xF1, 0xC2, 0x2E,
-       0xC0, 0x31, 0x7E, 0xF1, 0xF1, 0x06, 0x86, 0xFC, 0x9B, 0x01, 0x63,
-       0xFF, 0x28, 0x00, 0xFD, 0xFF, 0x04, 0x00, 0xF7, 0xFF, 0xEA, 0xFF,
-       0x93, 0x00, 0x36, 0xFE, 0x7D, 0x04, 0x85, 0xF4, 0x1F, 0x40, 0x94,
-       0x1C, 0x47, 0xF4, 0x7E, 0x06, 0x5A, 0xFC, 0xDF, 0x01, 0x37, 0xFF,
-       0x36, 0x00, 0xFE, 0xFF, 0x18, 0x00, 0x9C, 0xFF, 0xD4, 0x00, 0xB4,
-       0xFE, 0x9A, 0x01, 0x95, 0xFE, 0xA8, 0xFF, 0x98, 0x48, 0x1D, 0x08,
-       0xEE, 0xFA, 0x80, 0x03, 0xB9, 0xFD, 0x4B, 0x01, 0x6E, 0xFF, 0x25,
-       0x00, 0x00, 0x00, 0xFF, 0xFF, 0x30, 0x00, 0x4A, 0xFF, 0xA9, 0x01,
-       0xE7, 0xFC, 0x33, 0x05, 0x60, 0xF7, 0xDA, 0x11, 0xB8, 0x45, 0x1C,
-       0xF9, 0xD8, 0x01, 0xCA, 0xFF, 0xAF, 0xFF, 0x5A, 0x00, 0xCC, 0xFF,
-       0x0D, 0x00, 0xFD, 0xFF, 0x34, 0x00, 0x3E, 0xFF, 0xDE, 0x01, 0x33,
-       0xFC, 0x21, 0x07, 0x30, 0xF2, 0x5C, 0x27, 0x5B, 0x38, 0x0F, 0xF2,
-       0x40, 0x06, 0x0E, 0xFD, 0x43, 0x01, 0x91, 0xFF, 0x18, 0x00, 0xFF,
-       0xFF, 0x00, 0x00, 0x0F, 0x00, 0xA8, 0xFF, 0x17, 0x01, 0x57, 0xFD,
-       0xD6, 0x05, 0x90, 0xF2, 0xC8, 0x3A, 0x46, 0x24, 0xAA, 0xF2, 0x06,
-       0x07, 0x32, 0xFC, 0xE5, 0x01, 0x39, 0xFF, 0x36, 0x00, 0xFD, 0xFF,
-       0x10, 0x00, 0xBE, 0xFF, 0x7D, 0x00, 0x69, 0xFF, 0x4B, 0x00, 0xF6,
-       0x00, 0xCB, 0xFA, 0xD3, 0x46, 0xF0, 0x0E, 0x5E, 0xF8, 0xBE, 0x04,
-       0x1E, 0xFD, 0x91, 0x01, 0x52, 0xFF, 0x2D, 0x00, 0xFF, 0xFF, 0x00,
-       0x00, 0x28, 0x00, 0x62, 0xFF, 0x69, 0x01, 0x77, 0xFD, 0x04, 0x04,
-       0xE2, 0xF9, 0xCB, 0x0A, 0x0D, 0x48, 0x94, 0xFD, 0x92, 0xFF, 0x10,
-       0x01, 0xFE, 0xFE, 0xB1, 0x00, 0xAA, 0xFF, 0x15, 0x00, 0xFD, 0xFF,
-       0x36, 0x00, 0x36, 0xFF, 0xE5, 0x01, 0x43, 0xFC, 0xC0, 0x06, 0x8F,
-       0xF3, 0xB1, 0x1F, 0x18, 0x3E, 0x9B, 0xF3, 0x16, 0x05, 0xD5, 0xFD,
-       0xCC, 0x00, 0xCE, 0xFF, 0x01, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0x22,
-       0x00, 0x74, 0xFF, 0x7C, 0x01, 0xB5, 0xFC, 0xB8, 0x06, 0x9C, 0xF1,
-       0x81, 0x34, 0xD1, 0x2B, 0xB3, 0xF1, 0x29, 0x07, 0x46, 0xFC, 0xCA,
-       0x01, 0x4A, 0xFF, 0x30, 0x00, 0xFD, 0xFF, 0x09, 0x00, 0xDF, 0xFF,
-       0x29, 0x00, 0x14, 0x00, 0x16, 0xFF, 0x0C, 0x03, 0xEE, 0xF6, 0xB0,
-       0x43, 0x47, 0x16, 0xFC, 0xF5, 0xCF, 0x05, 0xA1, 0xFC, 0xC6, 0x01,
-       0x3F, 0xFF, 0x33, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x1F, 0x00, 0x81,
-       0xFF, 0x1B, 0x01, 0x20, 0xFE, 0xB6, 0x02, 0x7A, 0xFC, 0x5F, 0x04,
-       0xF4, 0x48, 0xFF, 0x02, 0x13, 0xFD, 0x67, 0x02, 0x49, 0xFE, 0x07,
-       0x01, 0x88, 0xFF, 0x1D, 0x00, 0xFE, 0xFF, 0x34, 0x00, 0x3C, 0xFF,
-       0xCF, 0x01, 0x8A, 0xFC, 0x05, 0x06, 0x7B, 0xF5, 0x06, 0x18, 0xC7,
-       0x42, 0x2F, 0xF6, 0x7A, 0x03, 0xD4, 0xFE, 0x39, 0x00, 0x17, 0x00,
-       0xE6, 0xFF, 0x07, 0x00, 0xFD, 0xFF, 0x2E, 0x00, 0x50, 0xFF, 0xC0,
-       0x01, 0x53, 0xFC, 0x21, 0x07, 0x96, 0xF1, 0x82, 0x2D, 0xF2, 0x32,
-       0x86, 0xF1, 0xDB, 0x06, 0x99, 0xFC, 0x8E, 0x01, 0x6A, 0xFF, 0x25,
-       0x00, 0xFD, 0xFF, 0x03, 0x00, 0xFB, 0xFF, 0xDE, 0xFF, 0xAC, 0x00,
-       0x0B, 0xFE, 0xC1, 0x04, 0x1B, 0xF4, 0x47, 0x3F, 0xEA, 0x1D, 0xF5,
-       0xF3, 0x9C, 0x06, 0x4F, 0xFC, 0xE2, 0x01, 0x36, 0xFF, 0x36, 0x00,
-       0xFE, 0xFF, 0x16, 0x00, 0xA2, 0xFF, 0xC5, 0x00, 0xD4, 0xFE, 0x5F,
-       0x01, 0x03, 0xFF, 0xBF, 0xFE, 0x63, 0x48, 0x40, 0x09, 0x7B, 0xFA,
-       0xB9, 0x03, 0x9D, 0xFD, 0x58, 0x01, 0x69, 0xFF, 0x26, 0x00, 0x00,
-       0x00, 0xFF, 0xFF, 0x2E, 0x00, 0x4D, 0xFF, 0x9F, 0x01, 0xFE, 0xFC,
-       0x02, 0x05, 0xCB, 0xF7, 0x98, 0x10, 0x39, 0x46, 0xD0, 0xF9, 0x78,
-       0x01, 0x00, 0x00, 0x91, 0xFF, 0x69, 0x00, 0xC6, 0xFF, 0x0E, 0x00,
-       0xFD, 0xFF, 0x35, 0x00, 0x3B, 0xFF, 0xE2, 0x01, 0x31, 0xFC, 0x17,
-       0x07, 0x61, 0xF2, 0x0A, 0x26, 0x6A, 0x39, 0x41, 0xF2, 0x15, 0x06,
-       0x2C, 0xFD, 0x31, 0x01, 0x9B, 0xFF, 0x14, 0x00, 0xFF, 0xFF, 0xFF,
-       0xFF, 0x13, 0x00, 0x9E, 0xFF, 0x2B, 0x01, 0x37, 0xFD, 0x05, 0x06,
-       0x54, 0xF2, 0xC2, 0x39, 0x99, 0x25, 0x73, 0xF2, 0x14, 0x07, 0x31,
-       0xFC, 0xE3, 0x01, 0x3B, 0xFF, 0x35, 0x00, 0xFD, 0xFF, 0x0E, 0x00,
-       0xC4, 0xFF, 0x6E, 0x00, 0x87, 0xFF, 0x13, 0x00, 0x58, 0x01, 0x0D,
-       0xFA, 0x61, 0x46, 0x2D, 0x10, 0xF0, 0xF7, 0xF1, 0x04, 0x05, 0xFD,
-       0x9C, 0x01, 0x4E, 0xFF, 0x2E, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x27,
-       0x00, 0x67, 0xFF, 0x5C, 0x01, 0x93, 0xFD, 0xCC, 0x03, 0x54, 0xFA,
-       0xA2, 0x09, 0x4F, 0x48, 0x73, 0xFE, 0x27, 0xFF, 0x4B, 0x01, 0xDE,
-       0xFE, 0xC0, 0x00, 0xA4, 0xFF, 0x16, 0x00, 0xFE, 0xFF, 0x36, 0x00,
-       0x36, 0xFF, 0xE3, 0x01, 0x4C, 0xFC, 0xA6, 0x06, 0xDB, 0xF3, 0x5B,
-       0x1E, 0xFC, 0x3E, 0xFA, 0xF3, 0xD7, 0x04, 0xFD, 0xFD, 0xB4, 0x00,
-       0xD9, 0xFF, 0xFD, 0xFF, 0x03, 0x00, 0xFD, 0xFF, 0x25, 0x00, 0x6D,
-       0xFF, 0x8A, 0x01, 0x9F, 0xFC, 0xD3, 0x06, 0x8A, 0xF1, 0x57, 0x33,
-       0x17, 0x2D, 0x9C, 0xF1, 0x24, 0x07, 0x4F, 0xFC, 0xC3, 0x01, 0x4E,
-       0xFF, 0x2F, 0x00, 0xFD, 0xFF, 0x08, 0x00, 0xE4, 0xFF, 0x1B, 0x00,
-       0x30, 0x00, 0xE4, 0xFE, 0x5F, 0x03, 0x5E, 0xF6, 0x02, 0x43, 0x96,
-       0x17, 0x9B, 0xF5, 0xF8, 0x05, 0x8F, 0xFC, 0xCC, 0x01, 0x3D, 0xFF,
-       0x34, 0x00, 0xFE, 0xFF, 0x1E, 0x00, 0x86, 0xFF, 0x0C, 0x01, 0x3E,
-       0xFE, 0x7B, 0x02, 0xED, 0xFC, 0x56, 0x03, 0xF5, 0x48, 0x06, 0x04,
-       0xA1, 0xFC, 0xA3, 0x02, 0x2A, 0xFE, 0x16, 0x01, 0x83, 0xFF, 0x1F,
-       0x00, 0x00, 0x00, 0xFF, 0xFF, 0x33, 0x00, 0x3E, 0xFF, 0xC8, 0x01,
-       0x9B, 0xFC, 0xDD, 0x05, 0xDC, 0xF5, 0xB6, 0x16, 0x77, 0x43, 0xBD,
-       0xF6, 0x28, 0x03, 0x05, 0xFF, 0x1D, 0x00, 0x25, 0x00, 0xE1, 0xFF,
-       0x08, 0x00, 0xFD, 0xFF, 0x30, 0x00, 0x4B, 0xFF, 0xC8, 0x01, 0x49,
-       0xFC, 0x27, 0x07, 0xAB, 0xF1, 0x3E, 0x2C, 0x1E, 0x34, 0x95, 0xF1,
-       0xC1, 0x06, 0xAE, 0xFC, 0x81, 0x01, 0x71, 0xFF, 0x23, 0x00, 0xFE,
-       0xFF, 0x02, 0x00, 0x00, 0x00, 0xD2, 0xFF, 0xC4, 0x00, 0xE2, 0xFD,
-       0x01, 0x05, 0xBA, 0xF3, 0x64, 0x3E, 0x3F, 0x1F, 0xA8, 0xF3, 0xB8,
-       0x06, 0x46, 0xFC, 0xE5, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF,
-       0x15, 0x00, 0xA8, 0xFF, 0xB6, 0x00, 0xF3, 0xFE, 0x24, 0x01, 0x6E,
-       0xFF, 0xDE, 0xFD, 0x25, 0x48, 0x68, 0x0A, 0x08, 0xFA, 0xF2, 0x03,
-       0x81, 0xFD, 0x65, 0x01, 0x64, 0xFF, 0x28, 0x00, 0x00, 0x00, 0xFF,
-       0xFF, 0x2D, 0x00, 0x51, 0xFF, 0x95, 0x01, 0x15, 0xFD, 0xCF, 0x04,
-       0x39, 0xF8, 0x59, 0x0F, 0xAF, 0x46, 0x8B, 0xFA, 0x17, 0x01, 0x38,
-       0x00, 0x73, 0xFF, 0x78, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0xFD, 0xFF,
-       0x36, 0x00, 0x39, 0xFF, 0xE4, 0x01, 0x32, 0xFC, 0x0B, 0x07, 0x97,
-       0xF2, 0xB8, 0x24, 0x71, 0x3A, 0x7B, 0xF2, 0xE6, 0x05, 0x4C, 0xFD,
-       0x1D, 0x01, 0xA4, 0xFF, 0x11, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x16,
-       0x00, 0x94, 0xFF, 0x3D, 0x01, 0x18, 0xFD, 0x32, 0x06, 0x1F, 0xF2,
-       0xB5, 0x38, 0xEB, 0x26, 0x40, 0xF2, 0x1E, 0x07, 0x32, 0xFC, 0xDF,
-       0x01, 0x3D, 0xFF, 0x35, 0x00, 0xFD, 0xFF, 0x0D, 0x00, 0xCA, 0xFF,
-       0x5F, 0x00, 0xA5, 0xFF, 0xDC, 0xFF, 0xB8, 0x01, 0x57, 0xF9, 0xE5,
-       0x45, 0x6E, 0x11, 0x83, 0xF7, 0x23, 0x05, 0xEE, 0xFC, 0xA6, 0x01,
-       0x4B, 0xFF, 0x2F, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x25, 0x00, 0x6C,
-       0xFF, 0x4F, 0x01, 0xB0, 0xFD, 0x93, 0x03, 0xC7, 0xFA, 0x7D, 0x08,
-       0x86, 0x48, 0x5A, 0xFF, 0xBA, 0xFE, 0x86, 0x01, 0xBF, 0xFE, 0xCF,
-       0x00, 0x9E, 0xFF, 0x17, 0x00, 0xFE, 0xFF, 0x36, 0x00, 0x37, 0xFF,
-       0xE0, 0x01, 0x56, 0xFC, 0x89, 0x06, 0x2B, 0xF4, 0x06, 0x1D, 0xD7,
-       0x3F, 0x61, 0xF4, 0x94, 0x04, 0x27, 0xFE, 0x9C, 0x00, 0xE6, 0xFF,
-       0xF8, 0xFF, 0x04, 0x00, 0xFD, 0xFF, 0x27, 0x00, 0x66, 0xFF, 0x97,
-       0x01, 0x8C, 0xFC, 0xEA, 0x06, 0x80, 0xF1, 0x26, 0x32, 0x58, 0x2E,
-       0x8B, 0xF1, 0x1B, 0x07, 0x5B, 0xFC, 0xBA, 0x01, 0x53, 0xFF, 0x2D,
-       0x00, 0xFD, 0xFF, 0x07, 0x00, 0xE9, 0xFF, 0x0E, 0x00, 0x4B, 0x00,
-       0xB4, 0xFE, 0xAF, 0x03, 0xD5, 0xF5, 0x4D, 0x42, 0xE6, 0x18, 0x3C,
-       0xF5, 0x1F, 0x06, 0x7F, 0xFC, 0xD3, 0x01, 0x3B, 0xFF, 0x35, 0x00,
-       0xFE, 0xFF, 0x1C, 0x00, 0x8C, 0xFF, 0xFE, 0x00, 0x5D, 0xFE, 0x3F,
-       0x02, 0x5E, 0xFD, 0x54, 0x02, 0xEC, 0x48, 0x13, 0x05, 0x2E, 0xFC,
-       0xDE, 0x02, 0x0C, 0xFE, 0x24, 0x01, 0x7D, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0xFF, 0xFF, 0x32, 0x00, 0x41, 0xFF, 0xC1, 0x01, 0xAD, 0xFC,
-       0xB2, 0x05, 0x3F, 0xF6, 0x69, 0x15, 0x1F, 0x44, 0x53, 0xF7, 0xD3,
-       0x02, 0x38, 0xFF, 0x01, 0x00, 0x33, 0x00, 0xDB, 0xFF, 0x09, 0x00,
-       0xFD, 0xFF, 0x31, 0x00, 0x47, 0xFF, 0xCF, 0x01, 0x40, 0xFC, 0x2A,
-       0x07, 0xC6, 0xF1, 0xF7, 0x2A, 0x46, 0x35, 0xAB, 0xF1, 0xA4, 0x06,
-       0xC4, 0xFC, 0x72, 0x01, 0x79, 0xFF, 0x20, 0x00, 0xFE, 0xFF, 0x02,
-       0x00, 0x04, 0x00, 0xC6, 0xFF, 0xDB, 0x00, 0xBB, 0xFD, 0x3E, 0x05,
-       0x60, 0xF3, 0x7B, 0x3D, 0x94, 0x20, 0x5E, 0xF3, 0xD0, 0x06, 0x3E,
-       0xFC, 0xE6, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x14, 0x00,
-       0xAE, 0xFF, 0xA7, 0x00, 0x12, 0xFF, 0xEA, 0x00, 0xD9, 0xFF, 0x03,
-       0xFD, 0xDC, 0x47, 0x95, 0x0B, 0x96, 0xF9, 0x29, 0x04, 0x65, 0xFD,
-       0x71, 0x01, 0x5F, 0xFF, 0x29, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x2C,
-       0x00, 0x55, 0xFF, 0x8A, 0x01, 0x2E, 0xFD, 0x9B, 0x04, 0xA8, 0xF8,
-       0x1F, 0x0E, 0x1A, 0x47, 0x4E, 0xFB, 0xB3, 0x00, 0x70, 0x00, 0x54,
-       0xFF, 0x87, 0x00, 0xBB, 0xFF, 0x11, 0x00, 0xFD, 0xFF, 0x36, 0x00,
-       0x38, 0xFF, 0xE6, 0x01, 0x34, 0xFC, 0xFB, 0x06, 0xD2, 0xF2, 0x64,
-       0x23, 0x73, 0x3B, 0xBC, 0xF2, 0xB4, 0x05, 0x6E, 0xFD, 0x09, 0x01,
-       0xAF, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x1A, 0x00, 0x8B,
-       0xFF, 0x4F, 0x01, 0xFB, 0xFC, 0x5A, 0x06, 0xF2, 0xF1, 0xA0, 0x37,
-       0x3A, 0x28, 0x13, 0xF2, 0x25, 0x07, 0x35, 0xFC, 0xDB, 0x01, 0x40,
-       0xFF, 0x34, 0x00, 0xFD, 0xFF, 0x0C, 0x00, 0xD0, 0xFF, 0x51, 0x00,
-       0xC3, 0xFF, 0xA6, 0xFF, 0x16, 0x02, 0xA9, 0xF8, 0x5C, 0x45, 0xB2,
-       0x12, 0x19, 0xF7, 0x52, 0x05, 0xD8, 0xFC, 0xAF, 0x01, 0x47, 0xFF,
-       0x30, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x24, 0x00, 0x71, 0xFF, 0x42,
-       0x01, 0xCD, 0xFD, 0x59, 0x03, 0x3B, 0xFB, 0x5E, 0x07, 0xB3, 0x48,
-       0x48, 0x00, 0x4B, 0xFE, 0xC2, 0x01, 0x9F, 0xFE, 0xDE, 0x00, 0x98,
-       0xFF, 0x19, 0x00, 0xFE, 0xFF, 0x36, 0x00, 0x38, 0xFF, 0xDD, 0x01,
-       0x62, 0xFC, 0x69, 0x06, 0x7F, 0xF4, 0xB2, 0x1B, 0xAB, 0x40, 0xD0,
-       0xF4, 0x4E, 0x04, 0x53, 0xFE, 0x83, 0x00, 0xF2, 0xFF, 0xF4, 0xFF,
-       0x05, 0x00, 0xFD, 0xFF, 0x29, 0x00, 0x5F, 0xFF, 0xA3, 0x01, 0x7A,
-       0xFC, 0xFD, 0x06, 0x7C, 0xF1, 0xF2, 0x30, 0x96, 0x2F, 0x80, 0xF1,
-       0x0F, 0x07, 0x69, 0xFC, 0xB0, 0x01, 0x59, 0xFF, 0x2B, 0x00, 0xFD,
-       0xFF, 0x06, 0x00, 0xEE, 0xFF, 0x01, 0x00, 0x66, 0x00, 0x85, 0xFE,
-       0xFC, 0x03, 0x55, 0xF5, 0x8C, 0x41, 0x38, 0x1A, 0xE1, 0xF4, 0x43,
-       0x06, 0x70, 0xFC, 0xD8, 0x01, 0x39, 0xFF, 0x35, 0x00, 0xFE, 0xFF,
-       0x1B, 0x00, 0x92, 0xFF, 0xEF, 0x00, 0x7D, 0xFE, 0x04, 0x02, 0xCF,
-       0xFD, 0x58, 0x01, 0xD7, 0x48, 0x26, 0x06, 0xBB, 0xFB, 0x19, 0x03,
-       0xED, 0xFD, 0x32, 0x01, 0x77, 0xFF, 0x22, 0x00, 0x00, 0x00, 0xFF,
-       0xFF, 0x32, 0x00, 0x44, 0xFF, 0xB9, 0x01, 0xC1, 0xFC, 0x86, 0x05,
-       0xA5, 0xF6, 0x1E, 0x14, 0xBA, 0x44, 0xF0, 0xF7, 0x7B, 0x02, 0x6B,
-       0xFF, 0xE4, 0xFF, 0x41, 0x00, 0xD6, 0xFF, 0x0B, 0x00, 0xFD, 0xFF,
-       0x33, 0x00, 0x43, 0xFF, 0xD5, 0x01, 0x3A, 0xFC, 0x2A, 0x07, 0xE7,
-       0xF1, 0xAC, 0x29, 0x66, 0x36, 0xC9, 0xF1, 0x83, 0x06, 0xDD, 0xFC,
-       0x62, 0x01, 0x81, 0xFF, 0x1D, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x08,
-       0x00, 0xBB, 0xFF, 0xF1, 0x00, 0x96, 0xFD, 0x78, 0x05, 0x0E, 0xF3,
-       0x8A, 0x3C, 0xEA, 0x21, 0x19, 0xF3, 0xE6, 0x06, 0x38, 0xFC, 0xE6,
-       0x01, 0x37, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x12, 0x00, 0xB4, 0xFF,
-       0x98, 0x00, 0x32, 0xFF, 0xB0, 0x00, 0x41, 0x00, 0x30, 0xFC, 0x86,
-       0x47, 0xC6, 0x0C, 0x24, 0xF9, 0x60, 0x04, 0x4B, 0xFD, 0x7D, 0x01,
-       0x5A, 0xFF, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x5A,
-       0xFF, 0x7E, 0x01, 0x48, 0xFD, 0x66, 0x04, 0x18, 0xF9, 0xE8, 0x0C,
-       0x7C, 0x47, 0x19, 0xFC, 0x4D, 0x00, 0xA9, 0x00, 0x35, 0xFF, 0x96,
-       0x00, 0xB5, 0xFF, 0x12, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x37, 0xFF,
-       0xE6, 0x01, 0x38, 0xFC, 0xE9, 0x06, 0x12, 0xF3, 0x10, 0x22, 0x6E,
-       0x3C, 0x05, 0xF3, 0x7E, 0x05, 0x91, 0xFD, 0xF4, 0x00, 0xBA, 0xFF,
-       0x09, 0x00, 0x01, 0x00, 0xFE, 0xFF, 0x1D, 0x00, 0x82, 0xFF, 0x60,
-       0x01, 0xE0, 0xFC, 0x7F, 0x06, 0xCC, 0xF1, 0x85, 0x36, 0x87, 0x29,
-       0xEB, 0xF1, 0x2A, 0x07, 0x39, 0xFC, 0xD6, 0x01, 0x43, 0xFF, 0x33,
-       0x00, 0xFD, 0xFF, 0x0B, 0x00, 0xD5, 0xFF, 0x42, 0x00, 0xE1, 0xFF,
-       0x71, 0xFF, 0x71, 0x02, 0x02, 0xF8, 0xCC, 0x44, 0xFA, 0x13, 0xB0,
-       0xF6, 0x81, 0x05, 0xC3, 0xFC, 0xB8, 0x01, 0x44, 0xFF, 0x31, 0x00,
-       0xFF, 0xFF, 0x00, 0x00, 0x22, 0x00, 0x77, 0xFF, 0x34, 0x01, 0xEA,
-       0xFD, 0x1F, 0x03, 0xAE, 0xFB, 0x45, 0x06, 0xD5, 0x48, 0x3C, 0x01,
-       0xDC, 0xFD, 0xFD, 0x01, 0x80, 0xFE, 0xED, 0x00, 0x93, 0xFF, 0x1B,
-       0x00, 0xFE, 0xFF, 0x35, 0x00, 0x39, 0xFF, 0xD8, 0x01, 0x6F, 0xFC,
-       0x47, 0x06, 0xD7, 0xF4, 0x5D, 0x1A, 0x74, 0x41, 0x48, 0xF5, 0x04,
-       0x04, 0x80, 0xFE, 0x69, 0x00, 0xFF, 0xFF, 0xEF, 0xFF, 0x05, 0x00,
-       0xFD, 0xFF, 0x2B, 0x00, 0x59, 0xFF, 0xAE, 0x01, 0x6A, 0xFC, 0x0D,
-       0x07, 0x80, 0xF1, 0xB8, 0x2F, 0xCF, 0x30, 0x7D, 0xF1, 0xFF, 0x06,
-       0x78, 0xFC, 0xA5, 0x01, 0x5F, 0xFF, 0x29, 0x00, 0xFD, 0xFF, 0x05,
-       0x00, 0xF3, 0xFF, 0xF4, 0xFF, 0x80, 0x00, 0x58, 0xFE, 0x46, 0x04,
-       0xDD, 0xF4, 0xC3, 0x40, 0x8C, 0x1B, 0x89, 0xF4, 0x66, 0x06, 0x63,
-       0xFC, 0xDC, 0x01, 0x38, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x19, 0x00,
-       0x98, 0xFF, 0xE0, 0x00, 0x9C, 0xFE, 0xC8, 0x01, 0x3F, 0xFE, 0x62,
-       0x00, 0xB8, 0x48, 0x3F, 0x07, 0x47, 0xFB, 0x53, 0x03, 0xD0, 0xFD,
-       0x40, 0x01, 0x72, 0xFF, 0x23, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x30,
-       0x00, 0x47, 0xFF, 0xB0, 0x01, 0xD6, 0xFC, 0x58, 0x05, 0x0D, 0xF7,
-       0xD7, 0x12, 0x4E, 0x45, 0x96, 0xF8, 0x20, 0x02, 0xA0, 0xFF, 0xC7,
-       0xFF, 0x4F, 0x00, 0xD0, 0xFF, 0x0C, 0x00, 0xFD, 0xFF, 0x34, 0x00,
-       0x40, 0xFF, 0xDB, 0x01, 0x35, 0xFC, 0x26, 0x07, 0x0E, 0xF2, 0x60,
-       0x28, 0x82, 0x37, 0xED, 0xF1, 0x5E, 0x06, 0xF8, 0xFC, 0x51, 0x01,
-       0x8A, 0xFF, 0x1A, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x0C, 0x00, 0xB0,
-       0xFF, 0x07, 0x01, 0x72, 0xFD, 0xAE, 0x05, 0xC4, 0xF2, 0x90, 0x3B,
-       0x3F, 0x23, 0xD9, 0xF2, 0xF9, 0x06, 0x34, 0xFC, 0xE6, 0x01, 0x38,
-       0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x11, 0x00, 0xBA, 0xFF, 0x89, 0x00,
-       0x51, 0xFF, 0x77, 0x00, 0xA7, 0x00, 0x64, 0xFB, 0x26, 0x47, 0xFC,
-       0x0D, 0xB4, 0xF8, 0x95, 0x04, 0x31, 0xFD, 0x88, 0x01, 0x56, 0xFF,
-       0x2C, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x29, 0x00, 0x5E, 0xFF, 0x72,
-       0x01, 0x62, 0xFD, 0x2F, 0x04, 0x89, 0xF9, 0xB6, 0x0B, 0xD2, 0x47,
-       0xEB, 0xFC, 0xE4, 0xFF, 0xE3, 0x00, 0x16, 0xFF, 0xA5, 0x00, 0xAF,
-       0xFF, 0x13, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE6, 0x01,
-       0x3E, 0xFC, 0xD3, 0x06, 0x56, 0xF3, 0xBA, 0x20, 0x61, 0x3D, 0x56,
-       0xF3, 0x45, 0x05, 0xB7, 0xFD, 0xDE, 0x00, 0xC5, 0xFF, 0x05, 0x00,
-       0x02, 0x00, 0xFE, 0xFF, 0x20, 0x00, 0x7A, 0xFF, 0x70, 0x01, 0xC7,
-       0xFC, 0xA0, 0x06, 0xAE, 0xF1, 0x65, 0x35, 0xD1, 0x2A, 0xCA, 0xF1,
-       0x2A, 0x07, 0x40, 0xFC, 0xD0, 0x01, 0x47, 0xFF, 0x32, 0x00, 0xFD,
-       0xFF, 0x09, 0x00, 0xDB, 0xFF, 0x34, 0x00, 0xFE, 0xFF, 0x3D, 0xFF,
-       0xC9, 0x02, 0x64, 0xF7, 0x2F, 0x44, 0x44, 0x15, 0x4A, 0xF6, 0xAD,
-       0x05, 0xAF, 0xFC, 0xC0, 0x01, 0x41, 0xFF, 0x32, 0x00, 0xFF, 0xFF,
-       0x00, 0x00, 0x21, 0x00, 0x7C, 0xFF, 0x26, 0x01, 0x08, 0xFE, 0xE4,
-       0x02, 0x21, 0xFC, 0x31, 0x05, 0xEB, 0x48, 0x37, 0x02, 0x6B, 0xFD,
-       0x39, 0x02, 0x61, 0xFE, 0xFC, 0x00, 0x8D, 0xFF, 0x1C, 0x00, 0xFE,
-       0xFF, 0x35, 0x00, 0x3A, 0xFF, 0xD3, 0x01, 0x7D, 0xFC, 0x23, 0x06,
-       0x32, 0xF5, 0x0C, 0x19, 0x38, 0x42, 0xC7, 0xF5, 0xB8, 0x03, 0xAF,
-       0xFE, 0x4E, 0x00, 0x0C, 0x00, 0xEA, 0xFF, 0x06, 0x00, 0xFD, 0xFF,
-       0x2D, 0x00, 0x54, 0xFF, 0xB8, 0x01, 0x5D, 0xFC, 0x1A, 0x07, 0x8A,
-       0xF1, 0x7B, 0x2E, 0x04, 0x32, 0x7F, 0xF1, 0xEC, 0x06, 0x8A, 0xFC,
-       0x98, 0x01, 0x65, 0xFF, 0x27, 0x00, 0xFD, 0xFF, 0x04, 0x00, 0xF8,
-       0xFF, 0xE7, 0xFF, 0x99, 0x00, 0x2C, 0xFE, 0x8C, 0x04, 0x6D, 0xF4,
-       0xF0, 0x3F, 0xE0, 0x1C, 0x34, 0xF4, 0x85, 0x06, 0x57, 0xFC, 0xE0,
-       0x01, 0x37, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x18, 0x00, 0x9E, 0xFF,
-       0xD1, 0x00, 0xBB, 0xFE, 0x8D, 0x01, 0xAE, 0xFE, 0x74, 0xFF, 0x8D,
-       0x48, 0x5D, 0x08, 0xD4, 0xFA, 0x8D, 0x03, 0xB3, 0xFD, 0x4E, 0x01,
-       0x6D, 0xFF, 0x25, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x2F, 0x00, 0x4A,
-       0xFF, 0xA7, 0x01, 0xEC, 0xFC, 0x28, 0x05, 0x77, 0xF7, 0x92, 0x11,
-       0xD7, 0x45, 0x43, 0xF9, 0xC3, 0x01, 0xD6, 0xFF, 0xA9, 0xFF, 0x5E,
-       0x00, 0xCB, 0xFF, 0x0D, 0x00, 0xFD, 0xFF, 0x34, 0x00, 0x3D, 0xFF,
-       0xDF, 0x01, 0x32, 0xFC, 0x1F, 0x07, 0x3B, 0xF2, 0x11, 0x27, 0x97,
-       0x38, 0x19, 0xF2, 0x36, 0x06, 0x15, 0xFD, 0x3F, 0x01, 0x93, 0xFF,
-       0x17, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x10, 0x00, 0xA6, 0xFF, 0x1B,
-       0x01, 0x50, 0xFD, 0xE1, 0x05, 0x82, 0xF2, 0x8F, 0x3A, 0x92, 0x24,
-       0x9D, 0xF2, 0x09, 0x07, 0x32, 0xFC, 0xE4, 0x01, 0x39, 0xFF, 0x36,
-       0x00, 0xFD, 0xFF, 0x0F, 0x00, 0xC0, 0xFF, 0x7A, 0x00, 0x70, 0xFF,
-       0x3E, 0x00, 0x0C, 0x01, 0xA1, 0xFA, 0xBB, 0x46, 0x36, 0x0F, 0x45,
-       0xF8, 0xC9, 0x04, 0x18, 0xFD, 0x93, 0x01, 0x52, 0xFF, 0x2D, 0x00,
-       0xFF, 0xFF, 0x00, 0x00, 0x28, 0x00, 0x63, 0xFF, 0x66, 0x01, 0x7D,
-       0xFD, 0xF8, 0x03, 0xFB, 0xF9, 0x89, 0x0A, 0x1D, 0x48, 0xC5, 0xFD,
-       0x7A, 0xFF, 0x1D, 0x01, 0xF7, 0xFE, 0xB4, 0x00, 0xA9, 0xFF, 0x15,
-       0x00, 0xFD, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE5, 0x01, 0x45, 0xFC,
-       0xBB, 0x06, 0xA0, 0xF3, 0x64, 0x1F, 0x4A, 0x3E, 0xB0, 0xF3, 0x08,
-       0x05, 0xDE, 0xFD, 0xC7, 0x00, 0xD0, 0xFF, 0x00, 0x00, 0x02, 0x00,
-       0xFE, 0xFF, 0x23, 0x00, 0x72, 0xFF, 0x7F, 0x01, 0xB0, 0xFC, 0xBE,
-       0x06, 0x97, 0xF1, 0x3F, 0x34, 0x19, 0x2C, 0xAD, 0xF1, 0x28, 0x07,
-       0x48, 0xFC, 0xC9, 0x01, 0x4B, 0xFF, 0x30, 0x00, 0xFD, 0xFF, 0x08,
-       0x00, 0xE0, 0xFF, 0x26, 0x00, 0x1A, 0x00, 0x0B, 0xFF, 0x1E, 0x03,
-       0xCD, 0xF6, 0x89, 0x43, 0x91, 0x16, 0xE7, 0xF5, 0xD8, 0x05, 0x9D,
-       0xFC, 0xC7, 0x01, 0x3E, 0xFF, 0x33, 0x00, 0xFF, 0xFF, 0x00, 0x00,
-       0x1F, 0x00, 0x82, 0xFF, 0x18, 0x01, 0x27, 0xFE, 0xA9, 0x02, 0x94,
-       0xFC, 0x24, 0x04, 0xF5, 0x48, 0x39, 0x03, 0xF9, 0xFC, 0x74, 0x02,
-       0x42, 0xFE, 0x0B, 0x01, 0x87, 0xFF, 0x1E, 0x00, 0xFE, 0xFF, 0x34,
-       0x00, 0x3C, 0xFF, 0xCD, 0x01, 0x8E, 0xFC, 0xFC, 0x05, 0x90, 0xF5,
-       0xBB, 0x17, 0xEE, 0x42, 0x4E, 0xF6, 0x68, 0x03, 0xDF, 0xFE, 0x33,
-       0x00, 0x1A, 0x00, 0xE5, 0xFF, 0x07, 0x00, 0xFD, 0xFF, 0x2F, 0x00,
-       0x4F, 0xFF, 0xC2, 0x01, 0x51, 0xFC, 0x23, 0x07, 0x9A, 0xF1, 0x3A,
-       0x2D, 0x35, 0x33, 0x89, 0xF1, 0xD5, 0x06, 0x9D, 0xFC, 0x8B, 0x01,
-       0x6C, 0xFF, 0x25, 0x00, 0xFD, 0xFF, 0x03, 0x00, 0xFC, 0xFF, 0xDB,
-       0xFF, 0xB2, 0x00, 0x02, 0xFE, 0xCF, 0x04, 0x05, 0xF4, 0x16, 0x3F,
-       0x36, 0x1E, 0xE4, 0xF3, 0xA3, 0x06, 0x4D, 0xFC, 0xE3, 0x01, 0x36,
-       0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x16, 0x00, 0xA4, 0xFF, 0xC2, 0x00,
-       0xDB, 0xFE, 0x52, 0x01, 0x1B, 0xFF, 0x8D, 0xFE, 0x57, 0x48, 0x81,
-       0x09, 0x61, 0xFA, 0xC6, 0x03, 0x96, 0xFD, 0x5B, 0x01, 0x68, 0xFF,
-       0x26, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x2E, 0x00, 0x4E, 0xFF, 0x9D,
-       0x01, 0x03, 0xFD, 0xF7, 0x04, 0xE3, 0xF7, 0x51, 0x10, 0x55, 0x46,
-       0xF9, 0xF9, 0x63, 0x01, 0x0D, 0x00, 0x8B, 0xFF, 0x6D, 0x00, 0xC5,
-       0xFF, 0x0E, 0x00, 0xFD, 0xFF, 0x35, 0x00, 0x3B, 0xFF, 0xE2, 0x01,
-       0x31, 0xFC, 0x15, 0x07, 0x6D, 0xF2, 0xBF, 0x25, 0xA5, 0x39, 0x4D,
-       0xF2, 0x0B, 0x06, 0x33, 0xFD, 0x2D, 0x01, 0x9D, 0xFF, 0x13, 0x00,
-       0xFF, 0xFF, 0xFF, 0xFF, 0x14, 0x00, 0x9C, 0xFF, 0x2F, 0x01, 0x30,
-       0xFD, 0x10, 0x06, 0x47, 0xF2, 0x87, 0x39, 0xE5, 0x25, 0x67, 0xF2,
-       0x16, 0x07, 0x31, 0xFC, 0xE2, 0x01, 0x3B, 0xFF, 0x35, 0x00, 0xFD,
-       0xFF, 0x0E, 0x00, 0xC6, 0xFF, 0x6B, 0x00, 0x8E, 0xFF, 0x06, 0x00,
-       0x6E, 0x01, 0xE4, 0xF9, 0x48, 0x46, 0x75, 0x10, 0xD7, 0xF7, 0xFC,
-       0x04, 0x00, 0xFD, 0x9E, 0x01, 0x4E, 0xFF, 0x2E, 0x00, 0xFF, 0xFF,
-       0x00, 0x00, 0x26, 0x00, 0x68, 0xFF, 0x59, 0x01, 0x99, 0xFD, 0xC0,
-       0x03, 0x6E, 0xFA, 0x61, 0x09, 0x5D, 0x48, 0xA6, 0xFE, 0x0F, 0xFF,
-       0x58, 0x01, 0xD7, 0xFE, 0xC3, 0x00, 0xA3, 0xFF, 0x16, 0x00, 0xFE,
-       0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE3, 0x01, 0x4E, 0xFC, 0xA0, 0x06,
-       0xED, 0xF3, 0x0F, 0x1E, 0x2D, 0x3F, 0x10, 0xF4, 0xC8, 0x04, 0x07,
-       0xFE, 0xAF, 0x00, 0xDC, 0xFF, 0xFC, 0xFF, 0x03, 0x00, 0xFD, 0xFF,
-       0x25, 0x00, 0x6B, 0xFF, 0x8D, 0x01, 0x9B, 0xFC, 0xD8, 0x06, 0x87,
-       0xF1, 0x13, 0x33, 0x5E, 0x2D, 0x98, 0xF1, 0x22, 0x07, 0x52, 0xFC,
-       0xC1, 0x01, 0x4F, 0xFF, 0x2F, 0x00, 0xFD, 0xFF, 0x07, 0x00, 0xE5,
-       0xFF, 0x18, 0x00, 0x36, 0x00, 0xD9, 0xFE, 0x71, 0x03, 0x3F, 0xF6,
-       0xDB, 0x42, 0xE0, 0x17, 0x86, 0xF5, 0x00, 0x06, 0x8C, 0xFC, 0xCE,
-       0x01, 0x3C, 0xFF, 0x34, 0x00, 0xFE, 0xFF, 0x1D, 0x00, 0x88, 0xFF,
-       0x09, 0x01, 0x45, 0xFE, 0x6E, 0x02, 0x06, 0xFD, 0x1C, 0x03, 0xF4,
-       0x48, 0x41, 0x04, 0x87, 0xFC, 0xB0, 0x02, 0x23, 0xFE, 0x19, 0x01,
-       0x81, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x33, 0x00, 0x3F,
-       0xFF, 0xC6, 0x01, 0x9F, 0xFC, 0xD3, 0x05, 0xF1, 0xF5, 0x6C, 0x16,
-       0x9E, 0x43, 0xDD, 0xF6, 0x15, 0x03, 0x10, 0xFF, 0x17, 0x00, 0x28,
-       0x00, 0xDF, 0xFF, 0x09, 0x00, 0xFD, 0xFF, 0x30, 0x00, 0x4A, 0xFF,
-       0xCA, 0x01, 0x47, 0xFC, 0x28, 0x07, 0xB0, 0xF1, 0xF5, 0x2B, 0x60,
-       0x34, 0x9A, 0xF1, 0xBB, 0x06, 0xB3, 0xFC, 0x7D, 0x01, 0x73, 0xFF,
-       0x22, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0x01, 0x00, 0xCF, 0xFF, 0xC9,
-       0x00, 0xDA, 0xFD, 0x0F, 0x05, 0xA5, 0xF3, 0x31, 0x3E, 0x8A, 0x1F,
-       0x97, 0xF3, 0xBD, 0x06, 0x44, 0xFC, 0xE5, 0x01, 0x36, 0xFF, 0x36,
-       0x00, 0xFD, 0xFF, 0x15, 0x00, 0xAA, 0xFF, 0xB3, 0x00, 0xFA, 0xFE,
-       0x17, 0x01, 0x86, 0xFF, 0xAC, 0xFD, 0x16, 0x48, 0xAA, 0x0A, 0xEE,
-       0xF9, 0xFE, 0x03, 0x7A, 0xFD, 0x67, 0x01, 0x63, 0xFF, 0x28, 0x00,
-       0x00, 0x00, 0xFF, 0xFF, 0x2D, 0x00, 0x52, 0xFF, 0x92, 0x01, 0x1B,
-       0xFD, 0xC4, 0x04, 0x51, 0xF8, 0x13, 0x0F, 0xC8, 0x46, 0xB6, 0xFA,
-       0x01, 0x01, 0x44, 0x00, 0x6C, 0xFF, 0x7B, 0x00, 0xBF, 0xFF, 0x10,
-       0x00, 0xFD, 0xFF, 0x36, 0x00, 0x39, 0xFF, 0xE5, 0x01, 0x32, 0xFC,
-       0x08, 0x07, 0xA4, 0xF2, 0x6D, 0x24, 0xAD, 0x3A, 0x88, 0xF2, 0xDB,
-       0x05, 0x53, 0xFD, 0x19, 0x01, 0xA7, 0xFF, 0x10, 0x00, 0x00, 0x00,
-       0xFF, 0xFF, 0x17, 0x00, 0x92, 0xFF, 0x41, 0x01, 0x11, 0xFD, 0x3B,
-       0x06, 0x14, 0xF2, 0x78, 0x38, 0x36, 0x27, 0x35, 0xF2, 0x20, 0x07,
-       0x33, 0xFC, 0xDF, 0x01, 0x3E, 0xFF, 0x34, 0x00, 0xFD, 0xFF, 0x0D,
-       0x00, 0xCB, 0xFF, 0x5C, 0x00, 0xAC, 0xFF, 0xD0, 0xFF, 0xCD, 0x01,
-       0x30, 0xF9, 0xC8, 0x45, 0xB6, 0x11, 0x6B, 0xF7, 0x2D, 0x05, 0xE9,
-       0xFC, 0xA8, 0x01, 0x4A, 0xFF, 0x30, 0x00, 0xFF, 0xFF, 0x00, 0x00,
-       0x25, 0x00, 0x6D, 0xFF, 0x4C, 0x01, 0xB6, 0xFD, 0x86, 0x03, 0xE1,
-       0xFA, 0x3D, 0x08, 0x92, 0x48, 0x8E, 0xFF, 0xA1, 0xFE, 0x93, 0x01,
-       0xB8, 0xFE, 0xD3, 0x00, 0x9D, 0xFF, 0x18, 0x00, 0xFE, 0xFF, 0x36,
-       0x00, 0x37, 0xFF, 0xE0, 0x01, 0x58, 0xFC, 0x82, 0x06, 0x3E, 0xF4,
-       0xBA, 0x1C, 0x07, 0x40, 0x79, 0xF4, 0x84, 0x04, 0x31, 0xFE, 0x96,
-       0x00, 0xE8, 0xFF, 0xF7, 0xFF, 0x04, 0x00, 0xFD, 0xFF, 0x28, 0x00,
-       0x64, 0xFF, 0x9A, 0x01, 0x88, 0xFC, 0xEE, 0x06, 0x7E, 0xF1, 0xE3,
-       0x31, 0x9F, 0x2E, 0x88, 0xF1, 0x19, 0x07, 0x5E, 0xFC, 0xB7, 0x01,
-       0x54, 0xFF, 0x2D, 0x00, 0xFD, 0xFF, 0x06, 0x00, 0xEA, 0xFF, 0x0B,
-       0x00, 0x51, 0x00, 0xAA, 0xFE, 0xC0, 0x03, 0xB8, 0xF5, 0x21, 0x42,
-       0x31, 0x19, 0x28, 0xF5, 0x27, 0x06, 0x7C, 0xFC, 0xD4, 0x01, 0x3A,
-       0xFF, 0x35, 0x00, 0xFE, 0xFF, 0x1C, 0x00, 0x8D, 0xFF, 0xFA, 0x00,
-       0x64, 0xFE, 0x32, 0x02, 0x78, 0xFD, 0x1B, 0x02, 0xEA, 0x48, 0x50,
-       0x05, 0x14, 0xFC, 0xEB, 0x02, 0x05, 0xFE, 0x27, 0x01, 0x7C, 0xFF,
-       0x21, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x32, 0x00, 0x41, 0xFF, 0xBF,
-       0x01, 0xB2, 0xFC, 0xA9, 0x05, 0x55, 0xF6, 0x20, 0x15, 0x42, 0x44,
-       0x75, 0xF7, 0xBF, 0x02, 0x43, 0xFF, 0xFA, 0xFF, 0x36, 0x00, 0xDA,
-       0xFF, 0x0A, 0x00, 0xFD, 0xFF, 0x32, 0x00, 0x46, 0xFF, 0xD1, 0x01,
-       0x3F, 0xFC, 0x2B, 0x07, 0xCD, 0xF1, 0xAE, 0x2A, 0x86, 0x35, 0xB1,
-       0xF1, 0x9D, 0x06, 0xCA, 0xFC, 0x6E, 0x01, 0x7B, 0xFF, 0x20, 0x00,
-       0xFE, 0xFF, 0x02, 0x00, 0x05, 0x00, 0xC3, 0xFF, 0xE0, 0x00, 0xB3,
-       0xFD, 0x4B, 0x05, 0x4D, 0xF3, 0x45, 0x3D, 0xE0, 0x20, 0x4F, 0xF3,
-       0xD5, 0x06, 0x3D, 0xFC, 0xE6, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFD,
-       0xFF, 0x13, 0x00, 0xAF, 0xFF, 0xA4, 0x00, 0x19, 0xFF, 0xDD, 0x00,
-       0xF0, 0xFF, 0xD4, 0xFC, 0xC9, 0x47, 0xD8, 0x0B, 0x7C, 0xF9, 0x35,
-       0x04, 0x5F, 0xFD, 0x74, 0x01, 0x5E, 0xFF, 0x29, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x2C, 0x00, 0x56, 0xFF, 0x87, 0x01, 0x34, 0xFD, 0x8F,
-       0x04, 0xC0, 0xF8, 0xD9, 0x0D, 0x31, 0x47, 0x7B, 0xFB, 0x9C, 0x00,
-       0x7D, 0x00, 0x4D, 0xFF, 0x8A, 0x00, 0xB9, 0xFF, 0x11, 0x00, 0xFD,
-       0xFF, 0x36, 0x00, 0x38, 0xFF, 0xE6, 0x01, 0x35, 0xFC, 0xF7, 0x06,
-       0xE0, 0xF2, 0x18, 0x23, 0xAB, 0x3B, 0xCC, 0xF2, 0xA8, 0x05, 0x76,
-       0xFD, 0x04, 0x01, 0xB1, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0xFE, 0xFF,
-       0x1A, 0x00, 0x89, 0xFF, 0x53, 0x01, 0xF5, 0xFC, 0x63, 0x06, 0xE9,
-       0xF1, 0x63, 0x37, 0x85, 0x28, 0x09, 0xF2, 0x27, 0x07, 0x35, 0xFC,
-       0xDA, 0x01, 0x40, 0xFF, 0x34, 0x00, 0xFD, 0xFF, 0x0C, 0x00, 0xD1,
-       0xFF, 0x4E, 0x00, 0xCA, 0xFF, 0x9A, 0xFF, 0x2A, 0x02, 0x83, 0xF8,
-       0x3F, 0x45, 0xFB, 0x12, 0x01, 0xF7, 0x5D, 0x05, 0xD3, 0xFC, 0xB1,
-       0x01, 0x46, 0xFF, 0x31, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x23, 0x00,
-       0x73, 0xFF, 0x3F, 0x01, 0xD3, 0xFD, 0x4C, 0x03, 0x54, 0xFB, 0x1F,
-       0x07, 0xBB, 0x48, 0x7D, 0x00, 0x33, 0xFE, 0xCF, 0x01, 0x98, 0xFE,
-       0xE2, 0x00, 0x97, 0xFF, 0x19, 0x00, 0xFE, 0xFF, 0x36, 0x00, 0x38,
-       0xFF, 0xDC, 0x01, 0x64, 0xFC, 0x62, 0x06, 0x93, 0xF4, 0x66, 0x1B,
-       0xD9, 0x40, 0xEA, 0xF4, 0x3E, 0x04, 0x5D, 0xFE, 0x7D, 0x00, 0xF5,
-       0xFF, 0xF3, 0xFF, 0x05, 0x00, 0xFD, 0xFF, 0x2A, 0x00, 0x5E, 0xFF,
-       0xA6, 0x01, 0x76, 0xFC, 0x01, 0x07, 0x7D, 0xF1, 0xAD, 0x30, 0xDC,
-       0x2F, 0x7F, 0xF1, 0x0C, 0x07, 0x6C, 0xFC, 0xAD, 0x01, 0x5A, 0xFF,
-       0x2B, 0x00, 0xFD, 0xFF, 0x05, 0x00, 0xEF, 0xFF, 0xFE, 0xFF, 0x6C,
-       0x00, 0x7B, 0xFE, 0x0C, 0x04, 0x3A, 0xF5, 0x5F, 0x41, 0x83, 0x1A,
-       0xCD, 0xF4, 0x4B, 0x06, 0x6D, 0xFC, 0xD9, 0x01, 0x39, 0xFF, 0x35,
-       0x00, 0xFE, 0xFF, 0x1A, 0x00, 0x93, 0xFF, 0xEC, 0x00, 0x83, 0xFE,
-       0xF7, 0x01, 0xE8, 0xFD, 0x21, 0x01, 0xD2, 0x48, 0x64, 0x06, 0xA1,
-       0xFB, 0x26, 0x03, 0xE7, 0xFD, 0x35, 0x01, 0x76, 0xFF, 0x22, 0x00,
-       0x00, 0x00, 0xFF, 0xFF, 0x31, 0x00, 0x44, 0xFF, 0xB7, 0x01, 0xC5,
-       0xFC, 0x7C, 0x05, 0xBC, 0xF6, 0xD5, 0x13, 0xDC, 0x44, 0x14, 0xF8,
-       0x67, 0x02, 0x77, 0xFF, 0xDD, 0xFF, 0x44, 0x00, 0xD5, 0xFF, 0x0B,
-       0x00, 0xFD, 0xFF, 0x33, 0x00, 0x42, 0xFF, 0xD7, 0x01, 0x39, 0xFC,
-       0x29, 0x07, 0xEF, 0xF1, 0x62, 0x29, 0xA5, 0x36, 0xD0, 0xF1, 0x7B,
-       0x06, 0xE3, 0xFC, 0x5E, 0x01, 0x83, 0xFF, 0x1D, 0x00, 0xFE, 0xFF,
-       0x01, 0x00, 0x09, 0x00, 0xB8, 0xFF, 0xF6, 0x00, 0x8D, 0xFD, 0x84,
-       0x05, 0xFD, 0xF2, 0x52, 0x3C, 0x35, 0x22, 0x0B, 0xF3, 0xEB, 0x06,
-       0x37, 0xFC, 0xE6, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x12,
-       0x00, 0xB5, 0xFF, 0x94, 0x00, 0x39, 0xFF, 0xA3, 0x00, 0x58, 0x00,
-       0x02, 0xFC, 0x73, 0x47, 0x0B, 0x0D, 0x0B, 0xF9, 0x6C, 0x04, 0x45,
-       0xFD, 0x80, 0x01, 0x59, 0xFF, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x2A, 0x00, 0x5B, 0xFF, 0x7C, 0x01, 0x4E, 0xFD, 0x5A, 0x04, 0x31,
-       0xF9, 0xA4, 0x0C, 0x90, 0x47, 0x47, 0xFC, 0x36, 0x00, 0xB6, 0x00,
-       0x2E, 0xFF, 0x99, 0x00, 0xB3, 0xFF, 0x12, 0x00, 0xFD, 0xFF, 0x36,
-       0x00, 0x37, 0xFF, 0xE6, 0x01, 0x39, 0xFC, 0xE4, 0x06, 0x21, 0xF3,
-       0xC4, 0x21, 0xA5, 0x3C, 0x16, 0xF3, 0x72, 0x05, 0x9A, 0xFD, 0xEF,
-       0x00, 0xBC, 0xFF, 0x08, 0x00, 0x01, 0x00, 0xFE, 0xFF, 0x1E, 0x00,
-       0x80, 0xFF, 0x64, 0x01, 0xDA, 0xFC, 0x87, 0x06, 0xC5, 0xF1, 0x46,
-       0x36, 0xD1, 0x29, 0xE3, 0xF1, 0x2A, 0x07, 0x3A, 0xFC, 0xD5, 0x01,
-       0x44, 0xFF, 0x32, 0x00, 0xFD, 0xFF, 0x0A, 0x00, 0xD6, 0xFF, 0x3F,
-       0x00, 0xE7, 0xFF, 0x65, 0xFF, 0x85, 0x02, 0xDE, 0xF7, 0xA9, 0x44,
-       0x43, 0x14, 0x99, 0xF6, 0x8B, 0x05, 0xBF, 0xFC, 0xBA, 0x01, 0x43,
-       0xFF, 0x32, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x22, 0x00, 0x78, 0xFF,
-       0x31, 0x01, 0xF1, 0xFD, 0x12, 0x03, 0xC7, 0xFB, 0x07, 0x06, 0xDB,
-       0x48, 0x73, 0x01, 0xC3, 0xFD, 0x0A, 0x02, 0x79, 0xFE, 0xF1, 0x00,
-       0x91, 0xFF, 0x1B, 0x00, 0xFE, 0xFF, 0x35, 0x00, 0x39, 0xFF, 0xD7,
-       0x01, 0x72, 0xFC, 0x3F, 0x06, 0xEB, 0xF4, 0x12, 0x1A, 0xA1, 0x41,
-       0x63, 0xF5, 0xF3, 0x03, 0x8A, 0xFE, 0x63, 0x00, 0x02, 0x00, 0xEE,
-       0xFF, 0x06, 0x00, 0xFD, 0xFF, 0x2C, 0x00, 0x58, 0xFF, 0xB1, 0x01,
-       0x67, 0xFC, 0x10, 0x07, 0x81, 0xF1, 0x73, 0x2F, 0x15, 0x31, 0x7C,
-       0xF1, 0xFB, 0x06, 0x7C, 0xFC, 0xA2, 0x01, 0x60, 0xFF, 0x29, 0x00,
-       0xFD, 0xFF, 0x04, 0x00, 0xF4, 0xFF, 0xF1, 0xFF, 0x85, 0x00, 0x4E,
-       0xFE, 0x56, 0x04, 0xC3, 0xF4, 0x95, 0x40, 0xD8, 0x1B, 0x76, 0xF4,
-       0x6D, 0x06, 0x60, 0xFC, 0xDD, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFE,
-       0xFF, 0x19, 0x00, 0x99, 0xFF, 0xDD, 0x00, 0xA3, 0xFE, 0xBB, 0x01,
-       0x58, 0xFE, 0x2D, 0x00, 0xAF, 0x48, 0x7E, 0x07, 0x2E, 0xFB, 0x60,
-       0x03, 0xC9, 0xFD, 0x43, 0x01, 0x71, 0xFF, 0x24, 0x00, 0x00, 0x00,
-       0xFF, 0xFF, 0x30, 0x00, 0x48, 0xFF, 0xAE, 0x01, 0xDB, 0xFC, 0x4D,
-       0x05, 0x24, 0xF7, 0x8E, 0x12, 0x6D, 0x45, 0xBC, 0xF8, 0x0C, 0x02,
-       0xAC, 0xFF, 0xC0, 0xFF, 0x52, 0x00, 0xCF, 0xFF, 0x0C, 0x00, 0xFD,
-       0xFF, 0x34, 0x00, 0x3F, 0xFF, 0xDC, 0x01, 0x34, 0xFC, 0x25, 0x07,
-       0x18, 0xF2, 0x15, 0x28, 0xBF, 0x37, 0xF7, 0xF1, 0x56, 0x06, 0xFE,
-       0xFC, 0x4D, 0x01, 0x8C, 0xFF, 0x19, 0x00, 0xFF, 0xFF, 0x00, 0x00,
-       0x0D, 0x00, 0xAE, 0xFF, 0x0B, 0x01, 0x6A, 0xFD, 0xBA, 0x05, 0xB4,
-       0xF2, 0x58, 0x3B, 0x8A, 0x23, 0xCB, 0xF2, 0xFD, 0x06, 0x34, 0xFC,
-       0xE6, 0x01, 0x38, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x10, 0x00, 0xBB,
-       0xFF, 0x85, 0x00, 0x58, 0xFF, 0x6A, 0x00, 0xBE, 0x00, 0x38, 0xFB,
-       0x0F, 0x47, 0x42, 0x0E, 0x9B, 0xF8, 0xA1, 0x04, 0x2B, 0xFD, 0x8B,
-       0x01, 0x55, 0xFF, 0x2C, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x29, 0x00,
-       0x5F, 0xFF, 0x70, 0x01, 0x68, 0xFD, 0x23, 0x04, 0xA2, 0xF9, 0x73,
-       0x0B, 0xE4, 0x47, 0x1B, 0xFD, 0xCD, 0xFF, 0xF0, 0x00, 0x0F, 0xFF,
-       0xA9, 0x00, 0xAE, 0xFF, 0x14, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x36,
-       0xFF, 0xE6, 0x01, 0x3F, 0xFC, 0xCE, 0x06, 0x66, 0xF3, 0x6F, 0x20,
-       0x96, 0x3D, 0x69, 0xF3, 0x38, 0x05, 0xBF, 0xFD, 0xD9, 0x00, 0xC7,
-       0xFF, 0x04, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0x20, 0x00, 0x78, 0xFF,
-       0x74, 0x01, 0xC2, 0xFC, 0xA7, 0x06, 0xA8, 0xF1, 0x25, 0x35, 0x1B,
-       0x2B, 0xC2, 0xF1, 0x2A, 0x07, 0x41, 0xFC, 0xCE, 0x01, 0x47, 0xFF,
-       0x31, 0x00, 0xFD, 0xFF, 0x09, 0x00, 0xDC, 0xFF, 0x31, 0x00, 0x04,
-       0x00, 0x32, 0xFF, 0xDC, 0x02, 0x42, 0xF7, 0x0B, 0x44, 0x8E, 0x15,
-       0x34, 0xF6, 0xB7, 0x05, 0xAB, 0xFC, 0xC1, 0x01, 0x40, 0xFF, 0x33,
-       0x00, 0xFF, 0xFF, 0x00, 0x00, 0x20, 0x00, 0x7E, 0xFF, 0x23, 0x01,
-       0x0F, 0xFE, 0xD7, 0x02, 0x3B, 0xFC, 0xF5, 0x04, 0xED, 0x48, 0x70,
-       0x02, 0x52, 0xFD, 0x46, 0x02, 0x5A, 0xFE, 0xFF, 0x00, 0x8B, 0xFF,
-       0x1C, 0x00, 0xFE, 0xFF, 0x35, 0x00, 0x3B, 0xFF, 0xD2, 0x01, 0x81,
-       0xFC, 0x1A, 0x06, 0x47, 0xF5, 0xC1, 0x18, 0x60, 0x42, 0xE4, 0xF5,
-       0xA6, 0x03, 0xB9, 0xFE, 0x48, 0x00, 0x0F, 0x00, 0xE9, 0xFF, 0x07,
-       0x00, 0xFD, 0xFF, 0x2E, 0x00, 0x53, 0xFF, 0xBB, 0x01, 0x5A, 0xFC,
-       0x1C, 0x07, 0x8D, 0xF1, 0x34, 0x2E, 0x48, 0x32, 0x81, 0xF1, 0xE7,
-       0x06, 0x8E, 0xFC, 0x96, 0x01, 0x66, 0xFF, 0x27, 0x00, 0xFD, 0xFF,
-       0x04, 0x00, 0xF9, 0xFF, 0xE4, 0xFF, 0x9F, 0x00, 0x23, 0xFE, 0x9B,
-       0x04, 0x55, 0xF4, 0xC0, 0x3F, 0x2C, 0x1D, 0x22, 0xF4, 0x8C, 0x06,
-       0x55, 0xFC, 0xE1, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x17,
-       0x00, 0x9F, 0xFF, 0xCE, 0x00, 0xC2, 0xFE, 0x80, 0x01, 0xC6, 0xFE,
-       0x40, 0xFF, 0x81, 0x48, 0x9E, 0x08, 0xBA, 0xFA, 0x9A, 0x03, 0xAC,
-       0xFD, 0x51, 0x01, 0x6C, 0xFF, 0x25, 0x00, 0x00, 0x00, 0xFF, 0xFF,
-       0x2F, 0x00, 0x4B, 0xFF, 0xA4, 0x01, 0xF1, 0xFC, 0x1D, 0x05, 0x8F,
-       0xF7, 0x4A, 0x11, 0xF2, 0x45, 0x6B, 0xF9, 0xAE, 0x01, 0xE2, 0xFF,
-       0xA2, 0xFF, 0x61, 0x00, 0xC9, 0xFF, 0x0D, 0x00, 0xFD, 0xFF, 0x35,
-       0x00, 0x3D, 0xFF, 0xE0, 0x01, 0x32, 0xFC, 0x1D, 0x07, 0x45, 0xF2,
-       0xC6, 0x26, 0xD3, 0x38, 0x24, 0xF2, 0x2D, 0x06, 0x1B, 0xFD, 0x3B,
-       0x01, 0x95, 0xFF, 0x16, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x11, 0x00,
-       0xA3, 0xFF, 0x20, 0x01, 0x49, 0xFD, 0xEB, 0x05, 0x74, 0xF2, 0x54,
-       0x3A, 0xDD, 0x24, 0x91, 0xF2, 0x0C, 0x07, 0x32, 0xFC, 0xE4, 0x01,
-       0x3A, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x0F, 0x00, 0xC1, 0xFF, 0x76,
-       0x00, 0x76, 0xFF, 0x32, 0x00, 0x22, 0x01, 0x76, 0xFA, 0xA3, 0x46,
-       0x7D, 0x0F, 0x2C, 0xF8, 0xD5, 0x04, 0x13, 0xFD, 0x96, 0x01, 0x51,
-       0xFF, 0x2D, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x27, 0x00, 0x64, 0xFF,
-       0x63, 0x01, 0x84, 0xFD, 0xEB, 0x03, 0x14, 0xFA, 0x47, 0x0A, 0x2C,
-       0x48, 0xF6, 0xFD, 0x63, 0xFF, 0x2B, 0x01, 0xF0, 0xFE, 0xB8, 0x00,
-       0xA8, 0xFF, 0x15, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE4,
-       0x01, 0x47, 0xFC, 0xB5, 0x06, 0xB0, 0xF3, 0x19, 0x1F, 0x7E, 0x3E,
-       0xC4, 0xF3, 0xFA, 0x04, 0xE7, 0xFD, 0xC1, 0x00, 0xD3, 0xFF, 0xFF,
-       0xFF, 0x02, 0x00, 0xFE, 0xFF, 0x23, 0x00, 0x71, 0xFF, 0x82, 0x01,
-       0xAB, 0xFC, 0xC4, 0x06, 0x93, 0xF1, 0xFD, 0x33, 0x62, 0x2C, 0xA8,
-       0xF1, 0x27, 0x07, 0x4A, 0xFC, 0xC7, 0x01, 0x4C, 0xFF, 0x30, 0x00,
-       0xFD, 0xFF, 0x08, 0x00, 0xE1, 0xFF, 0x23, 0x00, 0x20, 0x00, 0x00,
-       0xFF, 0x31, 0x03, 0xAD, 0xF6, 0x65, 0x43, 0xDC, 0x16, 0xD1, 0xF5,
-       0xE1, 0x05, 0x99, 0xFC, 0xC9, 0x01, 0x3E, 0xFF, 0x33, 0x00, 0xFF,
-       0xFF, 0x00, 0x00, 0x1F, 0x00, 0x83, 0xFF, 0x14, 0x01, 0x2D, 0xFE,
-       0x9C, 0x02, 0xAD, 0xFC, 0xE9, 0x03, 0xF6, 0x48, 0x73, 0x03, 0xE0,
-       0xFC, 0x82, 0x02, 0x3B, 0xFE, 0x0E, 0x01, 0x86, 0xFF, 0x1E, 0x00,
-       0xFE, 0xFF, 0x34, 0x00, 0x3D, 0xFF, 0xCC, 0x01, 0x91, 0xFC, 0xF3,
-       0x05, 0xA6, 0xF5, 0x70, 0x17, 0x17, 0x43, 0x6D, 0xF6, 0x56, 0x03,
-       0xEA, 0xFE, 0x2D, 0x00, 0x1D, 0x00, 0xE4, 0xFF, 0x08, 0x00, 0xFD,
-       0xFF, 0x2F, 0x00, 0x4E, 0xFF, 0xC3, 0x01, 0x4E, 0xFC, 0x24, 0x07,
-       0x9E, 0xF1, 0xF2, 0x2C, 0x78, 0x33, 0x8C, 0xF1, 0xD0, 0x06, 0xA2,
-       0xFC, 0x88, 0x01, 0x6D, 0xFF, 0x24, 0x00, 0xFD, 0xFF, 0x03, 0x00,
-       0xFD, 0xFF, 0xD8, 0xFF, 0xB7, 0x00, 0xF9, 0xFD, 0xDE, 0x04, 0xEF,
-       0xF3, 0xE4, 0x3E, 0x81, 0x1E, 0xD2, 0xF3, 0xA9, 0x06, 0x4B, 0xFC,
-       0xE3, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x16, 0x00, 0xA5,
-       0xFF, 0xBE, 0x00, 0xE2, 0xFE, 0x45, 0x01, 0x33, 0xFF, 0x5A, 0xFE,
-       0x48, 0x48, 0xC3, 0x09, 0x47, 0xFA, 0xD2, 0x03, 0x90, 0xFD, 0x5E,
-       0x01, 0x66, 0xFF, 0x27, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x2E, 0x00,
-       0x4F, 0xFF, 0x9A, 0x01, 0x08, 0xFD, 0xEB, 0x04, 0xFC, 0xF7, 0x0A,
-       0x10, 0x70, 0x46, 0x22, 0xFA, 0x4D, 0x01, 0x19, 0x00, 0x84, 0xFF,
-       0x70, 0x00, 0xC4, 0xFF, 0x0F, 0x00, 0xFD, 0xFF, 0x35, 0x00, 0x3B,
-       0xFF, 0xE3, 0x01, 0x31, 0xFC, 0x12, 0x07, 0x79, 0xF2, 0x73, 0x25,
-       0xDF, 0x39, 0x5A, 0xF2, 0x00, 0x06, 0x3A, 0xFD, 0x28, 0x01, 0x9F,
-       0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x15, 0x00, 0x99, 0xFF,
-       0x33, 0x01, 0x29, 0xFD, 0x1A, 0x06, 0x3B, 0xF2, 0x4B, 0x39, 0x30,
-       0x26, 0x5B, 0xF2, 0x19, 0x07, 0x31, 0xFC, 0xE1, 0x01, 0x3C, 0xFF,
-       0x35, 0x00, 0xFD, 0xFF, 0x0E, 0x00, 0xC7, 0xFF, 0x68, 0x00, 0x95,
-       0xFF, 0xFA, 0xFF, 0x83, 0x01, 0xBB, 0xF9, 0x2B, 0x46, 0xBB, 0x10,
-       0xBF, 0xF7, 0x07, 0x05, 0xFB, 0xFC, 0xA0, 0x01, 0x4D, 0xFF, 0x2F,
-       0x00, 0xFF, 0xFF, 0x00, 0x00, 0x26, 0x00, 0x69, 0xFF, 0x56, 0x01,
-       0xA0, 0xFD, 0xB3, 0x03, 0x87, 0xFA, 0x1F, 0x09, 0x6A, 0x48, 0xD9,
-       0xFE, 0xF6, 0xFE, 0x65, 0x01, 0xD0, 0xFE, 0xC7, 0x00, 0xA2, 0xFF,
-       0x17, 0x00, 0xFE, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE2, 0x01, 0x50,
-       0xFC, 0x99, 0x06, 0xFE, 0xF3, 0xC3, 0x1D, 0x5E, 0x3F, 0x27, 0xF4,
-       0xB9, 0x04, 0x10, 0xFE, 0xA9, 0x00, 0xDF, 0xFF, 0xFB, 0xFF, 0x03,
-       0x00, 0xFD, 0xFF, 0x26, 0x00, 0x69, 0xFF, 0x90, 0x01, 0x96, 0xFC,
-       0xDD, 0x06, 0x85, 0xF1, 0xD0, 0x32, 0xA6, 0x2D, 0x94, 0xF1, 0x20,
-       0x07, 0x54, 0xFC, 0xBF, 0x01, 0x50, 0xFF, 0x2E, 0x00, 0xFD, 0xFF,
-       0x07, 0x00, 0xE6, 0xFF, 0x15, 0x00, 0x3C, 0x00, 0xCF, 0xFE, 0x83,
-       0x03, 0x20, 0xF6, 0xB2, 0x42, 0x2B, 0x18, 0x71, 0xF5, 0x09, 0x06,
-       0x88, 0xFC, 0xCF, 0x01, 0x3C, 0xFF, 0x34, 0x00, 0xFE, 0xFF, 0x1D,
-       0x00, 0x89, 0xFF, 0x06, 0x01, 0x4C, 0xFE, 0x60, 0x02, 0x1F, 0xFD,
-       0xE2, 0x02, 0xF3, 0x48, 0x7D, 0x04, 0x6E, 0xFC, 0xBD, 0x02, 0x1C,
-       0xFE, 0x1C, 0x01, 0x80, 0xFF, 0x20, 0x00, 0x00, 0x00, 0xFF, 0xFF,
-       0x33, 0x00, 0x3F, 0xFF, 0xC5, 0x01, 0xA3, 0xFC, 0xCA, 0x05, 0x07,
-       0xF6, 0x22, 0x16, 0xC3, 0x43, 0xFE, 0xF6, 0x02, 0x03, 0x1B, 0xFF,
-       0x11, 0x00, 0x2B, 0x00, 0xDE, 0xFF, 0x09, 0x00, 0xFD, 0xFF, 0x31,
-       0x00, 0x49, 0xFF, 0xCB, 0x01, 0x45, 0xFC, 0x29, 0x07, 0xB6, 0xF1,
-       0xAD, 0x2B, 0xA2, 0x34, 0x9E, 0xF1, 0xB4, 0x06, 0xB8, 0xFC, 0x7A,
-       0x01, 0x75, 0xFF, 0x22, 0x00, 0xFE, 0xFF, 0x02, 0x00, 0x02, 0x00,
-       0xCC, 0xFF, 0xCE, 0x00, 0xD1, 0xFD, 0x1D, 0x05, 0x91, 0xF3, 0xFE,
-       0x3D, 0xD7, 0x1F, 0x87, 0xF3, 0xC3, 0x06, 0x42, 0xFC, 0xE5, 0x01,
-       0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x14, 0x00, 0xAB, 0xFF, 0xAF,
-       0x00, 0x01, 0xFF, 0x0A, 0x01, 0x9E, 0xFF, 0x7C, 0xFD, 0x03, 0x48,
-       0xED, 0x0A, 0xD5, 0xF9, 0x0A, 0x04, 0x74, 0xFD, 0x6A, 0x01, 0x62,
-       0xFF, 0x28, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x2D, 0x00, 0x53, 0xFF,
-       0x90, 0x01, 0x20, 0xFD, 0xB8, 0x04, 0x6A, 0xF8, 0xCD, 0x0E, 0xE1,
-       0x46, 0xE1, 0xFA, 0xEB, 0x00, 0x51, 0x00, 0x65, 0xFF, 0x7F, 0x00,
-       0xBE, 0xFF, 0x10, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x39, 0xFF, 0xE5,
-       0x01, 0x33, 0xFC, 0x04, 0x07, 0xB1, 0xF2, 0x21, 0x24, 0xE6, 0x3A,
-       0x97, 0xF2, 0xD0, 0x05, 0x5B, 0xFD, 0x15, 0x01, 0xA9, 0xFF, 0x0F,
-       0x00, 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x00, 0x90, 0xFF, 0x45, 0x01,
-       0x0B, 0xFD, 0x44, 0x06, 0x0A, 0xF2, 0x3B, 0x38, 0x80, 0x27, 0x2B,
-       0xF2, 0x22, 0x07, 0x33, 0xFC, 0xDE, 0x01, 0x3E, 0xFF, 0x34, 0x00,
-       0xFD, 0xFF, 0x0D, 0x00, 0xCD, 0xFF, 0x59, 0x00, 0xB3, 0xFF, 0xC4,
-       0xFF, 0xE2, 0x01, 0x09, 0xF9, 0xAA, 0x45, 0xFE, 0x11, 0x54, 0xF7,
-       0x38, 0x05, 0xE4, 0xFC, 0xAA, 0x01, 0x49, 0xFF, 0x30, 0x00, 0xFF,
-       0xFF, 0x00, 0x00, 0x24, 0x00, 0x6E, 0xFF, 0x49, 0x01, 0xBC, 0xFD,
-       0x7A, 0x03, 0xFA, 0xFA, 0xFD, 0x07, 0x9C, 0x48, 0xC3, 0xFF, 0x89,
-       0xFE, 0xA1, 0x01, 0xB1, 0xFE, 0xD6, 0x00, 0x9C, 0xFF, 0x18, 0x00,
-       0xFE, 0xFF, 0x36, 0x00, 0x37, 0xFF, 0xDF, 0x01, 0x5B, 0xFC, 0x7B,
-       0x06, 0x50, 0xF4, 0x6E, 0x1C, 0x36, 0x40, 0x92, 0xF4, 0x75, 0x04,
-       0x3B, 0xFE, 0x91, 0x00, 0xEB, 0xFF, 0xF6, 0xFF, 0x04, 0x00, 0xFD,
-       0xFF, 0x28, 0x00, 0x63, 0xFF, 0x9D, 0x01, 0x84, 0xFC, 0xF3, 0x06,
-       0x7D, 0xF1, 0x9E, 0x31, 0xE6, 0x2E, 0x85, 0xF1, 0x16, 0x07, 0x61,
-       0xFC, 0xB5, 0x01, 0x55, 0xFF, 0x2D, 0x00, 0xFD, 0xFF, 0x06, 0x00,
-       0xEC, 0xFF, 0x08, 0x00, 0x57, 0x00, 0x9F, 0xFE, 0xD1, 0x03, 0x9B,
-       0xF5, 0xF7, 0x41, 0x7C, 0x19, 0x13, 0xF5, 0x2F, 0x06, 0x78, 0xFC,
-       0xD5, 0x01, 0x3A, 0xFF, 0x35, 0x00, 0xFE, 0xFF, 0x1C, 0x00, 0x8F,
-       0xFF, 0xF7, 0x00, 0x6B, 0xFE, 0x25, 0x02, 0x91, 0xFD, 0xE3, 0x01,
-       0xE5, 0x48, 0x8D, 0x05, 0xFB, 0xFB, 0xF8, 0x02, 0xFE, 0xFD, 0x2B,
-       0x01, 0x7A, 0xFF, 0x21, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x32, 0x00,
-       0x42, 0xFF, 0xBD, 0x01, 0xB6, 0xFC, 0x9F, 0x05, 0x6C, 0xF6, 0xD6,
-       0x14, 0x65, 0x44, 0x98, 0xF7, 0xAC, 0x02, 0x4E, 0xFF, 0xF4, 0xFF,
-       0x39, 0x00, 0xD9, 0xFF, 0x0A, 0x00, 0xFD, 0xFF, 0x32, 0x00, 0x45,
-       0xFF, 0xD2, 0x01, 0x3D, 0xFC, 0x2B, 0x07, 0xD4, 0xF1, 0x64, 0x2A,
-       0xC6, 0x35, 0xB7, 0xF1, 0x96, 0x06, 0xCF, 0xFC, 0x6B, 0x01, 0x7D,
-       0xFF, 0x1F, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x06, 0x00, 0xC1, 0xFF,
-       0xE5, 0x00, 0xAA, 0xFD, 0x58, 0x05, 0x3A, 0xF3, 0x11, 0x3D, 0x2C,
-       0x21, 0x3F, 0xF3, 0xDA, 0x06, 0x3B, 0xFC, 0xE6, 0x01, 0x36, 0xFF,
-       0x36, 0x00, 0xFD, 0xFF, 0x13, 0x00, 0xB1, 0xFF, 0xA0, 0x00, 0x20,
-       0xFF, 0xD0, 0x00, 0x07, 0x00, 0xA4, 0xFC, 0xB6, 0x47, 0x1C, 0x0C,
-       0x63, 0xF9, 0x42, 0x04, 0x59, 0xFD, 0x76, 0x01, 0x5D, 0xFF, 0x2A,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x57, 0xFF, 0x85, 0x01,
-       0x39, 0xFD, 0x84, 0x04, 0xD9, 0xF8, 0x95, 0x0D, 0x48, 0x47, 0xA7,
-       0xFB, 0x86, 0x00, 0x8A, 0x00, 0x46, 0xFF, 0x8E, 0x00, 0xB8, 0xFF,
-       0x11, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x37, 0xFF, 0xE6, 0x01, 0x35,
-       0xFC, 0xF3, 0x06, 0xEE, 0xF2, 0xCD, 0x22, 0xE4, 0x3B, 0xDC, 0xF2,
-       0x9C, 0x05, 0x7E, 0xFD, 0x00, 0x01, 0xB4, 0xFF, 0x0B, 0x00, 0x01,
-       0x00, 0xFE, 0xFF, 0x1B, 0x00, 0x87, 0xFF, 0x57, 0x01, 0xEF, 0xFC,
-       0x6B, 0x06, 0xE0, 0xF1, 0x23, 0x37, 0xCE, 0x28, 0x01, 0xF2, 0x28,
-       0x07, 0x36, 0xFC, 0xD9, 0x01, 0x41, 0xFF, 0x33, 0x00, 0xFD, 0xFF,
-       0x0B, 0x00, 0xD2, 0xFF, 0x4A, 0x00, 0xD0, 0xFF, 0x8E, 0xFF, 0x3F,
-       0x02, 0x5E, 0xF8, 0x1E, 0x45, 0x44, 0x13, 0xEA, 0xF6, 0x67, 0x05,
-       0xCF, 0xFC, 0xB3, 0x01, 0x46, 0xFF, 0x31, 0x00, 0xFF, 0xFF, 0x00,
-       0x00, 0x23, 0x00, 0x74, 0xFF, 0x3C, 0x01, 0xDA, 0xFD, 0x40, 0x03,
-       0x6E, 0xFB, 0xE1, 0x06, 0xC3, 0x48, 0xB3, 0x00, 0x1A, 0xFE, 0xDC,
-       0x01, 0x91, 0xFE, 0xE5, 0x00, 0x96, 0xFF, 0x1A, 0x00, 0xFE, 0xFF,
-       0x36, 0x00, 0x38, 0xFF, 0xDB, 0x01, 0x67, 0xFC, 0x5A, 0x06, 0xA6,
-       0xF4, 0x1B, 0x1B, 0x07, 0x41, 0x04, 0xF5, 0x2D, 0x04, 0x67, 0xFE,
-       0x77, 0x00, 0xF8, 0xFF, 0xF2, 0xFF, 0x05, 0x00, 0xFD, 0xFF, 0x2A,
-       0x00, 0x5C, 0xFF, 0xA8, 0x01, 0x73, 0xFC, 0x05, 0x07, 0x7D, 0xF1,
-       0x67, 0x30, 0x21, 0x30, 0x7E, 0xF1, 0x08, 0x07, 0x6F, 0xFC, 0xAB,
-       0x01, 0x5B, 0xFF, 0x2B, 0x00, 0xFD, 0xFF, 0x05, 0x00, 0xF0, 0xFF,
-       0xFB, 0xFF, 0x71, 0x00, 0x71, 0xFE, 0x1D, 0x04, 0x1F, 0xF5, 0x32,
-       0x41, 0xCE, 0x1A, 0xBA, 0xF4, 0x53, 0x06, 0x6A, 0xFC, 0xDA, 0x01,
-       0x38, 0xFF, 0x35, 0x00, 0xFE, 0xFF, 0x1A, 0x00, 0x95, 0xFF, 0xE8,
-       0x00, 0x8A, 0xFE, 0xE9, 0x01, 0x01, 0xFE, 0xEA, 0x00, 0xCB, 0x48,
-       0xA2, 0x06, 0x87, 0xFB, 0x33, 0x03, 0xE0, 0xFD, 0x39, 0x01, 0x75,
-       0xFF, 0x23, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x31, 0x00, 0x45, 0xFF,
-       0xB5, 0x01, 0xCA, 0xFC, 0x72, 0x05, 0xD3, 0xF6, 0x8D, 0x13, 0xFD,
-       0x44, 0x39, 0xF8, 0x53, 0x02, 0x82, 0xFF, 0xD7, 0xFF, 0x47, 0x00,
-       0xD3, 0xFF, 0x0B, 0x00, 0xFD, 0xFF, 0x33, 0x00, 0x42, 0xFF, 0xD8,
-       0x01, 0x37, 0xFC, 0x29, 0x07, 0xF8, 0xF1, 0x19, 0x29, 0xE5, 0x36,
-       0xD8, 0xF1, 0x73, 0x06, 0xE9, 0xFC, 0x5B, 0x01, 0x85, 0xFF, 0x1C,
-       0x00, 0xFE, 0xFF, 0x01, 0x00, 0x0A, 0x00, 0xB6, 0xFF, 0xFB, 0x00,
-       0x85, 0xFD, 0x90, 0x05, 0xEC, 0xF2, 0x1C, 0x3C, 0x81, 0x22, 0xFC,
-       0xF2, 0xEF, 0x06, 0x36, 0xFC, 0xE6, 0x01, 0x37, 0xFF, 0x36, 0x00,
-       0xFD, 0xFF, 0x12, 0x00, 0xB7, 0xFF, 0x91, 0x00, 0x40, 0xFF, 0x96,
-       0x00, 0x6F, 0x00, 0xD5, 0xFB, 0x5E, 0x47, 0x50, 0x0D, 0xF2, 0xF8,
-       0x78, 0x04, 0x3F, 0xFD, 0x82, 0x01, 0x58, 0xFF, 0x2B, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x2A, 0x00, 0x5C, 0xFF, 0x79, 0x01, 0x53, 0xFD,
-       0x4E, 0x04, 0x4A, 0xF9, 0x60, 0x0C, 0xA3, 0x47, 0x76, 0xFC, 0x1F,
-       0x00, 0xC3, 0x00, 0x27, 0xFF, 0x9D, 0x00, 0xB2, 0xFF, 0x13, 0x00,
-       0xFD, 0xFF, 0x36, 0x00, 0x37, 0xFF, 0xE6, 0x01, 0x3A, 0xFC, 0xDF,
-       0x06, 0x30, 0xF3, 0x78, 0x21, 0xDB, 0x3C, 0x28, 0xF3, 0x65, 0x05,
-       0xA2, 0xFD, 0xEA, 0x00, 0xBE, 0xFF, 0x07, 0x00, 0x01, 0x00, 0xFE,
-       0xFF, 0x1E, 0x00, 0x7F, 0xFF, 0x67, 0x01, 0xD5, 0xFC, 0x8E, 0x06,
-       0xBE, 0xF1, 0x06, 0x36, 0x1A, 0x2A, 0xDC, 0xF1, 0x2A, 0x07, 0x3C,
-       0xFC, 0xD3, 0x01, 0x44, 0xFF, 0x32, 0x00, 0xFD, 0xFF, 0x0A, 0x00,
-       0xD8, 0xFF, 0x3C, 0x00, 0xEE, 0xFF, 0x5A, 0xFF, 0x98, 0x02, 0xBB,
-       0xF7, 0x87, 0x44, 0x8C, 0x14, 0x83, 0xF6, 0x95, 0x05, 0xBA, 0xFC,
-       0xBB, 0x01, 0x43, 0xFF, 0x32, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x21,
-       0x00, 0x79, 0xFF, 0x2E, 0x01, 0xF7, 0xFD, 0x05, 0x03, 0xE1, 0xFB,
-       0xCA, 0x05, 0xDF, 0x48, 0xAB, 0x01, 0xAA, 0xFD, 0x18, 0x02, 0x72,
-       0xFE, 0xF4, 0x00, 0x90, 0xFF, 0x1B, 0x00, 0xFE, 0xFF, 0x35, 0x00,
-       0x39, 0xFF, 0xD6, 0x01, 0x75, 0xFC, 0x37, 0x06, 0xFF, 0xF4, 0xC7,
-       0x19, 0xCC, 0x41, 0x7F, 0xF5, 0xE2, 0x03, 0x95, 0xFE, 0x5D, 0x00,
-       0x05, 0x00, 0xED, 0xFF, 0x06, 0x00, 0xFD, 0xFF, 0x2C, 0x00, 0x57,
-       0xFF, 0xB3, 0x01, 0x64, 0xFC, 0x13, 0x07, 0x83, 0xF1, 0x2C, 0x2F,
-       0x5A, 0x31, 0x7D, 0xF1, 0xF7, 0x06, 0x80, 0xFC, 0x9F, 0x01, 0x61,
-       0xFF, 0x29, 0x00, 0xFD, 0xFF, 0x04, 0x00, 0xF5, 0xFF, 0xEE, 0xFF,
-       0x8B, 0x00, 0x44, 0xFE, 0x65, 0x04, 0xAA, 0xF4, 0x66, 0x40, 0x23,
-       0x1C, 0x63, 0xF4, 0x74, 0x06, 0x5D, 0xFC, 0xDE, 0x01, 0x37, 0xFF,
-       0x36, 0x00, 0xFE, 0xFF, 0x19, 0x00, 0x9A, 0xFF, 0xD9, 0x00, 0xAA,
-       0xFE, 0xAE, 0x01, 0x70, 0xFE, 0xF8, 0xFF, 0xA6, 0x48, 0xBE, 0x07,
-       0x14, 0xFB, 0x6D, 0x03, 0xC3, 0xFD, 0x46, 0x01, 0x70, 0xFF, 0x24,
-       0x00, 0x00, 0x00, 0xFF, 0xFF, 0x30, 0x00, 0x48, 0xFF, 0xAC, 0x01,
-       0xDF, 0xFC, 0x43, 0x05, 0x3C, 0xF7, 0x46, 0x12, 0x8D, 0x45, 0xE2,
-       0xF8, 0xF7, 0x01, 0xB8, 0xFF, 0xB9, 0xFF, 0x56, 0x00, 0xCE, 0xFF,
-       0x0C, 0x00, 0xFD, 0xFF, 0x34, 0x00, 0x3F, 0xFF, 0xDD, 0x01, 0x34,
-       0xFC, 0x23, 0x07, 0x21, 0xF2, 0xCB, 0x27, 0xFE, 0x37, 0x00, 0xF2,
-       0x4D, 0x06, 0x04, 0xFD, 0x49, 0x01, 0x8E, 0xFF, 0x19, 0x00, 0xFF,
-       0xFF, 0x00, 0x00, 0x0E, 0x00, 0xAB, 0xFF, 0x10, 0x01, 0x62, 0xFD,
-       0xC5, 0x05, 0xA5, 0xF2, 0x1F, 0x3B, 0xD6, 0x23, 0xBE, 0xF2, 0x01,
-       0x07, 0x33, 0xFC, 0xE5, 0x01, 0x38, 0xFF, 0x36, 0x00, 0xFD, 0xFF,
-       0x10, 0x00, 0xBD, 0xFF, 0x82, 0x00, 0x5E, 0xFF, 0x5D, 0x00, 0xD4,
-       0x00, 0x0C, 0xFB, 0xF9, 0x46, 0x87, 0x0E, 0x82, 0xF8, 0xAD, 0x04,
-       0x26, 0xFD, 0x8D, 0x01, 0x54, 0xFF, 0x2C, 0x00, 0xFF, 0xFF, 0x00,
-       0x00, 0x29, 0x00, 0x60, 0xFF, 0x6D, 0x01, 0x6E, 0xFD, 0x17, 0x04,
-       0xBC, 0xF9, 0x30, 0x0B, 0xF4, 0x47, 0x4B, 0xFD, 0xB5, 0xFF, 0xFD,
-       0x00, 0x08, 0xFF, 0xAC, 0x00, 0xAC, 0xFF, 0x14, 0x00, 0xFD, 0xFF,
-       0x36, 0x00, 0x36, 0xFF, 0xE6, 0x01, 0x41, 0xFC, 0xC8, 0x06, 0x76,
-       0xF3, 0x22, 0x20, 0xCA, 0x3D, 0x7D, 0xF3, 0x2A, 0x05, 0xC8, 0xFD,
-       0xD4, 0x00, 0xCA, 0xFF, 0x03, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0x21,
-       0x00, 0x77, 0xFF, 0x77, 0x01, 0xBD, 0xFC, 0xAE, 0x06, 0xA3, 0xF1,
-       0xE3, 0x34, 0x64, 0x2B, 0xBC, 0xF1, 0x2A, 0x07, 0x43, 0xFC, 0xCD,
-       0x01, 0x48, 0xFF, 0x31, 0x00, 0xFD, 0xFF, 0x09, 0x00, 0xDD, 0xFF,
-       0x2E, 0x00, 0x0A, 0x00, 0x27, 0xFF, 0xEF, 0x02, 0x20, 0xF7, 0xE7,
-       0x43, 0xD8, 0x15, 0x1E, 0xF6, 0xC0, 0x05, 0xA7, 0xFC, 0xC3, 0x01,
-       0x40, 0xFF, 0x33, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x20, 0x00, 0x7F,
-       0xFF, 0x20, 0x01, 0x16, 0xFE, 0xCA, 0x02, 0x54, 0xFC, 0xB9, 0x04,
-       0xF2, 0x48, 0xA9, 0x02, 0x39, 0xFD, 0x53, 0x02, 0x53, 0xFE, 0x03,
-       0x01, 0x8A, 0xFF, 0x1D, 0x00, 0xFE, 0xFF, 0x34, 0x00, 0x3B, 0xFF,
-       0xD1, 0x01, 0x84, 0xFC, 0x12, 0x06, 0x5C, 0xF5, 0x76, 0x18, 0x89,
-       0x42, 0x02, 0xF6, 0x94, 0x03, 0xC4, 0xFE, 0x42, 0x00, 0x12, 0x00,
-       0xE8, 0xFF, 0x07, 0x00, 0xFD, 0xFF, 0x2E, 0x00, 0x51, 0xFF, 0xBD,
-       0x01, 0x57, 0xFC, 0x1E, 0x07, 0x90, 0xF1, 0xED, 0x2D, 0x8C, 0x32,
-       0x83, 0xF1, 0xE2, 0x06, 0x92, 0xFC, 0x93, 0x01, 0x68, 0xFF, 0x26,
-       0x00, 0xFD, 0xFF, 0x03, 0x00, 0xFA, 0xFF, 0xE2, 0xFF, 0xA4, 0x00,
-       0x19, 0xFE, 0xAA, 0x04, 0x3E, 0xF4, 0x90, 0x3F, 0x78, 0x1D, 0x10,
-       0xF4, 0x93, 0x06, 0x52, 0xFC, 0xE1, 0x01, 0x36, 0xFF, 0x36, 0x00,
-       0xFE, 0xFF, 0x17, 0x00, 0xA0, 0xFF, 0xCA, 0x00, 0xC9, 0xFE, 0x73,
-       0x01, 0xDE, 0xFE, 0x0C, 0xFF, 0x76, 0x48, 0xDE, 0x08, 0xA1, 0xFA,
-       0xA6, 0x03, 0xA6, 0xFD, 0x53, 0x01, 0x6A, 0xFF, 0x26, 0x00, 0x00,
-       0x00, 0xFF, 0xFF, 0x2F, 0x00, 0x4C, 0xFF, 0xA2, 0x01, 0xF6, 0xFC,
-       0x12, 0x05, 0xA7, 0xF7, 0x03, 0x11, 0x10, 0x46, 0x93, 0xF9, 0x98,
-       0x01, 0xEE, 0xFF, 0x9B, 0xFF, 0x64, 0x00, 0xC8, 0xFF, 0x0E, 0x00,
-       0xFD, 0xFF, 0x35, 0x00, 0x3C, 0xFF, 0xE1, 0x01, 0x32, 0xFC, 0x1B,
-       0x07, 0x50, 0xF2, 0x7B, 0x26, 0x11, 0x39, 0x2F, 0xF2, 0x23, 0x06,
-       0x22, 0xFD, 0x37, 0x01, 0x97, 0xFF, 0x15, 0x00, 0xFF, 0xFF, 0x00,
-       0x00, 0x12, 0x00, 0xA1, 0xFF, 0x24, 0x01, 0x41, 0xFD, 0xF6, 0x05,
-       0x67, 0xF2, 0x1A, 0x3A, 0x29, 0x25, 0x84, 0xF2, 0x0F, 0x07, 0x31,
-       0xFC, 0xE3, 0x01, 0x3A, 0xFF, 0x35, 0x00, 0xFD, 0xFF, 0x0F, 0x00,
-       0xC2, 0xFF, 0x73, 0x00, 0x7D, 0xFF, 0x25, 0x00, 0x38, 0x01, 0x4C,
-       0xFA, 0x89, 0x46, 0xC3, 0x0F, 0x14, 0xF8, 0xE0, 0x04, 0x0D, 0xFD,
-       0x98, 0x01, 0x50, 0xFF, 0x2E, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x27,
-       0x00, 0x65, 0xFF, 0x60, 0x01, 0x8A, 0xFD, 0xDF, 0x03, 0x2E, 0xFA,
-       0x04, 0x0A, 0x3A, 0x48, 0x28, 0xFE, 0x4B, 0xFF, 0x38, 0x01, 0xE9,
-       0xFE, 0xBB, 0x00, 0xA6, 0xFF, 0x16, 0x00, 0xFE, 0xFF, 0x36, 0x00,
-       0x36, 0xFF, 0xE4, 0x01, 0x49, 0xFC, 0xAF, 0x06, 0xC1, 0xF3, 0xCD,
-       0x1E, 0xB1, 0x3E, 0xD9, 0xF3, 0xEC, 0x04, 0xF0, 0xFD, 0xBC, 0x00,
-       0xD5, 0xFF, 0xFE, 0xFF, 0x03, 0x00, 0xFD, 0xFF, 0x24, 0x00, 0x6F,
-       0xFF, 0x85, 0x01, 0xA6, 0xFC, 0xCA, 0x06, 0x8F, 0xF1, 0xBB, 0x33,
-       0xAB, 0x2C, 0xA3, 0xF1, 0x26, 0x07, 0x4C, 0xFC, 0xC5, 0x01, 0x4D,
-       0xFF, 0x30, 0x00, 0xFD, 0xFF, 0x08, 0x00, 0xE2, 0xFF, 0x20, 0x00,
-       0x26, 0x00, 0xF5, 0xFE, 0x43, 0x03, 0x8D, 0xF6, 0x3C, 0x43, 0x25,
-       0x17, 0xBB, 0xF5, 0xEA, 0x05, 0x95, 0xFC, 0xCA, 0x01, 0x3D, 0xFF,
-       0x34, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x1E, 0x00, 0x84, 0xFF, 0x11,
-       0x01, 0x34, 0xFE, 0x8F, 0x02, 0xC7, 0xFC, 0xAE, 0x03, 0xF7, 0x48,
-       0xAE, 0x03, 0xC7, 0xFC, 0x8F, 0x02, 0x34, 0xFE, 0x11, 0x01, 0x84,
-       0xFF, 0x1E, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE6, 0x01,
-       0x3D, 0xFC, 0xD6, 0x06, 0x4C, 0xF3, 0xED, 0x20, 0x3D, 0x3D, 0x4A,
-       0xF3, 0x4E, 0x05, 0xB1, 0xFD, 0xE1, 0x00, 0xC3, 0xFF, 0x05, 0x00,
-       0x02, 0x00, 0x02, 0x00, 0x05, 0x00, 0xC3, 0xFF, 0xE1, 0x00, 0xB1,
-       0xFD, 0x4E, 0x05, 0x4A, 0xF3, 0x3D, 0x3D, 0xED, 0x20, 0x4C, 0xF3,
-       0xD6, 0x06, 0x3D, 0xFC, 0xE6, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFD,
-       0xFF, 0x00, 0x00, 0x1E, 0x00, 0x84, 0xFF, 0x11, 0x01, 0x34, 0xFE,
-       0x8F, 0x02, 0xC7, 0xFC, 0xAE, 0x03, 0xF7, 0x48, 0xAE, 0x03, 0xC7,
-       0xFC, 0x8F, 0x02, 0x34, 0xFE, 0x11, 0x01, 0x84, 0xFF, 0x1E, 0x00,
-       0xFD, 0xFF, 0x30, 0x00, 0x4D, 0xFF, 0xC5, 0x01, 0x4C, 0xFC, 0x26,
-       0x07, 0xA3, 0xF1, 0xAB, 0x2C, 0xBB, 0x33, 0x8F, 0xF1, 0xCA, 0x06,
-       0xA6, 0xFC, 0x85, 0x01, 0x6F, 0xFF, 0x24, 0x00, 0xFD, 0xFF, 0x16,
-       0x00, 0xA6, 0xFF, 0xBB, 0x00, 0xE9, 0xFE, 0x38, 0x01, 0x4B, 0xFF,
-       0x28, 0xFE, 0x3A, 0x48, 0x04, 0x0A, 0x2E, 0xFA, 0xDF, 0x03, 0x8A,
-       0xFD, 0x60, 0x01, 0x65, 0xFF, 0x27, 0x00, 0x00, 0x00, 0xFD, 0xFF,
-       0x35, 0x00, 0x3A, 0xFF, 0xE3, 0x01, 0x31, 0xFC, 0x0F, 0x07, 0x84,
-       0xF2, 0x29, 0x25, 0x1A, 0x3A, 0x67, 0xF2, 0xF6, 0x05, 0x41, 0xFD,
-       0x24, 0x01, 0xA1, 0xFF, 0x12, 0x00, 0x00, 0x00, 0x0E, 0x00, 0xC8,
-       0xFF, 0x64, 0x00, 0x9B, 0xFF, 0xEE, 0xFF, 0x98, 0x01, 0x93, 0xF9,
-       0x10, 0x46, 0x03, 0x11, 0xA7, 0xF7, 0x12, 0x05, 0xF6, 0xFC, 0xA2,
-       0x01, 0x4C, 0xFF, 0x2F, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x36, 0x00,
-       0x36, 0xFF, 0xE1, 0x01, 0x52, 0xFC, 0x93, 0x06, 0x10, 0xF4, 0x78,
-       0x1D, 0x90, 0x3F, 0x3E, 0xF4, 0xAA, 0x04, 0x19, 0xFE, 0xA4, 0x00,
-       0xE2, 0xFF, 0xFA, 0xFF, 0x03, 0x00, 0x07, 0x00, 0xE8, 0xFF, 0x12,
-       0x00, 0x42, 0x00, 0xC4, 0xFE, 0x94, 0x03, 0x02, 0xF6, 0x89, 0x42,
-       0x76, 0x18, 0x5C, 0xF5, 0x12, 0x06, 0x84, 0xFC, 0xD1, 0x01, 0x3B,
-       0xFF, 0x34, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x33, 0x00, 0x40, 0xFF,
-       0xC3, 0x01, 0xA7, 0xFC, 0xC0, 0x05, 0x1E, 0xF6, 0xD8, 0x15, 0xE7,
-       0x43, 0x20, 0xF7, 0xEF, 0x02, 0x27, 0xFF, 0x0A, 0x00, 0x2E, 0x00,
-       0xDD, 0xFF, 0x09, 0x00, 0x02, 0x00, 0x03, 0x00, 0xCA, 0xFF, 0xD4,
-       0x00, 0xC8, 0xFD, 0x2A, 0x05, 0x7D, 0xF3, 0xCA, 0x3D, 0x22, 0x20,
-       0x76, 0xF3, 0xC8, 0x06, 0x41, 0xFC, 0xE6, 0x01, 0x36, 0xFF, 0x36,
-       0x00, 0xFD, 0xFF, 0xFF, 0xFF, 0x2C, 0x00, 0x54, 0xFF, 0x8D, 0x01,
-       0x26, 0xFD, 0xAD, 0x04, 0x82, 0xF8, 0x87, 0x0E, 0xF9, 0x46, 0x0C,
-       0xFB, 0xD4, 0x00, 0x5D, 0x00, 0x5E, 0xFF, 0x82, 0x00, 0xBD, 0xFF,
-       0x10, 0x00, 0xFF, 0xFF, 0x19, 0x00, 0x8E, 0xFF, 0x49, 0x01, 0x04,
-       0xFD, 0x4D, 0x06, 0x00, 0xF2, 0xFE, 0x37, 0xCB, 0x27, 0x21, 0xF2,
-       0x23, 0x07, 0x34, 0xFC, 0xDD, 0x01, 0x3F, 0xFF, 0x34, 0x00, 0xFD,
-       0xFF, 0x00, 0x00, 0x24, 0x00, 0x70, 0xFF, 0x46, 0x01, 0xC3, 0xFD,
-       0x6D, 0x03, 0x14, 0xFB, 0xBE, 0x07, 0xA6, 0x48, 0xF8, 0xFF, 0x70,
-       0xFE, 0xAE, 0x01, 0xAA, 0xFE, 0xD9, 0x00, 0x9A, 0xFF, 0x19, 0x00,
-       0xFD, 0xFF, 0x29, 0x00, 0x61, 0xFF, 0x9F, 0x01, 0x80, 0xFC, 0xF7,
-       0x06, 0x7D, 0xF1, 0x5A, 0x31, 0x2C, 0x2F, 0x83, 0xF1, 0x13, 0x07,
-       0x64, 0xFC, 0xB3, 0x01, 0x57, 0xFF, 0x2C, 0x00, 0xFD, 0xFF, 0x1B,
-       0x00, 0x90, 0xFF, 0xF4, 0x00, 0x72, 0xFE, 0x18, 0x02, 0xAA, 0xFD,
-       0xAB, 0x01, 0xDF, 0x48, 0xCA, 0x05, 0xE1, 0xFB, 0x05, 0x03, 0xF7,
-       0xFD, 0x2E, 0x01, 0x79, 0xFF, 0x21, 0x00, 0x00, 0x00, 0xFD, 0xFF,
-       0x32, 0x00, 0x44, 0xFF, 0xD3, 0x01, 0x3C, 0xFC, 0x2A, 0x07, 0xDC,
-       0xF1, 0x1A, 0x2A, 0x06, 0x36, 0xBE, 0xF1, 0x8E, 0x06, 0xD5, 0xFC,
-       0x67, 0x01, 0x7F, 0xFF, 0x1E, 0x00, 0xFE, 0xFF, 0x13, 0x00, 0xB2,
-       0xFF, 0x9D, 0x00, 0x27, 0xFF, 0xC3, 0x00, 0x1F, 0x00, 0x76, 0xFC,
-       0xA3, 0x47, 0x60, 0x0C, 0x4A, 0xF9, 0x4E, 0x04, 0x53, 0xFD, 0x79,
-       0x01, 0x5C, 0xFF, 0x2A, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x36, 0x00,
-       0x37, 0xFF, 0xE6, 0x01, 0x36, 0xFC, 0xEF, 0x06, 0xFC, 0xF2, 0x81,
-       0x22, 0x1C, 0x3C, 0xEC, 0xF2, 0x90, 0x05, 0x85, 0xFD, 0xFB, 0x00,
-       0xB6, 0xFF, 0x0A, 0x00, 0x01, 0x00, 0x0B, 0x00, 0xD3, 0xFF, 0x47,
-       0x00, 0xD7, 0xFF, 0x82, 0xFF, 0x53, 0x02, 0x39, 0xF8, 0xFD, 0x44,
-       0x8D, 0x13, 0xD3, 0xF6, 0x72, 0x05, 0xCA, 0xFC, 0xB5, 0x01, 0x45,
-       0xFF, 0x31, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x35, 0x00, 0x38, 0xFF,
-       0xDA, 0x01, 0x6A, 0xFC, 0x53, 0x06, 0xBA, 0xF4, 0xCE, 0x1A, 0x32,
-       0x41, 0x1F, 0xF5, 0x1D, 0x04, 0x71, 0xFE, 0x71, 0x00, 0xFB, 0xFF,
-       0xF0, 0xFF, 0x05, 0x00, 0x05, 0x00, 0xF2, 0xFF, 0xF8, 0xFF, 0x77,
-       0x00, 0x67, 0xFE, 0x2D, 0x04, 0x04, 0xF5, 0x07, 0x41, 0x1B, 0x1B,
-       0xA6, 0xF4, 0x5A, 0x06, 0x67, 0xFC, 0xDB, 0x01, 0x38, 0xFF, 0x36,
-       0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x31, 0x00, 0x46, 0xFF, 0xB3, 0x01,
-       0xCF, 0xFC, 0x67, 0x05, 0xEA, 0xF6, 0x44, 0x13, 0x1E, 0x45, 0x5E,
-       0xF8, 0x3F, 0x02, 0x8E, 0xFF, 0xD0, 0xFF, 0x4A, 0x00, 0xD2, 0xFF,
-       0x0B, 0x00, 0x01, 0x00, 0x0B, 0x00, 0xB4, 0xFF, 0x00, 0x01, 0x7E,
-       0xFD, 0x9C, 0x05, 0xDC, 0xF2, 0xE4, 0x3B, 0xCD, 0x22, 0xEE, 0xF2,
-       0xF3, 0x06, 0x35, 0xFC, 0xE6, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFD,
-       0xFF, 0x00, 0x00, 0x2A, 0x00, 0x5D, 0xFF, 0x76, 0x01, 0x59, 0xFD,
-       0x42, 0x04, 0x63, 0xF9, 0x1C, 0x0C, 0xB6, 0x47, 0xA4, 0xFC, 0x07,
-       0x00, 0xD0, 0x00, 0x20, 0xFF, 0xA0, 0x00, 0xB1, 0xFF, 0x13, 0x00,
-       0xFE, 0xFF, 0x1F, 0x00, 0x7D, 0xFF, 0x6B, 0x01, 0xCF, 0xFC, 0x96,
-       0x06, 0xB7, 0xF1, 0xC6, 0x35, 0x64, 0x2A, 0xD4, 0xF1, 0x2B, 0x07,
-       0x3D, 0xFC, 0xD2, 0x01, 0x45, 0xFF, 0x32, 0x00, 0xFD, 0xFF, 0x00,
-       0x00, 0x21, 0x00, 0x7A, 0xFF, 0x2B, 0x01, 0xFE, 0xFD, 0xF8, 0x02,
-       0xFB, 0xFB, 0x8D, 0x05, 0xE5, 0x48, 0xE3, 0x01, 0x91, 0xFD, 0x25,
-       0x02, 0x6B, 0xFE, 0xF7, 0x00, 0x8F, 0xFF, 0x1C, 0x00, 0xFD, 0xFF,
-       0x2D, 0x00, 0x55, 0xFF, 0xB5, 0x01, 0x61, 0xFC, 0x16, 0x07, 0x85,
-       0xF1, 0xE6, 0x2E, 0x9E, 0x31, 0x7D, 0xF1, 0xF3, 0x06, 0x84, 0xFC,
-       0x9D, 0x01, 0x63, 0xFF, 0x28, 0x00, 0xFD, 0xFF, 0x18, 0x00, 0x9C,
-       0xFF, 0xD6, 0x00, 0xB1, 0xFE, 0xA1, 0x01, 0x89, 0xFE, 0xC3, 0xFF,
-       0x9C, 0x48, 0xFD, 0x07, 0xFA, 0xFA, 0x7A, 0x03, 0xBC, 0xFD, 0x49,
-       0x01, 0x6E, 0xFF, 0x24, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x34, 0x00,
-       0x3E, 0xFF, 0xDE, 0x01, 0x33, 0xFC, 0x22, 0x07, 0x2B, 0xF2, 0x80,
-       0x27, 0x3B, 0x38, 0x0A, 0xF2, 0x44, 0x06, 0x0B, 0xFD, 0x45, 0x01,
-       0x90, 0xFF, 0x18, 0x00, 0xFF, 0xFF, 0x10, 0x00, 0xBE, 0xFF, 0x7F,
-       0x00, 0x65, 0xFF, 0x51, 0x00, 0xEB, 0x00, 0xE1, 0xFA, 0xE1, 0x46,
-       0xCD, 0x0E, 0x6A, 0xF8, 0xB8, 0x04, 0x20, 0xFD, 0x90, 0x01, 0x53,
-       0xFF, 0x2D, 0x00, 0xFF, 0xFF, 0xFD, 0xFF, 0x36, 0x00, 0x36, 0xFF,
-       0xE5, 0x01, 0x42, 0xFC, 0xC3, 0x06, 0x87, 0xF3, 0xD7, 0x1F, 0xFE,
-       0x3D, 0x91, 0xF3, 0x1D, 0x05, 0xD1, 0xFD, 0xCE, 0x00, 0xCC, 0xFF,
-       0x02, 0x00, 0x02, 0x00, 0x09, 0x00, 0xDE, 0xFF, 0x2B, 0x00, 0x11,
-       0x00, 0x1B, 0xFF, 0x02, 0x03, 0xFE, 0xF6, 0xC3, 0x43, 0x22, 0x16,
-       0x07, 0xF6, 0xCA, 0x05, 0xA3, 0xFC, 0xC5, 0x01, 0x3F, 0xFF, 0x33,
-       0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x34, 0x00, 0x3C, 0xFF, 0xCF, 0x01,
-       0x88, 0xFC, 0x09, 0x06, 0x71, 0xF5, 0x2B, 0x18, 0xB2, 0x42, 0x20,
-       0xF6, 0x83, 0x03, 0xCF, 0xFE, 0x3C, 0x00, 0x15, 0x00, 0xE6, 0xFF,
-       0x07, 0x00, 0x03, 0x00, 0xFB, 0xFF, 0xDF, 0xFF, 0xA9, 0x00, 0x10,
-       0xFE, 0xB9, 0x04, 0x27, 0xF4, 0x5E, 0x3F, 0xC3, 0x1D, 0xFE, 0xF3,
-       0x99, 0x06, 0x50, 0xFC, 0xE2, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFE,
-       0xFF, 0xFF, 0xFF, 0x2F, 0x00, 0x4D, 0xFF, 0xA0, 0x01, 0xFB, 0xFC,
-       0x07, 0x05, 0xBF, 0xF7, 0xBB, 0x10, 0x2B, 0x46, 0xBB, 0xF9, 0x83,
-       0x01, 0xFA, 0xFF, 0x95, 0xFF, 0x68, 0x00, 0xC7, 0xFF, 0x0E, 0x00,
-       0x00, 0x00, 0x13, 0x00, 0x9F, 0xFF, 0x28, 0x01, 0x3A, 0xFD, 0x00,
-       0x06, 0x5A, 0xF2, 0xDF, 0x39, 0x73, 0x25, 0x79, 0xF2, 0x12, 0x07,
-       0x31, 0xFC, 0xE3, 0x01, 0x3B, 0xFF, 0x35, 0x00, 0xFD, 0xFF, 0x00,
-       0x00, 0x27, 0x00, 0x66, 0xFF, 0x5E, 0x01, 0x90, 0xFD, 0xD2, 0x03,
-       0x47, 0xFA, 0xC3, 0x09, 0x48, 0x48, 0x5A, 0xFE, 0x33, 0xFF, 0x45,
-       0x01, 0xE2, 0xFE, 0xBE, 0x00, 0xA5, 0xFF, 0x16, 0x00, 0xFD, 0xFF,
-       0x24, 0x00, 0x6D, 0xFF, 0x88, 0x01, 0xA2, 0xFC, 0xD0, 0x06, 0x8C,
-       0xF1, 0x78, 0x33, 0xF2, 0x2C, 0x9E, 0xF1, 0x24, 0x07, 0x4E, 0xFC,
-       0xC3, 0x01, 0x4E, 0xFF, 0x2F, 0x00, 0xFD, 0xFF, 0x1E, 0x00, 0x86,
-       0xFF, 0x0E, 0x01, 0x3B, 0xFE, 0x82, 0x02, 0xE0, 0xFC, 0x73, 0x03,
-       0xF6, 0x48, 0xE9, 0x03, 0xAD, 0xFC, 0x9C, 0x02, 0x2D, 0xFE, 0x14,
-       0x01, 0x83, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x30, 0x00,
-       0x4C, 0xFF, 0xC7, 0x01, 0x4A, 0xFC, 0x27, 0x07, 0xA8, 0xF1, 0x62,
-       0x2C, 0xFD, 0x33, 0x93, 0xF1, 0xC4, 0x06, 0xAB, 0xFC, 0x82, 0x01,
-       0x71, 0xFF, 0x23, 0x00, 0xFE, 0xFF, 0x15, 0x00, 0xA8, 0xFF, 0xB8,
-       0x00, 0xF0, 0xFE, 0x2B, 0x01, 0x63, 0xFF, 0xF6, 0xFD, 0x2C, 0x48,
-       0x47, 0x0A, 0x14, 0xFA, 0xEB, 0x03, 0x84, 0xFD, 0x63, 0x01, 0x64,
-       0xFF, 0x27, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x3A, 0xFF,
-       0xE4, 0x01, 0x32, 0xFC, 0x0C, 0x07, 0x91, 0xF2, 0xDD, 0x24, 0x54,
-       0x3A, 0x74, 0xF2, 0xEB, 0x05, 0x49, 0xFD, 0x20, 0x01, 0xA3, 0xFF,
-       0x11, 0x00, 0x00, 0x00, 0x0D, 0x00, 0xC9, 0xFF, 0x61, 0x00, 0xA2,
-       0xFF, 0xE2, 0xFF, 0xAE, 0x01, 0x6B, 0xF9, 0xF2, 0x45, 0x4A, 0x11,
-       0x8F, 0xF7, 0x1D, 0x05, 0xF1, 0xFC, 0xA4, 0x01, 0x4B, 0xFF, 0x2F,
-       0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x36, 0x00, 0x37, 0xFF, 0xE1, 0x01,
-       0x55, 0xFC, 0x8C, 0x06, 0x22, 0xF4, 0x2C, 0x1D, 0xC0, 0x3F, 0x55,
-       0xF4, 0x9B, 0x04, 0x23, 0xFE, 0x9F, 0x00, 0xE4, 0xFF, 0xF9, 0xFF,
-       0x04, 0x00, 0x07, 0x00, 0xE9, 0xFF, 0x0F, 0x00, 0x48, 0x00, 0xB9,
-       0xFE, 0xA6, 0x03, 0xE4, 0xF5, 0x60, 0x42, 0xC1, 0x18, 0x47, 0xF5,
-       0x1A, 0x06, 0x81, 0xFC, 0xD2, 0x01, 0x3B, 0xFF, 0x35, 0x00, 0xFE,
-       0xFF, 0xFF, 0xFF, 0x33, 0x00, 0x40, 0xFF, 0xC1, 0x01, 0xAB, 0xFC,
-       0xB7, 0x05, 0x34, 0xF6, 0x8E, 0x15, 0x0B, 0x44, 0x42, 0xF7, 0xDC,
-       0x02, 0x32, 0xFF, 0x04, 0x00, 0x31, 0x00, 0xDC, 0xFF, 0x09, 0x00,
-       0x02, 0x00, 0x04, 0x00, 0xC7, 0xFF, 0xD9, 0x00, 0xBF, 0xFD, 0x38,
-       0x05, 0x69, 0xF3, 0x96, 0x3D, 0x6F, 0x20, 0x66, 0xF3, 0xCE, 0x06,
-       0x3F, 0xFC, 0xE6, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0xFF,
-       0xFF, 0x2C, 0x00, 0x55, 0xFF, 0x8B, 0x01, 0x2B, 0xFD, 0xA1, 0x04,
-       0x9B, 0xF8, 0x42, 0x0E, 0x0F, 0x47, 0x38, 0xFB, 0xBE, 0x00, 0x6A,
-       0x00, 0x58, 0xFF, 0x85, 0x00, 0xBB, 0xFF, 0x10, 0x00, 0xFF, 0xFF,
-       0x19, 0x00, 0x8C, 0xFF, 0x4D, 0x01, 0xFE, 0xFC, 0x56, 0x06, 0xF7,
-       0xF1, 0xBF, 0x37, 0x15, 0x28, 0x18, 0xF2, 0x25, 0x07, 0x34, 0xFC,
-       0xDC, 0x01, 0x3F, 0xFF, 0x34, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x24,
-       0x00, 0x71, 0xFF, 0x43, 0x01, 0xC9, 0xFD, 0x60, 0x03, 0x2E, 0xFB,
-       0x7E, 0x07, 0xAF, 0x48, 0x2D, 0x00, 0x58, 0xFE, 0xBB, 0x01, 0xA3,
-       0xFE, 0xDD, 0x00, 0x99, 0xFF, 0x19, 0x00, 0xFD, 0xFF, 0x29, 0x00,
-       0x60, 0xFF, 0xA2, 0x01, 0x7C, 0xFC, 0xFB, 0x06, 0x7C, 0xF1, 0x15,
-       0x31, 0x73, 0x2F, 0x81, 0xF1, 0x10, 0x07, 0x67, 0xFC, 0xB1, 0x01,
-       0x58, 0xFF, 0x2C, 0x00, 0xFD, 0xFF, 0x1B, 0x00, 0x91, 0xFF, 0xF1,
-       0x00, 0x79, 0xFE, 0x0A, 0x02, 0xC3, 0xFD, 0x73, 0x01, 0xDB, 0x48,
-       0x07, 0x06, 0xC7, 0xFB, 0x12, 0x03, 0xF1, 0xFD, 0x31, 0x01, 0x78,
-       0xFF, 0x22, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x32, 0x00, 0x44, 0xFF,
-       0xD5, 0x01, 0x3A, 0xFC, 0x2A, 0x07, 0xE3, 0xF1, 0xD1, 0x29, 0x46,
-       0x36, 0xC5, 0xF1, 0x87, 0x06, 0xDA, 0xFC, 0x64, 0x01, 0x80, 0xFF,
-       0x1E, 0x00, 0xFE, 0xFF, 0x12, 0x00, 0xB3, 0xFF, 0x99, 0x00, 0x2E,
-       0xFF, 0xB6, 0x00, 0x36, 0x00, 0x47, 0xFC, 0x90, 0x47, 0xA4, 0x0C,
-       0x31, 0xF9, 0x5A, 0x04, 0x4E, 0xFD, 0x7C, 0x01, 0x5B, 0xFF, 0x2A,
-       0x00, 0x00, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x37, 0xFF, 0xE6, 0x01,
-       0x37, 0xFC, 0xEB, 0x06, 0x0B, 0xF3, 0x35, 0x22, 0x52, 0x3C, 0xFD,
-       0xF2, 0x84, 0x05, 0x8D, 0xFD, 0xF6, 0x00, 0xB8, 0xFF, 0x09, 0x00,
-       0x01, 0x00, 0x0B, 0x00, 0xD5, 0xFF, 0x44, 0x00, 0xDD, 0xFF, 0x77,
-       0xFF, 0x67, 0x02, 0x14, 0xF8, 0xDC, 0x44, 0xD5, 0x13, 0xBC, 0xF6,
-       0x7C, 0x05, 0xC5, 0xFC, 0xB7, 0x01, 0x44, 0xFF, 0x31, 0x00, 0xFF,
-       0xFF, 0xFE, 0xFF, 0x35, 0x00, 0x39, 0xFF, 0xD9, 0x01, 0x6D, 0xFC,
-       0x4B, 0x06, 0xCD, 0xF4, 0x83, 0x1A, 0x5F, 0x41, 0x3A, 0xF5, 0x0C,
-       0x04, 0x7B, 0xFE, 0x6C, 0x00, 0xFE, 0xFF, 0xEF, 0xFF, 0x05, 0x00,
-       0x05, 0x00, 0xF3, 0xFF, 0xF5, 0xFF, 0x7D, 0x00, 0x5D, 0xFE, 0x3E,
-       0x04, 0xEA, 0xF4, 0xD9, 0x40, 0x66, 0x1B, 0x93, 0xF4, 0x62, 0x06,
-       0x64, 0xFC, 0xDC, 0x01, 0x38, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0xFF,
-       0xFF, 0x31, 0x00, 0x46, 0xFF, 0xB1, 0x01, 0xD3, 0xFC, 0x5D, 0x05,
-       0x01, 0xF7, 0xFB, 0x12, 0x3F, 0x45, 0x83, 0xF8, 0x2A, 0x02, 0x9A,
-       0xFF, 0xCA, 0xFF, 0x4E, 0x00, 0xD1, 0xFF, 0x0C, 0x00, 0x00, 0x00,
-       0x0C, 0x00, 0xB1, 0xFF, 0x04, 0x01, 0x76, 0xFD, 0xA8, 0x05, 0xCC,
-       0xF2, 0xAB, 0x3B, 0x18, 0x23, 0xE0, 0xF2, 0xF7, 0x06, 0x35, 0xFC,
-       0xE6, 0x01, 0x38, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x29,
-       0x00, 0x5E, 0xFF, 0x74, 0x01, 0x5F, 0xFD, 0x35, 0x04, 0x7C, 0xF9,
-       0xD8, 0x0B, 0xC9, 0x47, 0xD4, 0xFC, 0xF0, 0xFF, 0xDD, 0x00, 0x19,
-       0xFF, 0xA4, 0x00, 0xAF, 0xFF, 0x13, 0x00, 0xFE, 0xFF, 0x20, 0x00,
-       0x7B, 0xFF, 0x6E, 0x01, 0xCA, 0xFC, 0x9D, 0x06, 0xB1, 0xF1, 0x86,
-       0x35, 0xAE, 0x2A, 0xCD, 0xF1, 0x2B, 0x07, 0x3F, 0xFC, 0xD1, 0x01,
-       0x46, 0xFF, 0x32, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x21, 0x00, 0x7C,
-       0xFF, 0x27, 0x01, 0x05, 0xFE, 0xEB, 0x02, 0x14, 0xFC, 0x50, 0x05,
-       0xEA, 0x48, 0x1B, 0x02, 0x78, 0xFD, 0x32, 0x02, 0x64, 0xFE, 0xFA,
-       0x00, 0x8D, 0xFF, 0x1C, 0x00, 0xFD, 0xFF, 0x2D, 0x00, 0x54, 0xFF,
-       0xB7, 0x01, 0x5E, 0xFC, 0x19, 0x07, 0x88, 0xF1, 0x9F, 0x2E, 0xE3,
-       0x31, 0x7E, 0xF1, 0xEE, 0x06, 0x88, 0xFC, 0x9A, 0x01, 0x64, 0xFF,
-       0x28, 0x00, 0xFD, 0xFF, 0x18, 0x00, 0x9D, 0xFF, 0xD3, 0x00, 0xB8,
-       0xFE, 0x93, 0x01, 0xA1, 0xFE, 0x8E, 0xFF, 0x92, 0x48, 0x3D, 0x08,
-       0xE1, 0xFA, 0x86, 0x03, 0xB6, 0xFD, 0x4C, 0x01, 0x6D, 0xFF, 0x25,
-       0x00, 0x00, 0x00, 0xFD, 0xFF, 0x34, 0x00, 0x3E, 0xFF, 0xDF, 0x01,
-       0x33, 0xFC, 0x20, 0x07, 0x35, 0xF2, 0x36, 0x27, 0x78, 0x38, 0x14,
-       0xF2, 0x3B, 0x06, 0x11, 0xFD, 0x41, 0x01, 0x92, 0xFF, 0x17, 0x00,
-       0xFF, 0xFF, 0x10, 0x00, 0xBF, 0xFF, 0x7B, 0x00, 0x6C, 0xFF, 0x44,
-       0x00, 0x01, 0x01, 0xB6, 0xFA, 0xC8, 0x46, 0x13, 0x0F, 0x51, 0xF8,
-       0xC4, 0x04, 0x1B, 0xFD, 0x92, 0x01, 0x52, 0xFF, 0x2D, 0x00, 0xFF,
-       0xFF, 0xFD, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE5, 0x01, 0x44, 0xFC,
-       0xBD, 0x06, 0x97, 0xF3, 0x8A, 0x1F, 0x31, 0x3E, 0xA5, 0xF3, 0x0F,
-       0x05, 0xDA, 0xFD, 0xC9, 0x00, 0xCF, 0xFF, 0x01, 0x00, 0x02, 0x00,
-       0x09, 0x00, 0xDF, 0xFF, 0x28, 0x00, 0x17, 0x00, 0x10, 0xFF, 0x15,
-       0x03, 0xDD, 0xF6, 0x9E, 0x43, 0x6C, 0x16, 0xF1, 0xF5, 0xD3, 0x05,
-       0x9F, 0xFC, 0xC6, 0x01, 0x3F, 0xFF, 0x33, 0x00, 0xFF, 0xFF, 0xFE,
-       0xFF, 0x34, 0x00, 0x3C, 0xFF, 0xCE, 0x01, 0x8C, 0xFC, 0x00, 0x06,
-       0x86, 0xF5, 0xE0, 0x17, 0xDB, 0x42, 0x3F, 0xF6, 0x71, 0x03, 0xD9,
-       0xFE, 0x36, 0x00, 0x18, 0x00, 0xE5, 0xFF, 0x07, 0x00, 0x03, 0x00,
-       0xFC, 0xFF, 0xDC, 0xFF, 0xAF, 0x00, 0x07, 0xFE, 0xC8, 0x04, 0x10,
-       0xF4, 0x2D, 0x3F, 0x0F, 0x1E, 0xED, 0xF3, 0xA0, 0x06, 0x4E, 0xFC,
-       0xE3, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x2E,
-       0x00, 0x4E, 0xFF, 0x9E, 0x01, 0x00, 0xFD, 0xFC, 0x04, 0xD7, 0xF7,
-       0x75, 0x10, 0x48, 0x46, 0xE4, 0xF9, 0x6E, 0x01, 0x06, 0x00, 0x8E,
-       0xFF, 0x6B, 0x00, 0xC6, 0xFF, 0x0E, 0x00, 0xFF, 0xFF, 0x13, 0x00,
-       0x9D, 0xFF, 0x2D, 0x01, 0x33, 0xFD, 0x0B, 0x06, 0x4D, 0xF2, 0xA5,
-       0x39, 0xBF, 0x25, 0x6D, 0xF2, 0x15, 0x07, 0x31, 0xFC, 0xE2, 0x01,
-       0x3B, 0xFF, 0x35, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x26, 0x00, 0x68,
-       0xFF, 0x5B, 0x01, 0x96, 0xFD, 0xC6, 0x03, 0x61, 0xFA, 0x81, 0x09,
-       0x57, 0x48, 0x8D, 0xFE, 0x1B, 0xFF, 0x52, 0x01, 0xDB, 0xFE, 0xC2,
-       0x00, 0xA4, 0xFF, 0x16, 0x00, 0xFD, 0xFF, 0x25, 0x00, 0x6C, 0xFF,
-       0x8B, 0x01, 0x9D, 0xFC, 0xD5, 0x06, 0x89, 0xF1, 0x35, 0x33, 0x3A,
-       0x2D, 0x9A, 0xF1, 0x23, 0x07, 0x51, 0xFC, 0xC2, 0x01, 0x4F, 0xFF,
-       0x2F, 0x00, 0xFD, 0xFF, 0x1E, 0x00, 0x87, 0xFF, 0x0B, 0x01, 0x42,
-       0xFE, 0x74, 0x02, 0xF9, 0xFC, 0x39, 0x03, 0xF5, 0x48, 0x24, 0x04,
-       0x94, 0xFC, 0xA9, 0x02, 0x27, 0xFE, 0x18, 0x01, 0x82, 0xFF, 0x1F,
-       0x00, 0x00, 0x00, 0xFD, 0xFF, 0x30, 0x00, 0x4B, 0xFF, 0xC9, 0x01,
-       0x48, 0xFC, 0x28, 0x07, 0xAD, 0xF1, 0x19, 0x2C, 0x3F, 0x34, 0x97,
-       0xF1, 0xBE, 0x06, 0xB0, 0xFC, 0x7F, 0x01, 0x72, 0xFF, 0x23, 0x00,
-       0xFE, 0xFF, 0x15, 0x00, 0xA9, 0xFF, 0xB4, 0x00, 0xF7, 0xFE, 0x1D,
-       0x01, 0x7A, 0xFF, 0xC5, 0xFD, 0x1D, 0x48, 0x89, 0x0A, 0xFB, 0xF9,
-       0xF8, 0x03, 0x7D, 0xFD, 0x66, 0x01, 0x63, 0xFF, 0x28, 0x00, 0x00,
-       0x00, 0xFD, 0xFF, 0x36, 0x00, 0x39, 0xFF, 0xE4, 0x01, 0x32, 0xFC,
-       0x09, 0x07, 0x9D, 0xF2, 0x92, 0x24, 0x8F, 0x3A, 0x82, 0xF2, 0xE1,
-       0x05, 0x50, 0xFD, 0x1B, 0x01, 0xA6, 0xFF, 0x10, 0x00, 0x00, 0x00,
-       0x0D, 0x00, 0xCB, 0xFF, 0x5E, 0x00, 0xA9, 0xFF, 0xD6, 0xFF, 0xC3,
-       0x01, 0x43, 0xF9, 0xD7, 0x45, 0x92, 0x11, 0x77, 0xF7, 0x28, 0x05,
-       0xEC, 0xFC, 0xA7, 0x01, 0x4A, 0xFF, 0x2F, 0x00, 0xFF, 0xFF, 0xFE,
-       0xFF, 0x36, 0x00, 0x37, 0xFF, 0xE0, 0x01, 0x57, 0xFC, 0x85, 0x06,
-       0x34, 0xF4, 0xE0, 0x1C, 0xF0, 0x3F, 0x6D, 0xF4, 0x8C, 0x04, 0x2C,
-       0xFE, 0x99, 0x00, 0xE7, 0xFF, 0xF8, 0xFF, 0x04, 0x00, 0x06, 0x00,
-       0xEA, 0xFF, 0x0C, 0x00, 0x4E, 0x00, 0xAF, 0xFE, 0xB8, 0x03, 0xC7,
-       0xF5, 0x38, 0x42, 0x0C, 0x19, 0x32, 0xF5, 0x23, 0x06, 0x7D, 0xFC,
-       0xD3, 0x01, 0x3A, 0xFF, 0x35, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x32,
-       0x00, 0x41, 0xFF, 0xC0, 0x01, 0xAF, 0xFC, 0xAD, 0x05, 0x4A, 0xF6,
-       0x44, 0x15, 0x2F, 0x44, 0x64, 0xF7, 0xC9, 0x02, 0x3D, 0xFF, 0xFE,
-       0xFF, 0x34, 0x00, 0xDB, 0xFF, 0x09, 0x00, 0x02, 0x00, 0x05, 0x00,
-       0xC5, 0xFF, 0xDE, 0x00, 0xB7, 0xFD, 0x45, 0x05, 0x56, 0xF3, 0x61,
-       0x3D, 0xBA, 0x20, 0x56, 0xF3, 0xD3, 0x06, 0x3E, 0xFC, 0xE6, 0x01,
-       0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0xFF, 0xFF, 0x2C, 0x00, 0x56,
-       0xFF, 0x88, 0x01, 0x31, 0xFD, 0x95, 0x04, 0xB4, 0xF8, 0xFC, 0x0D,
-       0x26, 0x47, 0x64, 0xFB, 0xA7, 0x00, 0x77, 0x00, 0x51, 0xFF, 0x89,
-       0x00, 0xBA, 0xFF, 0x11, 0x00, 0xFF, 0xFF, 0x1A, 0x00, 0x8A, 0xFF,
-       0x51, 0x01, 0xF8, 0xFC, 0x5E, 0x06, 0xED, 0xF1, 0x82, 0x37, 0x60,
-       0x28, 0x0E, 0xF2, 0x26, 0x07, 0x35, 0xFC, 0xDB, 0x01, 0x40, 0xFF,
-       0x34, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x23, 0x00, 0x72, 0xFF, 0x40,
-       0x01, 0xD0, 0xFD, 0x53, 0x03, 0x47, 0xFB, 0x3F, 0x07, 0xB8, 0x48,
-       0x62, 0x00, 0x3F, 0xFE, 0xC8, 0x01, 0x9C, 0xFE, 0xE0, 0x00, 0x98,
-       0xFF, 0x19, 0x00, 0xFD, 0xFF, 0x29, 0x00, 0x5F, 0xFF, 0xA5, 0x01,
-       0x78, 0xFC, 0xFF, 0x06, 0x7D, 0xF1, 0xCF, 0x30, 0xB8, 0x2F, 0x80,
-       0xF1, 0x0D, 0x07, 0x6A, 0xFC, 0xAE, 0x01, 0x59, 0xFF, 0x2B, 0x00,
-       0xFD, 0xFF, 0x1B, 0x00, 0x93, 0xFF, 0xED, 0x00, 0x80, 0xFE, 0xFD,
-       0x01, 0xDC, 0xFD, 0x3C, 0x01, 0xD5, 0x48, 0x45, 0x06, 0xAE, 0xFB,
-       0x1F, 0x03, 0xEA, 0xFD, 0x34, 0x01, 0x77, 0xFF, 0x22, 0x00, 0x00,
-       0x00, 0xFD, 0xFF, 0x33, 0x00, 0x43, 0xFF, 0xD6, 0x01, 0x39, 0xFC,
-       0x2A, 0x07, 0xEB, 0xF1, 0x87, 0x29, 0x85, 0x36, 0xCC, 0xF1, 0x7F,
-       0x06, 0xE0, 0xFC, 0x60, 0x01, 0x82, 0xFF, 0x1D, 0x00, 0xFE, 0xFF,
-       0x12, 0x00, 0xB5, 0xFF, 0x96, 0x00, 0x35, 0xFF, 0xA9, 0x00, 0x4D,
-       0x00, 0x19, 0xFC, 0x7C, 0x47, 0xE8, 0x0C, 0x18, 0xF9, 0x66, 0x04,
-       0x48, 0xFD, 0x7E, 0x01, 0x5A, 0xFF, 0x2B, 0x00, 0x00, 0x00, 0xFD,
-       0xFF, 0x36, 0x00, 0x37, 0xFF, 0xE6, 0x01, 0x38, 0xFC, 0xE6, 0x06,
-       0x19, 0xF3, 0xEA, 0x21, 0x8A, 0x3C, 0x0E, 0xF3, 0x78, 0x05, 0x96,
-       0xFD, 0xF1, 0x00, 0xBB, 0xFF, 0x08, 0x00, 0x01, 0x00, 0x0B, 0x00,
-       0xD6, 0xFF, 0x41, 0x00, 0xE4, 0xFF, 0x6B, 0xFF, 0x7B, 0x02, 0xF0,
-       0xF7, 0xBA, 0x44, 0x1E, 0x14, 0xA5, 0xF6, 0x86, 0x05, 0xC1, 0xFC,
-       0xB9, 0x01, 0x44, 0xFF, 0x32, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x35,
-       0x00, 0x39, 0xFF, 0xD8, 0x01, 0x70, 0xFC, 0x43, 0x06, 0xE1, 0xF4,
-       0x38, 0x1A, 0x8C, 0x41, 0x55, 0xF5, 0xFC, 0x03, 0x85, 0xFE, 0x66,
-       0x00, 0x01, 0x00, 0xEE, 0xFF, 0x06, 0x00, 0x05, 0x00, 0xF4, 0xFF,
-       0xF2, 0xFF, 0x83, 0x00, 0x53, 0xFE, 0x4E, 0x04, 0xD0, 0xF4, 0xAB,
-       0x40, 0xB2, 0x1B, 0x7F, 0xF4, 0x69, 0x06, 0x62, 0xFC, 0xDD, 0x01,
-       0x38, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x30, 0x00, 0x47,
-       0xFF, 0xAF, 0x01, 0xD8, 0xFC, 0x52, 0x05, 0x19, 0xF7, 0xB2, 0x12,
-       0x5C, 0x45, 0xA9, 0xF8, 0x16, 0x02, 0xA6, 0xFF, 0xC3, 0xFF, 0x51,
-       0x00, 0xD0, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0xAF, 0xFF,
-       0x09, 0x01, 0x6E, 0xFD, 0xB4, 0x05, 0xBC, 0xF2, 0x73, 0x3B, 0x64,
-       0x23, 0xD2, 0xF2, 0xFB, 0x06, 0x34, 0xFC, 0xE6, 0x01, 0x38, 0xFF,
-       0x36, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x29, 0x00, 0x5F, 0xFF, 0x71,
-       0x01, 0x65, 0xFD, 0x29, 0x04, 0x96, 0xF9, 0x95, 0x0B, 0xDC, 0x47,
-       0x03, 0xFD, 0xD9, 0xFF, 0xEA, 0x00, 0x12, 0xFF, 0xA7, 0x00, 0xAE,
-       0xFF, 0x14, 0x00, 0xFE, 0xFF, 0x20, 0x00, 0x79, 0xFF, 0x72, 0x01,
-       0xC4, 0xFC, 0xA4, 0x06, 0xAB, 0xF1, 0x46, 0x35, 0xF7, 0x2A, 0xC6,
-       0xF1, 0x2A, 0x07, 0x40, 0xFC, 0xCF, 0x01, 0x47, 0xFF, 0x31, 0x00,
-       0xFD, 0xFF, 0x00, 0x00, 0x20, 0x00, 0x7D, 0xFF, 0x24, 0x01, 0x0C,
-       0xFE, 0xDE, 0x02, 0x2E, 0xFC, 0x13, 0x05, 0xEC, 0x48, 0x54, 0x02,
-       0x5E, 0xFD, 0x3F, 0x02, 0x5D, 0xFE, 0xFE, 0x00, 0x8C, 0xFF, 0x1C,
-       0x00, 0xFD, 0xFF, 0x2D, 0x00, 0x53, 0xFF, 0xBA, 0x01, 0x5B, 0xFC,
-       0x1B, 0x07, 0x8B, 0xF1, 0x58, 0x2E, 0x26, 0x32, 0x80, 0xF1, 0xEA,
-       0x06, 0x8C, 0xFC, 0x97, 0x01, 0x66, 0xFF, 0x27, 0x00, 0xFD, 0xFF,
-       0x17, 0x00, 0x9E, 0xFF, 0xCF, 0x00, 0xBF, 0xFE, 0x86, 0x01, 0xBA,
-       0xFE, 0x5A, 0xFF, 0x86, 0x48, 0x7D, 0x08, 0xC7, 0xFA, 0x93, 0x03,
-       0xB0, 0xFD, 0x4F, 0x01, 0x6C, 0xFF, 0x25, 0x00, 0x00, 0x00, 0xFD,
-       0xFF, 0x35, 0x00, 0x3D, 0xFF, 0xDF, 0x01, 0x32, 0xFC, 0x1E, 0x07,
-       0x40, 0xF2, 0xEB, 0x26, 0xB5, 0x38, 0x1F, 0xF2, 0x32, 0x06, 0x18,
-       0xFD, 0x3D, 0x01, 0x94, 0xFF, 0x16, 0x00, 0xFF, 0xFF, 0x0F, 0x00,
-       0xC0, 0xFF, 0x78, 0x00, 0x73, 0xFF, 0x38, 0x00, 0x17, 0x01, 0x8B,
-       0xFA, 0xAF, 0x46, 0x59, 0x0F, 0x39, 0xF8, 0xCF, 0x04, 0x15, 0xFD,
-       0x95, 0x01, 0x51, 0xFF, 0x2D, 0x00, 0xFF, 0xFF, 0xFD, 0xFF, 0x36,
-       0x00, 0x36, 0xFF, 0xE5, 0x01, 0x46, 0xFC, 0xB8, 0x06, 0xA8, 0xF3,
-       0x3F, 0x1F, 0x64, 0x3E, 0xBA, 0xF3, 0x01, 0x05, 0xE2, 0xFD, 0xC4,
-       0x00, 0xD2, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0xE1, 0xFF,
-       0x25, 0x00, 0x1D, 0x00, 0x05, 0xFF, 0x28, 0x03, 0xBD, 0xF6, 0x77,
-       0x43, 0xB6, 0x16, 0xDC, 0xF5, 0xDD, 0x05, 0x9B, 0xFC, 0xC8, 0x01,
-       0x3E, 0xFF, 0x33, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x34, 0x00, 0x3D,
-       0xFF, 0xCC, 0x01, 0x8F, 0xFC, 0xF8, 0x05, 0x9B, 0xF5, 0x96, 0x17,
-       0x02, 0x43, 0x5E, 0xF6, 0x5F, 0x03, 0xE4, 0xFE, 0x30, 0x00, 0x1B,
-       0x00, 0xE4, 0xFF, 0x08, 0x00, 0x03, 0x00, 0xFD, 0xFF, 0xD9, 0xFF,
-       0xB4, 0x00, 0xFD, 0xFD, 0xD7, 0x04, 0xFA, 0xF3, 0xFC, 0x3E, 0x5B,
-       0x1E, 0xDB, 0xF3, 0xA6, 0x06, 0x4C, 0xFC, 0xE3, 0x01, 0x36, 0xFF,
-       0x36, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x2E, 0x00, 0x4E, 0xFF, 0x9C,
-       0x01, 0x05, 0xFD, 0xF1, 0x04, 0xF0, 0xF7, 0x2D, 0x10, 0x61, 0x46,
-       0x0D, 0xFA, 0x58, 0x01, 0x13, 0x00, 0x87, 0xFF, 0x6E, 0x00, 0xC4,
-       0xFF, 0x0E, 0x00, 0xFF, 0xFF, 0x14, 0x00, 0x9B, 0xFF, 0x31, 0x01,
-       0x2C, 0xFD, 0x15, 0x06, 0x41, 0xF2, 0x6A, 0x39, 0x0A, 0x26, 0x61,
-       0xF2, 0x17, 0x07, 0x31, 0xFC, 0xE2, 0x01, 0x3B, 0xFF, 0x35, 0x00,
-       0xFD, 0xFF, 0x00, 0x00, 0x26, 0x00, 0x69, 0xFF, 0x58, 0x01, 0x9D,
-       0xFD, 0xB9, 0x03, 0x7B, 0xFA, 0x40, 0x09, 0x63, 0x48, 0xBF, 0xFE,
-       0x03, 0xFF, 0x5F, 0x01, 0xD4, 0xFE, 0xC5, 0x00, 0xA2, 0xFF, 0x16,
-       0x00, 0xFD, 0xFF, 0x25, 0x00, 0x6A, 0xFF, 0x8E, 0x01, 0x99, 0xFC,
-       0xDB, 0x06, 0x86, 0xF1, 0xF2, 0x32, 0x82, 0x2D, 0x96, 0xF1, 0x21,
-       0x07, 0x53, 0xFC, 0xC0, 0x01, 0x50, 0xFF, 0x2E, 0x00, 0xFD, 0xFF,
-       0x1D, 0x00, 0x88, 0xFF, 0x07, 0x01, 0x49, 0xFE, 0x67, 0x02, 0x13,
-       0xFD, 0xFF, 0x02, 0xF4, 0x48, 0x5F, 0x04, 0x7A, 0xFC, 0xB6, 0x02,
-       0x20, 0xFE, 0x1B, 0x01, 0x81, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0xFD,
-       0xFF, 0x30, 0x00, 0x4A, 0xFF, 0xCA, 0x01, 0x46, 0xFC, 0x29, 0x07,
-       0xB3, 0xF1, 0xD1, 0x2B, 0x81, 0x34, 0x9C, 0xF1, 0xB8, 0x06, 0xB5,
-       0xFC, 0x7C, 0x01, 0x74, 0xFF, 0x22, 0x00, 0xFE, 0xFF, 0x15, 0x00,
-       0xAA, 0xFF, 0xB1, 0x00, 0xFE, 0xFE, 0x10, 0x01, 0x92, 0xFF, 0x94,
-       0xFD, 0x0D, 0x48, 0xCB, 0x0A, 0xE2, 0xF9, 0x04, 0x04, 0x77, 0xFD,
-       0x69, 0x01, 0x62, 0xFF, 0x28, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x36,
-       0x00, 0x39, 0xFF, 0xE5, 0x01, 0x32, 0xFC, 0x06, 0x07, 0xAA, 0xF2,
-       0x46, 0x24, 0xC8, 0x3A, 0x90, 0xF2, 0xD6, 0x05, 0x57, 0xFD, 0x17,
-       0x01, 0xA8, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x0D, 0x00, 0xCC, 0xFF,
-       0x5A, 0x00, 0xAF, 0xFF, 0xCA, 0xFF, 0xD8, 0x01, 0x1C, 0xF9, 0xB8,
-       0x45, 0xDA, 0x11, 0x60, 0xF7, 0x33, 0x05, 0xE7, 0xFC, 0xA9, 0x01,
-       0x4A, 0xFF, 0x30, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x36, 0x00, 0x37,
-       0xFF, 0xDF, 0x01, 0x5A, 0xFC, 0x7E, 0x06, 0x47, 0xF4, 0x94, 0x1C,
-       0x1F, 0x40, 0x85, 0xF4, 0x7D, 0x04, 0x36, 0xFE, 0x93, 0x00, 0xEA,
-       0xFF, 0xF7, 0xFF, 0x04, 0x00, 0x06, 0x00, 0xEB, 0xFF, 0x09, 0x00,
-       0x54, 0x00, 0xA4, 0xFE, 0xC9, 0x03, 0xAA, 0xF5, 0x0C, 0x42, 0x56,
-       0x19, 0x1E, 0xF5, 0x2B, 0x06, 0x7A, 0xFC, 0xD4, 0x01, 0x3A, 0xFF,
-       0x35, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x32, 0x00, 0x42, 0xFF, 0xBE,
-       0x01, 0xB4, 0xFC, 0xA4, 0x05, 0x61, 0xF6, 0xFB, 0x14, 0x53, 0x44,
-       0x86, 0xF7, 0xB6, 0x02, 0x49, 0xFF, 0xF7, 0xFF, 0x37, 0x00, 0xD9,
-       0xFF, 0x0A, 0x00, 0x01, 0x00, 0x06, 0x00, 0xC2, 0xFF, 0xE3, 0x00,
-       0xAE, 0xFD, 0x52, 0x05, 0x44, 0xF3, 0x2A, 0x3D, 0x06, 0x21, 0x47,
-       0xF3, 0xD8, 0x06, 0x3C, 0xFC, 0xE6, 0x01, 0x36, 0xFF, 0x36, 0x00,
-       0xFD, 0xFF, 0x00, 0x00, 0x2B, 0x00, 0x57, 0xFF, 0x86, 0x01, 0x36,
-       0xFD, 0x89, 0x04, 0xCD, 0xF8, 0xB7, 0x0D, 0x3D, 0x47, 0x91, 0xFB,
-       0x91, 0x00, 0x83, 0x00, 0x4A, 0xFF, 0x8C, 0x00, 0xB9, 0xFF, 0x11,
-       0x00, 0xFE, 0xFF, 0x1B, 0x00, 0x88, 0xFF, 0x55, 0x01, 0xF2, 0xFC,
-       0x67, 0x06, 0xE4, 0xF1, 0x44, 0x37, 0xAA, 0x28, 0x05, 0xF2, 0x27,
-       0x07, 0x36, 0xFC, 0xDA, 0x01, 0x41, 0xFF, 0x33, 0x00, 0xFD, 0xFF,
-       0x00, 0x00, 0x23, 0x00, 0x73, 0xFF, 0x3D, 0x01, 0xD6, 0xFD, 0x46,
-       0x03, 0x61, 0xFB, 0x00, 0x07, 0xBF, 0x48, 0x98, 0x00, 0x26, 0xFE,
-       0xD5, 0x01, 0x95, 0xFE, 0xE3, 0x00, 0x96, 0xFF, 0x1A, 0x00, 0xFD,
-       0xFF, 0x2A, 0x00, 0x5D, 0xFF, 0xA7, 0x01, 0x75, 0xFC, 0x03, 0x07,
-       0x7D, 0xF1, 0x8A, 0x30, 0xFF, 0x2F, 0x7E, 0xF1, 0x0A, 0x07, 0x6E,
-       0xFC, 0xAC, 0x01, 0x5A, 0xFF, 0x2B, 0x00, 0xFD, 0xFF, 0x1A, 0x00,
-       0x94, 0xFF, 0xEA, 0x00, 0x87, 0xFE, 0xF0, 0x01, 0xF5, 0xFD, 0x05,
-       0x01, 0xCE, 0x48, 0x83, 0x06, 0x94, 0xFB, 0x2C, 0x03, 0xE4, 0xFD,
-       0x37, 0x01, 0x76, 0xFF, 0x22, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x33,
-       0x00, 0x42, 0xFF, 0xD7, 0x01, 0x38, 0xFC, 0x29, 0x07, 0xF3, 0xF1,
-       0x3E, 0x29, 0xC6, 0x36, 0xD4, 0xF1, 0x77, 0x06, 0xE6, 0xFC, 0x5C,
-       0x01, 0x84, 0xFF, 0x1C, 0x00, 0xFE, 0xFF, 0x12, 0x00, 0xB6, 0xFF,
-       0x93, 0x00, 0x3C, 0xFF, 0x9D, 0x00, 0x63, 0x00, 0xEB, 0xFB, 0x69,
-       0x47, 0x2D, 0x0D, 0xFF, 0xF8, 0x72, 0x04, 0x42, 0xFD, 0x81, 0x01,
-       0x59, 0xFF, 0x2B, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x37,
-       0xFF, 0xE6, 0x01, 0x3A, 0xFC, 0xE2, 0x06, 0x28, 0xF3, 0x9E, 0x21,
-       0xC0, 0x3C, 0x1F, 0xF3, 0x6C, 0x05, 0x9E, 0xFD, 0xED, 0x00, 0xBD,
-       0xFF, 0x07, 0x00, 0x01, 0x00, 0x0A, 0x00, 0xD7, 0xFF, 0x3E, 0x00,
-       0xEA, 0xFF, 0x60, 0xFF, 0x8F, 0x02, 0xCD, 0xF7, 0x99, 0x44, 0x68,
-       0x14, 0x8E, 0xF6, 0x90, 0x05, 0xBC, 0xFC, 0xBA, 0x01, 0x43, 0xFF,
-       0x32, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x35, 0x00, 0x39, 0xFF, 0xD7,
-       0x01, 0x73, 0xFC, 0x3B, 0x06, 0xF5, 0xF4, 0xED, 0x19, 0xB7, 0x41,
-       0x71, 0xF5, 0xEB, 0x03, 0x90, 0xFE, 0x60, 0x00, 0x04, 0x00, 0xED,
-       0xFF, 0x06, 0x00, 0x04, 0x00, 0xF5, 0xFF, 0xEF, 0xFF, 0x88, 0x00,
-       0x49, 0xFE, 0x5D, 0x04, 0xB7, 0xF4, 0x7D, 0x40, 0xFD, 0x1B, 0x6C,
-       0xF4, 0x70, 0x06, 0x5F, 0xFC, 0xDE, 0x01, 0x37, 0xFF, 0x36, 0x00,
-       0xFE, 0xFF, 0xFF, 0xFF, 0x30, 0x00, 0x48, 0xFF, 0xAD, 0x01, 0xDD,
-       0xFC, 0x48, 0x05, 0x30, 0xF7, 0x6B, 0x12, 0x7D, 0x45, 0xCF, 0xF8,
-       0x01, 0x02, 0xB2, 0xFF, 0xBD, 0xFF, 0x54, 0x00, 0xCE, 0xFF, 0x0C,
-       0x00, 0x00, 0x00, 0x0E, 0x00, 0xAC, 0xFF, 0x0E, 0x01, 0x66, 0xFD,
-       0xBF, 0x05, 0xAD, 0xF2, 0x3B, 0x3B, 0xB0, 0x23, 0xC4, 0xF2, 0xFF,
-       0x06, 0x33, 0xFC, 0xE5, 0x01, 0x38, 0xFF, 0x36, 0x00, 0xFD, 0xFF,
-       0x00, 0x00, 0x29, 0x00, 0x60, 0xFF, 0x6E, 0x01, 0x6B, 0xFD, 0x1D,
-       0x04, 0xAF, 0xF9, 0x51, 0x0B, 0xEC, 0x47, 0x33, 0xFD, 0xC1, 0xFF,
-       0xF7, 0x00, 0x0C, 0xFF, 0xAA, 0x00, 0xAD, 0xFF, 0x14, 0x00, 0xFE,
-       0xFF, 0x21, 0x00, 0x77, 0xFF, 0x75, 0x01, 0xBF, 0xFC, 0xAB, 0x06,
-       0xA6, 0xF1, 0x05, 0x35, 0x40, 0x2B, 0xBF, 0xF1, 0x2A, 0x07, 0x42,
-       0xFC, 0xCE, 0x01, 0x48, 0xFF, 0x31, 0x00, 0xFD, 0xFF, 0x00, 0x00,
-       0x20, 0x00, 0x7E, 0xFF, 0x21, 0x01, 0x12, 0xFE, 0xD1, 0x02, 0x47,
-       0xFC, 0xD7, 0x04, 0xF0, 0x48, 0x8D, 0x02, 0x45, 0xFD, 0x4D, 0x02,
-       0x56, 0xFE, 0x01, 0x01, 0x8B, 0xFF, 0x1D, 0x00, 0xFD, 0xFF, 0x2E,
-       0x00, 0x52, 0xFF, 0xBC, 0x01, 0x58, 0xFC, 0x1D, 0x07, 0x8E, 0xF1,
-       0x11, 0x2E, 0x6B, 0x32, 0x81, 0xF1, 0xE5, 0x06, 0x90, 0xFC, 0x94,
-       0x01, 0x67, 0xFF, 0x26, 0x00, 0xFD, 0xFF, 0x17, 0x00, 0xA0, 0xFF,
-       0xCC, 0x00, 0xC6, 0xFE, 0x79, 0x01, 0xD2, 0xFE, 0x26, 0xFF, 0x7C,
-       0x48, 0xBE, 0x08, 0xAE, 0xFA, 0xA0, 0x03, 0xA9, 0xFD, 0x52, 0x01,
-       0x6B, 0xFF, 0x25, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x35, 0x00, 0x3C,
-       0xFF, 0xE0, 0x01, 0x32, 0xFC, 0x1C, 0x07, 0x4B, 0xF2, 0xA0, 0x26,
-       0xF2, 0x38, 0x2A, 0xF2, 0x28, 0x06, 0x1F, 0xFD, 0x39, 0x01, 0x96,
-       0xFF, 0x16, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0xC2, 0xFF, 0x75, 0x00,
-       0x7A, 0xFF, 0x2B, 0x00, 0x2D, 0x01, 0x61, 0xFA, 0x97, 0x46, 0xA0,
-       0x0F, 0x20, 0xF8, 0xDA, 0x04, 0x10, 0xFD, 0x97, 0x01, 0x50, 0xFF,
-       0x2E, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE4,
-       0x01, 0x48, 0xFC, 0xB2, 0x06, 0xB9, 0xF3, 0xF3, 0x1E, 0x98, 0x3E,
-       0xCF, 0xF3, 0xF3, 0x04, 0xEB, 0xFD, 0xBF, 0x00, 0xD4, 0xFF, 0xFF,
-       0xFF, 0x03, 0x00, 0x08, 0x00, 0xE2, 0xFF, 0x21, 0x00, 0x23, 0x00,
-       0xFA, 0xFE, 0x3A, 0x03, 0x9D, 0xF6, 0x50, 0x43, 0x00, 0x17, 0xC6,
-       0xF5, 0xE6, 0x05, 0x97, 0xFC, 0xC9, 0x01, 0x3E, 0xFF, 0x34, 0x00,
-       0xFE, 0xFF, 0xFE, 0xFF, 0x34, 0x00, 0x3D, 0xFF, 0xCB, 0x01, 0x93,
-       0xFC, 0xEF, 0x05, 0xB0, 0xF5, 0x4B, 0x17, 0x2A, 0x43, 0x7D, 0xF6,
-       0x4D, 0x03, 0xEF, 0xFE, 0x2A, 0x00, 0x1E, 0x00, 0xE3, 0xFF, 0x08,
-       0x00, 0x03, 0x00, 0xFE, 0xFF, 0xD7, 0xFF, 0xBA, 0x00, 0xF4, 0xFD,
-       0xE5, 0x04, 0xE4, 0xF3, 0xCA, 0x3E, 0xA7, 0x1E, 0xCA, 0xF3, 0xAC,
-       0x06, 0x4A, 0xFC, 0xE4, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFE, 0xFF,
-       0xFF, 0xFF, 0x2E, 0x00, 0x4F, 0xFF, 0x99, 0x01, 0x0B, 0xFD, 0xE6,
-       0x04, 0x08, 0xF8, 0xE7, 0x0F, 0x7C, 0x46, 0x37, 0xFA, 0x42, 0x01,
-       0x1F, 0x00, 0x81, 0xFF, 0x71, 0x00, 0xC3, 0xFF, 0x0F, 0x00, 0xFF,
-       0xFF, 0x15, 0x00, 0x98, 0xFF, 0x35, 0x01, 0x25, 0xFD, 0x1E, 0x06,
-       0x35, 0xF2, 0x2E, 0x39, 0x55, 0x26, 0x56, 0xF2, 0x1A, 0x07, 0x31,
-       0xFC, 0xE1, 0x01, 0x3C, 0xFF, 0x35, 0x00, 0xFD, 0xFF, 0x00, 0x00,
-       0x26, 0x00, 0x6A, 0xFF, 0x55, 0x01, 0xA3, 0xFD, 0xAD, 0x03, 0x94,
-       0xFA, 0xFF, 0x08, 0x70, 0x48, 0xF3, 0xFE, 0xEA, 0xFE, 0x6C, 0x01,
-       0xCD, 0xFE, 0xC9, 0x00, 0xA1, 0xFF, 0x17, 0x00, 0xFD, 0xFF, 0x26,
-       0x00, 0x69, 0xFF, 0x91, 0x01, 0x94, 0xFC, 0xE0, 0x06, 0x84, 0xF1,
-       0xAF, 0x32, 0xCA, 0x2D, 0x92, 0xF1, 0x1F, 0x07, 0x56, 0xFC, 0xBE,
-       0x01, 0x51, 0xFF, 0x2E, 0x00, 0xFD, 0xFF, 0x1D, 0x00, 0x8A, 0xFF,
-       0x04, 0x01, 0x50, 0xFE, 0x5A, 0x02, 0x2C, 0xFD, 0xC6, 0x02, 0xF2,
-       0x48, 0x9B, 0x04, 0x61, 0xFC, 0xC3, 0x02, 0x19, 0xFE, 0x1E, 0x01,
-       0x7F, 0xFF, 0x20, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x31, 0x00, 0x49,
-       0xFF, 0xCC, 0x01, 0x44, 0xFC, 0x29, 0x07, 0xB9, 0xF1, 0x89, 0x2B,
-       0xC3, 0x34, 0xA0, 0xF1, 0xB1, 0x06, 0xBA, 0xFC, 0x79, 0x01, 0x76,
-       0xFF, 0x21, 0x00, 0xFE, 0xFF, 0x14, 0x00, 0xAC, 0xFF, 0xAE, 0x00,
-       0x05, 0xFF, 0x03, 0x01, 0xAA, 0xFF, 0x63, 0xFD, 0xFD, 0x47, 0x0E,
-       0x0B, 0xC8, 0xF9, 0x11, 0x04, 0x71, 0xFD, 0x6C, 0x01, 0x61, 0xFF,
-       0x28, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x39, 0xFF, 0xE5,
-       0x01, 0x33, 0xFC, 0x03, 0x07, 0xB7, 0xF2, 0xFC, 0x23, 0x03, 0x3B,
-       0x9E, 0xF2, 0xCB, 0x05, 0x5F, 0xFD, 0x12, 0x01, 0xAA, 0xFF, 0x0E,
-       0x00, 0x00, 0x00, 0x0C, 0x00, 0xCD, 0xFF, 0x57, 0x00, 0xB6, 0xFF,
-       0xBE, 0xFF, 0xED, 0x01, 0xF5, 0xF8, 0x9B, 0x45, 0x22, 0x12, 0x48,
-       0xF7, 0x3D, 0x05, 0xE2, 0xFC, 0xAB, 0x01, 0x49, 0xFF, 0x30, 0x00,
-       0xFF, 0xFF, 0xFE, 0xFF, 0x36, 0x00, 0x37, 0xFF, 0xDF, 0x01, 0x5C,
-       0xFC, 0x78, 0x06, 0x5A, 0xF4, 0x49, 0x1C, 0x4E, 0x40, 0x9E, 0xF4,
-       0x6D, 0x04, 0x3F, 0xFE, 0x8E, 0x00, 0xED, 0xFF, 0xF6, 0xFF, 0x04,
-       0x00, 0x06, 0x00, 0xEC, 0xFF, 0x06, 0x00, 0x5A, 0x00, 0x9A, 0xFE,
-       0xDA, 0x03, 0x8D, 0xF5, 0xE1, 0x41, 0xA1, 0x19, 0x09, 0xF5, 0x33,
-       0x06, 0x77, 0xFC, 0xD6, 0x01, 0x3A, 0xFF, 0x35, 0x00, 0xFE, 0xFF,
-       0xFF, 0xFF, 0x32, 0x00, 0x42, 0xFF, 0xBC, 0x01, 0xB8, 0xFC, 0x9A,
-       0x05, 0x77, 0xF6, 0xB1, 0x14, 0x77, 0x44, 0xA9, 0xF7, 0xA2, 0x02,
-       0x54, 0xFF, 0xF1, 0xFF, 0x3A, 0x00, 0xD8, 0xFF, 0x0A, 0x00, 0x01,
-       0x00, 0x07, 0x00, 0xC0, 0xFF, 0xE8, 0x00, 0xA6, 0xFD, 0x5F, 0x05,
-       0x31, 0xF3, 0xF6, 0x3C, 0x52, 0x21, 0x37, 0xF3, 0xDD, 0x06, 0x3B,
-       0xFC, 0xE6, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x00, 0x00,
-       0x2B, 0x00, 0x58, 0xFF, 0x83, 0x01, 0x3C, 0xFD, 0x7E, 0x04, 0xE6,
-       0xF8, 0x72, 0x0D, 0x52, 0x47, 0xBE, 0xFB, 0x7A, 0x00, 0x90, 0x00,
-       0x43, 0xFF, 0x8F, 0x00, 0xB7, 0xFF, 0x11, 0x00, 0xFE, 0xFF, 0x1C,
-       0x00, 0x86, 0xFF, 0x59, 0x01, 0xEC, 0xFC, 0x6F, 0x06, 0xDC, 0xF1,
-       0x04, 0x37, 0xF3, 0x28, 0xFC, 0xF1, 0x28, 0x07, 0x37, 0xFC, 0xD8,
-       0x01, 0x41, 0xFF, 0x33, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x23, 0x00,
-       0x74, 0xFF, 0x3A, 0x01, 0xDD, 0xFD, 0x39, 0x03, 0x7B, 0xFB, 0xC1,
-       0x06, 0xC7, 0x48, 0xCF, 0x00, 0x0D, 0xFE, 0xE3, 0x01, 0x8E, 0xFE,
-       0xE7, 0x00, 0x95, 0xFF, 0x1A, 0x00, 0xFD, 0xFF, 0x2A, 0x00, 0x5C,
-       0xFF, 0xAA, 0x01, 0x71, 0xFC, 0x07, 0x07, 0x7E, 0xF1, 0x44, 0x30,
-       0x44, 0x30, 0x7E, 0xF1, 0x07, 0x07, 0x71, 0xFC, 0xAA, 0x01, 0x5C,
-       0xFF, 0x2A, 0x00, 0xFD, 0xFF, 0x1A, 0x00, 0x95, 0xFF, 0xE7, 0x00,
-       0x8E, 0xFE, 0xE3, 0x01, 0x0D, 0xFE, 0xCF, 0x00, 0xC7, 0x48, 0xC1,
-       0x06, 0x7B, 0xFB, 0x39, 0x03, 0xDD, 0xFD, 0x3A, 0x01, 0x74, 0xFF,
-       0x23, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x33, 0x00, 0x41, 0xFF, 0xD8,
-       0x01, 0x37, 0xFC, 0x28, 0x07, 0xFC, 0xF1, 0xF3, 0x28, 0x04, 0x37,
-       0xDC, 0xF1, 0x6F, 0x06, 0xEC, 0xFC, 0x59, 0x01, 0x86, 0xFF, 0x1C,
-       0x00, 0xFE, 0xFF, 0x11, 0x00, 0xB7, 0xFF, 0x8F, 0x00, 0x43, 0xFF,
-       0x90, 0x00, 0x7A, 0x00, 0xBE, 0xFB, 0x52, 0x47, 0x72, 0x0D, 0xE6,
-       0xF8, 0x7E, 0x04, 0x3C, 0xFD, 0x83, 0x01, 0x58, 0xFF, 0x2B, 0x00,
-       0x00, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE6, 0x01, 0x3B,
-       0xFC, 0xDD, 0x06, 0x37, 0xF3, 0x52, 0x21, 0xF6, 0x3C, 0x31, 0xF3,
-       0x5F, 0x05, 0xA6, 0xFD, 0xE8, 0x00, 0xC0, 0xFF, 0x07, 0x00, 0x01,
-       0x00, 0x0A, 0x00, 0xD8, 0xFF, 0x3A, 0x00, 0xF1, 0xFF, 0x54, 0xFF,
-       0xA2, 0x02, 0xA9, 0xF7, 0x77, 0x44, 0xB1, 0x14, 0x77, 0xF6, 0x9A,
-       0x05, 0xB8, 0xFC, 0xBC, 0x01, 0x42, 0xFF, 0x32, 0x00, 0xFF, 0xFF,
-       0xFE, 0xFF, 0x35, 0x00, 0x3A, 0xFF, 0xD6, 0x01, 0x77, 0xFC, 0x33,
-       0x06, 0x09, 0xF5, 0xA1, 0x19, 0xE1, 0x41, 0x8D, 0xF5, 0xDA, 0x03,
-       0x9A, 0xFE, 0x5A, 0x00, 0x06, 0x00, 0xEC, 0xFF, 0x06, 0x00, 0x04,
-       0x00, 0xF6, 0xFF, 0xED, 0xFF, 0x8E, 0x00, 0x3F, 0xFE, 0x6D, 0x04,
-       0x9E, 0xF4, 0x4E, 0x40, 0x49, 0x1C, 0x5A, 0xF4, 0x78, 0x06, 0x5C,
-       0xFC, 0xDF, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0xFF, 0xFF,
-       0x30, 0x00, 0x49, 0xFF, 0xAB, 0x01, 0xE2, 0xFC, 0x3D, 0x05, 0x48,
-       0xF7, 0x22, 0x12, 0x9B, 0x45, 0xF5, 0xF8, 0xED, 0x01, 0xBE, 0xFF,
-       0xB6, 0xFF, 0x57, 0x00, 0xCD, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x0E,
-       0x00, 0xAA, 0xFF, 0x12, 0x01, 0x5F, 0xFD, 0xCB, 0x05, 0x9E, 0xF2,
-       0x03, 0x3B, 0xFC, 0x23, 0xB7, 0xF2, 0x03, 0x07, 0x33, 0xFC, 0xE5,
-       0x01, 0x39, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x28, 0x00,
-       0x61, 0xFF, 0x6C, 0x01, 0x71, 0xFD, 0x11, 0x04, 0xC8, 0xF9, 0x0E,
-       0x0B, 0xFD, 0x47, 0x63, 0xFD, 0xAA, 0xFF, 0x03, 0x01, 0x05, 0xFF,
-       0xAE, 0x00, 0xAC, 0xFF, 0x14, 0x00, 0xFE, 0xFF, 0x21, 0x00, 0x76,
-       0xFF, 0x79, 0x01, 0xBA, 0xFC, 0xB1, 0x06, 0xA0, 0xF1, 0xC3, 0x34,
-       0x89, 0x2B, 0xB9, 0xF1, 0x29, 0x07, 0x44, 0xFC, 0xCC, 0x01, 0x49,
-       0xFF, 0x31, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x20, 0x00, 0x7F, 0xFF,
-       0x1E, 0x01, 0x19, 0xFE, 0xC3, 0x02, 0x61, 0xFC, 0x9B, 0x04, 0xF2,
-       0x48, 0xC6, 0x02, 0x2C, 0xFD, 0x5A, 0x02, 0x50, 0xFE, 0x04, 0x01,
-       0x8A, 0xFF, 0x1D, 0x00, 0xFD, 0xFF, 0x2E, 0x00, 0x51, 0xFF, 0xBE,
-       0x01, 0x56, 0xFC, 0x1F, 0x07, 0x92, 0xF1, 0xCA, 0x2D, 0xAF, 0x32,
-       0x84, 0xF1, 0xE0, 0x06, 0x94, 0xFC, 0x91, 0x01, 0x69, 0xFF, 0x26,
-       0x00, 0xFD, 0xFF, 0x17, 0x00, 0xA1, 0xFF, 0xC9, 0x00, 0xCD, 0xFE,
-       0x6C, 0x01, 0xEA, 0xFE, 0xF3, 0xFE, 0x70, 0x48, 0xFF, 0x08, 0x94,
-       0xFA, 0xAD, 0x03, 0xA3, 0xFD, 0x55, 0x01, 0x6A, 0xFF, 0x26, 0x00,
-       0x00, 0x00, 0xFD, 0xFF, 0x35, 0x00, 0x3C, 0xFF, 0xE1, 0x01, 0x31,
-       0xFC, 0x1A, 0x07, 0x56, 0xF2, 0x55, 0x26, 0x2E, 0x39, 0x35, 0xF2,
-       0x1E, 0x06, 0x25, 0xFD, 0x35, 0x01, 0x98, 0xFF, 0x15, 0x00, 0xFF,
-       0xFF, 0x0F, 0x00, 0xC3, 0xFF, 0x71, 0x00, 0x81, 0xFF, 0x1F, 0x00,
-       0x42, 0x01, 0x37, 0xFA, 0x7C, 0x46, 0xE7, 0x0F, 0x08, 0xF8, 0xE6,
-       0x04, 0x0B, 0xFD, 0x99, 0x01, 0x4F, 0xFF, 0x2E, 0x00, 0xFF, 0xFF,
-       0xFE, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE4, 0x01, 0x4A, 0xFC, 0xAC,
-       0x06, 0xCA, 0xF3, 0xA7, 0x1E, 0xCA, 0x3E, 0xE4, 0xF3, 0xE5, 0x04,
-       0xF4, 0xFD, 0xBA, 0x00, 0xD7, 0xFF, 0xFE, 0xFF, 0x03, 0x00, 0x08,
-       0x00, 0xE3, 0xFF, 0x1E, 0x00, 0x2A, 0x00, 0xEF, 0xFE, 0x4D, 0x03,
-       0x7D, 0xF6, 0x2A, 0x43, 0x4B, 0x17, 0xB0, 0xF5, 0xEF, 0x05, 0x93,
-       0xFC, 0xCB, 0x01, 0x3D, 0xFF, 0x34, 0x00, 0xFE, 0xFF, 0xFE, 0xFF,
-       0x34, 0x00, 0x3E, 0xFF, 0xC9, 0x01, 0x97, 0xFC, 0xE6, 0x05, 0xC6,
-       0xF5, 0x00, 0x17, 0x50, 0x43, 0x9D, 0xF6, 0x3A, 0x03, 0xFA, 0xFE,
-       0x23, 0x00, 0x21, 0x00, 0xE2, 0xFF, 0x08, 0x00, 0x03, 0x00, 0xFF,
-       0xFF, 0xD4, 0xFF, 0xBF, 0x00, 0xEB, 0xFD, 0xF3, 0x04, 0xCF, 0xF3,
-       0x98, 0x3E, 0xF3, 0x1E, 0xB9, 0xF3, 0xB2, 0x06, 0x48, 0xFC, 0xE4,
-       0x01, 0x36, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x2E, 0x00,
-       0x50, 0xFF, 0x97, 0x01, 0x10, 0xFD, 0xDA, 0x04, 0x20, 0xF8, 0xA0,
-       0x0F, 0x97, 0x46, 0x61, 0xFA, 0x2D, 0x01, 0x2B, 0x00, 0x7A, 0xFF,
-       0x75, 0x00, 0xC2, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0x16, 0x00, 0x96,
-       0xFF, 0x39, 0x01, 0x1F, 0xFD, 0x28, 0x06, 0x2A, 0xF2, 0xF2, 0x38,
-       0xA0, 0x26, 0x4B, 0xF2, 0x1C, 0x07, 0x32, 0xFC, 0xE0, 0x01, 0x3C,
-       0xFF, 0x35, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x25, 0x00, 0x6B, 0xFF,
-       0x52, 0x01, 0xA9, 0xFD, 0xA0, 0x03, 0xAE, 0xFA, 0xBE, 0x08, 0x7C,
-       0x48, 0x26, 0xFF, 0xD2, 0xFE, 0x79, 0x01, 0xC6, 0xFE, 0xCC, 0x00,
-       0xA0, 0xFF, 0x17, 0x00, 0xFD, 0xFF, 0x26, 0x00, 0x67, 0xFF, 0x94,
-       0x01, 0x90, 0xFC, 0xE5, 0x06, 0x81, 0xF1, 0x6B, 0x32, 0x11, 0x2E,
-       0x8E, 0xF1, 0x1D, 0x07, 0x58, 0xFC, 0xBC, 0x01, 0x52, 0xFF, 0x2E,
-       0x00, 0xFD, 0xFF, 0x1D, 0x00, 0x8B, 0xFF, 0x01, 0x01, 0x56, 0xFE,
-       0x4D, 0x02, 0x45, 0xFD, 0x8D, 0x02, 0xF0, 0x48, 0xD7, 0x04, 0x47,
-       0xFC, 0xD1, 0x02, 0x12, 0xFE, 0x21, 0x01, 0x7E, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0xFD, 0xFF, 0x31, 0x00, 0x48, 0xFF, 0xCE, 0x01, 0x42,
-       0xFC, 0x2A, 0x07, 0xBF, 0xF1, 0x40, 0x2B, 0x05, 0x35, 0xA6, 0xF1,
-       0xAB, 0x06, 0xBF, 0xFC, 0x75, 0x01, 0x77, 0xFF, 0x21, 0x00, 0xFE,
-       0xFF, 0x14, 0x00, 0xAD, 0xFF, 0xAA, 0x00, 0x0C, 0xFF, 0xF7, 0x00,
-       0xC1, 0xFF, 0x33, 0xFD, 0xEC, 0x47, 0x51, 0x0B, 0xAF, 0xF9, 0x1D,
-       0x04, 0x6B, 0xFD, 0x6E, 0x01, 0x60, 0xFF, 0x29, 0x00, 0x00, 0x00,
-       0xFD, 0xFF, 0x36, 0x00, 0x38, 0xFF, 0xE5, 0x01, 0x33, 0xFC, 0xFF,
-       0x06, 0xC4, 0xF2, 0xB0, 0x23, 0x3B, 0x3B, 0xAD, 0xF2, 0xBF, 0x05,
-       0x66, 0xFD, 0x0E, 0x01, 0xAC, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x0C,
-       0x00, 0xCE, 0xFF, 0x54, 0x00, 0xBD, 0xFF, 0xB2, 0xFF, 0x01, 0x02,
-       0xCF, 0xF8, 0x7D, 0x45, 0x6B, 0x12, 0x30, 0xF7, 0x48, 0x05, 0xDD,
-       0xFC, 0xAD, 0x01, 0x48, 0xFF, 0x30, 0x00, 0xFF, 0xFF, 0xFE, 0xFF,
-       0x36, 0x00, 0x37, 0xFF, 0xDE, 0x01, 0x5F, 0xFC, 0x70, 0x06, 0x6C,
-       0xF4, 0xFD, 0x1B, 0x7D, 0x40, 0xB7, 0xF4, 0x5D, 0x04, 0x49, 0xFE,
-       0x88, 0x00, 0xEF, 0xFF, 0xF5, 0xFF, 0x04, 0x00, 0x06, 0x00, 0xED,
-       0xFF, 0x04, 0x00, 0x60, 0x00, 0x90, 0xFE, 0xEB, 0x03, 0x71, 0xF5,
-       0xB7, 0x41, 0xED, 0x19, 0xF5, 0xF4, 0x3B, 0x06, 0x73, 0xFC, 0xD7,
-       0x01, 0x39, 0xFF, 0x35, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x32, 0x00,
-       0x43, 0xFF, 0xBA, 0x01, 0xBC, 0xFC, 0x90, 0x05, 0x8E, 0xF6, 0x68,
-       0x14, 0x99, 0x44, 0xCD, 0xF7, 0x8F, 0x02, 0x60, 0xFF, 0xEA, 0xFF,
-       0x3E, 0x00, 0xD7, 0xFF, 0x0A, 0x00, 0x01, 0x00, 0x07, 0x00, 0xBD,
-       0xFF, 0xED, 0x00, 0x9E, 0xFD, 0x6C, 0x05, 0x1F, 0xF3, 0xC0, 0x3C,
-       0x9E, 0x21, 0x28, 0xF3, 0xE2, 0x06, 0x3A, 0xFC, 0xE6, 0x01, 0x37,
-       0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x2B, 0x00, 0x59, 0xFF,
-       0x81, 0x01, 0x42, 0xFD, 0x72, 0x04, 0xFF, 0xF8, 0x2D, 0x0D, 0x69,
-       0x47, 0xEB, 0xFB, 0x63, 0x00, 0x9D, 0x00, 0x3C, 0xFF, 0x93, 0x00,
-       0xB6, 0xFF, 0x12, 0x00, 0xFE, 0xFF, 0x1C, 0x00, 0x84, 0xFF, 0x5C,
-       0x01, 0xE6, 0xFC, 0x77, 0x06, 0xD4, 0xF1, 0xC6, 0x36, 0x3E, 0x29,
-       0xF3, 0xF1, 0x29, 0x07, 0x38, 0xFC, 0xD7, 0x01, 0x42, 0xFF, 0x33,
-       0x00, 0xFD, 0xFF, 0x00, 0x00, 0x22, 0x00, 0x76, 0xFF, 0x37, 0x01,
-       0xE4, 0xFD, 0x2C, 0x03, 0x94, 0xFB, 0x83, 0x06, 0xCE, 0x48, 0x05,
-       0x01, 0xF5, 0xFD, 0xF0, 0x01, 0x87, 0xFE, 0xEA, 0x00, 0x94, 0xFF,
-       0x1A, 0x00, 0xFD, 0xFF, 0x2B, 0x00, 0x5A, 0xFF, 0xAC, 0x01, 0x6E,
-       0xFC, 0x0A, 0x07, 0x7E, 0xF1, 0xFF, 0x2F, 0x8A, 0x30, 0x7D, 0xF1,
-       0x03, 0x07, 0x75, 0xFC, 0xA7, 0x01, 0x5D, 0xFF, 0x2A, 0x00, 0xFD,
-       0xFF, 0x1A, 0x00, 0x96, 0xFF, 0xE3, 0x00, 0x95, 0xFE, 0xD5, 0x01,
-       0x26, 0xFE, 0x98, 0x00, 0xBF, 0x48, 0x00, 0x07, 0x61, 0xFB, 0x46,
-       0x03, 0xD6, 0xFD, 0x3D, 0x01, 0x73, 0xFF, 0x23, 0x00, 0x00, 0x00,
-       0xFD, 0xFF, 0x33, 0x00, 0x41, 0xFF, 0xDA, 0x01, 0x36, 0xFC, 0x27,
-       0x07, 0x05, 0xF2, 0xAA, 0x28, 0x44, 0x37, 0xE4, 0xF1, 0x67, 0x06,
-       0xF2, 0xFC, 0x55, 0x01, 0x88, 0xFF, 0x1B, 0x00, 0xFE, 0xFF, 0x11,
-       0x00, 0xB9, 0xFF, 0x8C, 0x00, 0x4A, 0xFF, 0x83, 0x00, 0x91, 0x00,
-       0x91, 0xFB, 0x3D, 0x47, 0xB7, 0x0D, 0xCD, 0xF8, 0x89, 0x04, 0x36,
-       0xFD, 0x86, 0x01, 0x57, 0xFF, 0x2B, 0x00, 0x00, 0x00, 0xFD, 0xFF,
-       0x36, 0x00, 0x36, 0xFF, 0xE6, 0x01, 0x3C, 0xFC, 0xD8, 0x06, 0x47,
-       0xF3, 0x06, 0x21, 0x2A, 0x3D, 0x44, 0xF3, 0x52, 0x05, 0xAE, 0xFD,
-       0xE3, 0x00, 0xC2, 0xFF, 0x06, 0x00, 0x01, 0x00, 0x0A, 0x00, 0xD9,
-       0xFF, 0x37, 0x00, 0xF7, 0xFF, 0x49, 0xFF, 0xB6, 0x02, 0x86, 0xF7,
-       0x53, 0x44, 0xFB, 0x14, 0x61, 0xF6, 0xA4, 0x05, 0xB4, 0xFC, 0xBE,
-       0x01, 0x42, 0xFF, 0x32, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x35, 0x00,
-       0x3A, 0xFF, 0xD4, 0x01, 0x7A, 0xFC, 0x2B, 0x06, 0x1E, 0xF5, 0x56,
-       0x19, 0x0C, 0x42, 0xAA, 0xF5, 0xC9, 0x03, 0xA4, 0xFE, 0x54, 0x00,
-       0x09, 0x00, 0xEB, 0xFF, 0x06, 0x00, 0x04, 0x00, 0xF7, 0xFF, 0xEA,
-       0xFF, 0x93, 0x00, 0x36, 0xFE, 0x7D, 0x04, 0x85, 0xF4, 0x1F, 0x40,
-       0x94, 0x1C, 0x47, 0xF4, 0x7E, 0x06, 0x5A, 0xFC, 0xDF, 0x01, 0x37,
-       0xFF, 0x36, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x30, 0x00, 0x4A, 0xFF,
-       0xA9, 0x01, 0xE7, 0xFC, 0x33, 0x05, 0x60, 0xF7, 0xDA, 0x11, 0xB8,
-       0x45, 0x1C, 0xF9, 0xD8, 0x01, 0xCA, 0xFF, 0xAF, 0xFF, 0x5A, 0x00,
-       0xCC, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xA8, 0xFF, 0x17,
-       0x01, 0x57, 0xFD, 0xD6, 0x05, 0x90, 0xF2, 0xC8, 0x3A, 0x46, 0x24,
-       0xAA, 0xF2, 0x06, 0x07, 0x32, 0xFC, 0xE5, 0x01, 0x39, 0xFF, 0x36,
-       0x00, 0xFD, 0xFF, 0x00, 0x00, 0x28, 0x00, 0x62, 0xFF, 0x69, 0x01,
-       0x77, 0xFD, 0x04, 0x04, 0xE2, 0xF9, 0xCB, 0x0A, 0x0D, 0x48, 0x94,
-       0xFD, 0x92, 0xFF, 0x10, 0x01, 0xFE, 0xFE, 0xB1, 0x00, 0xAA, 0xFF,
-       0x15, 0x00, 0xFE, 0xFF, 0x22, 0x00, 0x74, 0xFF, 0x7C, 0x01, 0xB5,
-       0xFC, 0xB8, 0x06, 0x9C, 0xF1, 0x81, 0x34, 0xD1, 0x2B, 0xB3, 0xF1,
-       0x29, 0x07, 0x46, 0xFC, 0xCA, 0x01, 0x4A, 0xFF, 0x30, 0x00, 0xFD,
-       0xFF, 0x00, 0x00, 0x1F, 0x00, 0x81, 0xFF, 0x1B, 0x01, 0x20, 0xFE,
-       0xB6, 0x02, 0x7A, 0xFC, 0x5F, 0x04, 0xF4, 0x48, 0xFF, 0x02, 0x13,
-       0xFD, 0x67, 0x02, 0x49, 0xFE, 0x07, 0x01, 0x88, 0xFF, 0x1D, 0x00,
-       0xFD, 0xFF, 0x2E, 0x00, 0x50, 0xFF, 0xC0, 0x01, 0x53, 0xFC, 0x21,
-       0x07, 0x96, 0xF1, 0x82, 0x2D, 0xF2, 0x32, 0x86, 0xF1, 0xDB, 0x06,
-       0x99, 0xFC, 0x8E, 0x01, 0x6A, 0xFF, 0x25, 0x00, 0xFD, 0xFF, 0x16,
-       0x00, 0xA2, 0xFF, 0xC5, 0x00, 0xD4, 0xFE, 0x5F, 0x01, 0x03, 0xFF,
-       0xBF, 0xFE, 0x63, 0x48, 0x40, 0x09, 0x7B, 0xFA, 0xB9, 0x03, 0x9D,
-       0xFD, 0x58, 0x01, 0x69, 0xFF, 0x26, 0x00, 0x00, 0x00, 0xFD, 0xFF,
-       0x35, 0x00, 0x3B, 0xFF, 0xE2, 0x01, 0x31, 0xFC, 0x17, 0x07, 0x61,
-       0xF2, 0x0A, 0x26, 0x6A, 0x39, 0x41, 0xF2, 0x15, 0x06, 0x2C, 0xFD,
-       0x31, 0x01, 0x9B, 0xFF, 0x14, 0x00, 0xFF, 0xFF, 0x0E, 0x00, 0xC4,
-       0xFF, 0x6E, 0x00, 0x87, 0xFF, 0x13, 0x00, 0x58, 0x01, 0x0D, 0xFA,
-       0x61, 0x46, 0x2D, 0x10, 0xF0, 0xF7, 0xF1, 0x04, 0x05, 0xFD, 0x9C,
-       0x01, 0x4E, 0xFF, 0x2E, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x36, 0x00,
-       0x36, 0xFF, 0xE3, 0x01, 0x4C, 0xFC, 0xA6, 0x06, 0xDB, 0xF3, 0x5B,
-       0x1E, 0xFC, 0x3E, 0xFA, 0xF3, 0xD7, 0x04, 0xFD, 0xFD, 0xB4, 0x00,
-       0xD9, 0xFF, 0xFD, 0xFF, 0x03, 0x00, 0x08, 0x00, 0xE4, 0xFF, 0x1B,
-       0x00, 0x30, 0x00, 0xE4, 0xFE, 0x5F, 0x03, 0x5E, 0xF6, 0x02, 0x43,
-       0x96, 0x17, 0x9B, 0xF5, 0xF8, 0x05, 0x8F, 0xFC, 0xCC, 0x01, 0x3D,
-       0xFF, 0x34, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x33, 0x00, 0x3E, 0xFF,
-       0xC8, 0x01, 0x9B, 0xFC, 0xDD, 0x05, 0xDC, 0xF5, 0xB6, 0x16, 0x77,
-       0x43, 0xBD, 0xF6, 0x28, 0x03, 0x05, 0xFF, 0x1D, 0x00, 0x25, 0x00,
-       0xE1, 0xFF, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD2, 0xFF, 0xC4,
-       0x00, 0xE2, 0xFD, 0x01, 0x05, 0xBA, 0xF3, 0x64, 0x3E, 0x3F, 0x1F,
-       0xA8, 0xF3, 0xB8, 0x06, 0x46, 0xFC, 0xE5, 0x01, 0x36, 0xFF, 0x36,
-       0x00, 0xFD, 0xFF, 0xFF, 0xFF, 0x2D, 0x00, 0x51, 0xFF, 0x95, 0x01,
-       0x15, 0xFD, 0xCF, 0x04, 0x39, 0xF8, 0x59, 0x0F, 0xAF, 0x46, 0x8B,
-       0xFA, 0x17, 0x01, 0x38, 0x00, 0x73, 0xFF, 0x78, 0x00, 0xC0, 0xFF,
-       0x0F, 0x00, 0xFF, 0xFF, 0x16, 0x00, 0x94, 0xFF, 0x3D, 0x01, 0x18,
-       0xFD, 0x32, 0x06, 0x1F, 0xF2, 0xB5, 0x38, 0xEB, 0x26, 0x40, 0xF2,
-       0x1E, 0x07, 0x32, 0xFC, 0xDF, 0x01, 0x3D, 0xFF, 0x35, 0x00, 0xFD,
-       0xFF, 0x00, 0x00, 0x25, 0x00, 0x6C, 0xFF, 0x4F, 0x01, 0xB0, 0xFD,
-       0x93, 0x03, 0xC7, 0xFA, 0x7D, 0x08, 0x86, 0x48, 0x5A, 0xFF, 0xBA,
-       0xFE, 0x86, 0x01, 0xBF, 0xFE, 0xCF, 0x00, 0x9E, 0xFF, 0x17, 0x00,
-       0xFD, 0xFF, 0x27, 0x00, 0x66, 0xFF, 0x97, 0x01, 0x8C, 0xFC, 0xEA,
-       0x06, 0x80, 0xF1, 0x26, 0x32, 0x58, 0x2E, 0x8B, 0xF1, 0x1B, 0x07,
-       0x5B, 0xFC, 0xBA, 0x01, 0x53, 0xFF, 0x2D, 0x00, 0xFD, 0xFF, 0x1C,
-       0x00, 0x8C, 0xFF, 0xFE, 0x00, 0x5D, 0xFE, 0x3F, 0x02, 0x5E, 0xFD,
-       0x54, 0x02, 0xEC, 0x48, 0x13, 0x05, 0x2E, 0xFC, 0xDE, 0x02, 0x0C,
-       0xFE, 0x24, 0x01, 0x7D, 0xFF, 0x20, 0x00, 0x00, 0x00, 0xFD, 0xFF,
-       0x31, 0x00, 0x47, 0xFF, 0xCF, 0x01, 0x40, 0xFC, 0x2A, 0x07, 0xC6,
-       0xF1, 0xF7, 0x2A, 0x46, 0x35, 0xAB, 0xF1, 0xA4, 0x06, 0xC4, 0xFC,
-       0x72, 0x01, 0x79, 0xFF, 0x20, 0x00, 0xFE, 0xFF, 0x14, 0x00, 0xAE,
-       0xFF, 0xA7, 0x00, 0x12, 0xFF, 0xEA, 0x00, 0xD9, 0xFF, 0x03, 0xFD,
-       0xDC, 0x47, 0x95, 0x0B, 0x96, 0xF9, 0x29, 0x04, 0x65, 0xFD, 0x71,
-       0x01, 0x5F, 0xFF, 0x29, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x36, 0x00,
-       0x38, 0xFF, 0xE6, 0x01, 0x34, 0xFC, 0xFB, 0x06, 0xD2, 0xF2, 0x64,
-       0x23, 0x73, 0x3B, 0xBC, 0xF2, 0xB4, 0x05, 0x6E, 0xFD, 0x09, 0x01,
-       0xAF, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xD0, 0xFF, 0x51,
-       0x00, 0xC3, 0xFF, 0xA6, 0xFF, 0x16, 0x02, 0xA9, 0xF8, 0x5C, 0x45,
-       0xB2, 0x12, 0x19, 0xF7, 0x52, 0x05, 0xD8, 0xFC, 0xAF, 0x01, 0x47,
-       0xFF, 0x30, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x36, 0x00, 0x38, 0xFF,
-       0xDD, 0x01, 0x62, 0xFC, 0x69, 0x06, 0x7F, 0xF4, 0xB2, 0x1B, 0xAB,
-       0x40, 0xD0, 0xF4, 0x4E, 0x04, 0x53, 0xFE, 0x83, 0x00, 0xF2, 0xFF,
-       0xF4, 0xFF, 0x05, 0x00, 0x06, 0x00, 0xEE, 0xFF, 0x01, 0x00, 0x66,
-       0x00, 0x85, 0xFE, 0xFC, 0x03, 0x55, 0xF5, 0x8C, 0x41, 0x38, 0x1A,
-       0xE1, 0xF4, 0x43, 0x06, 0x70, 0xFC, 0xD8, 0x01, 0x39, 0xFF, 0x35,
-       0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x32, 0x00, 0x44, 0xFF, 0xB9, 0x01,
-       0xC1, 0xFC, 0x86, 0x05, 0xA5, 0xF6, 0x1E, 0x14, 0xBA, 0x44, 0xF0,
-       0xF7, 0x7B, 0x02, 0x6B, 0xFF, 0xE4, 0xFF, 0x41, 0x00, 0xD6, 0xFF,
-       0x0B, 0x00, 0x01, 0x00, 0x08, 0x00, 0xBB, 0xFF, 0xF1, 0x00, 0x96,
-       0xFD, 0x78, 0x05, 0x0E, 0xF3, 0x8A, 0x3C, 0xEA, 0x21, 0x19, 0xF3,
-       0xE6, 0x06, 0x38, 0xFC, 0xE6, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFD,
-       0xFF, 0x00, 0x00, 0x2B, 0x00, 0x5A, 0xFF, 0x7E, 0x01, 0x48, 0xFD,
-       0x66, 0x04, 0x18, 0xF9, 0xE8, 0x0C, 0x7C, 0x47, 0x19, 0xFC, 0x4D,
-       0x00, 0xA9, 0x00, 0x35, 0xFF, 0x96, 0x00, 0xB5, 0xFF, 0x12, 0x00,
-       0xFE, 0xFF, 0x1D, 0x00, 0x82, 0xFF, 0x60, 0x01, 0xE0, 0xFC, 0x7F,
-       0x06, 0xCC, 0xF1, 0x85, 0x36, 0x87, 0x29, 0xEB, 0xF1, 0x2A, 0x07,
-       0x39, 0xFC, 0xD6, 0x01, 0x43, 0xFF, 0x33, 0x00, 0xFD, 0xFF, 0x00,
-       0x00, 0x22, 0x00, 0x77, 0xFF, 0x34, 0x01, 0xEA, 0xFD, 0x1F, 0x03,
-       0xAE, 0xFB, 0x45, 0x06, 0xD5, 0x48, 0x3C, 0x01, 0xDC, 0xFD, 0xFD,
-       0x01, 0x80, 0xFE, 0xED, 0x00, 0x93, 0xFF, 0x1B, 0x00, 0xFD, 0xFF,
-       0x2B, 0x00, 0x59, 0xFF, 0xAE, 0x01, 0x6A, 0xFC, 0x0D, 0x07, 0x80,
-       0xF1, 0xB8, 0x2F, 0xCF, 0x30, 0x7D, 0xF1, 0xFF, 0x06, 0x78, 0xFC,
-       0xA5, 0x01, 0x5F, 0xFF, 0x29, 0x00, 0xFD, 0xFF, 0x19, 0x00, 0x98,
-       0xFF, 0xE0, 0x00, 0x9C, 0xFE, 0xC8, 0x01, 0x3F, 0xFE, 0x62, 0x00,
-       0xB8, 0x48, 0x3F, 0x07, 0x47, 0xFB, 0x53, 0x03, 0xD0, 0xFD, 0x40,
-       0x01, 0x72, 0xFF, 0x23, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x34, 0x00,
-       0x40, 0xFF, 0xDB, 0x01, 0x35, 0xFC, 0x26, 0x07, 0x0E, 0xF2, 0x60,
-       0x28, 0x82, 0x37, 0xED, 0xF1, 0x5E, 0x06, 0xF8, 0xFC, 0x51, 0x01,
-       0x8A, 0xFF, 0x1A, 0x00, 0xFF, 0xFF, 0x11, 0x00, 0xBA, 0xFF, 0x89,
-       0x00, 0x51, 0xFF, 0x77, 0x00, 0xA7, 0x00, 0x64, 0xFB, 0x26, 0x47,
-       0xFC, 0x0D, 0xB4, 0xF8, 0x95, 0x04, 0x31, 0xFD, 0x88, 0x01, 0x56,
-       0xFF, 0x2C, 0x00, 0xFF, 0xFF, 0xFD, 0xFF, 0x36, 0x00, 0x36, 0xFF,
-       0xE6, 0x01, 0x3E, 0xFC, 0xD3, 0x06, 0x56, 0xF3, 0xBA, 0x20, 0x61,
-       0x3D, 0x56, 0xF3, 0x45, 0x05, 0xB7, 0xFD, 0xDE, 0x00, 0xC5, 0xFF,
-       0x05, 0x00, 0x02, 0x00, 0x09, 0x00, 0xDB, 0xFF, 0x34, 0x00, 0xFE,
-       0xFF, 0x3D, 0xFF, 0xC9, 0x02, 0x64, 0xF7, 0x2F, 0x44, 0x44, 0x15,
-       0x4A, 0xF6, 0xAD, 0x05, 0xAF, 0xFC, 0xC0, 0x01, 0x41, 0xFF, 0x32,
-       0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x35, 0x00, 0x3A, 0xFF, 0xD3, 0x01,
-       0x7D, 0xFC, 0x23, 0x06, 0x32, 0xF5, 0x0C, 0x19, 0x38, 0x42, 0xC7,
-       0xF5, 0xB8, 0x03, 0xAF, 0xFE, 0x4E, 0x00, 0x0C, 0x00, 0xEA, 0xFF,
-       0x06, 0x00, 0x04, 0x00, 0xF8, 0xFF, 0xE7, 0xFF, 0x99, 0x00, 0x2C,
-       0xFE, 0x8C, 0x04, 0x6D, 0xF4, 0xF0, 0x3F, 0xE0, 0x1C, 0x34, 0xF4,
-       0x85, 0x06, 0x57, 0xFC, 0xE0, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFE,
-       0xFF, 0xFF, 0xFF, 0x2F, 0x00, 0x4A, 0xFF, 0xA7, 0x01, 0xEC, 0xFC,
-       0x28, 0x05, 0x77, 0xF7, 0x92, 0x11, 0xD7, 0x45, 0x43, 0xF9, 0xC3,
-       0x01, 0xD6, 0xFF, 0xA9, 0xFF, 0x5E, 0x00, 0xCB, 0xFF, 0x0D, 0x00,
-       0x00, 0x00, 0x10, 0x00, 0xA6, 0xFF, 0x1B, 0x01, 0x50, 0xFD, 0xE1,
-       0x05, 0x82, 0xF2, 0x8F, 0x3A, 0x92, 0x24, 0x9D, 0xF2, 0x09, 0x07,
-       0x32, 0xFC, 0xE4, 0x01, 0x39, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x00,
-       0x00, 0x28, 0x00, 0x63, 0xFF, 0x66, 0x01, 0x7D, 0xFD, 0xF8, 0x03,
-       0xFB, 0xF9, 0x89, 0x0A, 0x1D, 0x48, 0xC5, 0xFD, 0x7A, 0xFF, 0x1D,
-       0x01, 0xF7, 0xFE, 0xB4, 0x00, 0xA9, 0xFF, 0x15, 0x00, 0xFE, 0xFF,
-       0x23, 0x00, 0x72, 0xFF, 0x7F, 0x01, 0xB0, 0xFC, 0xBE, 0x06, 0x97,
-       0xF1, 0x3F, 0x34, 0x19, 0x2C, 0xAD, 0xF1, 0x28, 0x07, 0x48, 0xFC,
-       0xC9, 0x01, 0x4B, 0xFF, 0x30, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x1F,
-       0x00, 0x82, 0xFF, 0x18, 0x01, 0x27, 0xFE, 0xA9, 0x02, 0x94, 0xFC,
-       0x24, 0x04, 0xF5, 0x48, 0x39, 0x03, 0xF9, 0xFC, 0x74, 0x02, 0x42,
-       0xFE, 0x0B, 0x01, 0x87, 0xFF, 0x1E, 0x00, 0xFD, 0xFF, 0x2F, 0x00,
-       0x4F, 0xFF, 0xC2, 0x01, 0x51, 0xFC, 0x23, 0x07, 0x9A, 0xF1, 0x3A,
-       0x2D, 0x35, 0x33, 0x89, 0xF1, 0xD5, 0x06, 0x9D, 0xFC, 0x8B, 0x01,
-       0x6C, 0xFF, 0x25, 0x00, 0xFD, 0xFF, 0x16, 0x00, 0xA4, 0xFF, 0xC2,
-       0x00, 0xDB, 0xFE, 0x52, 0x01, 0x1B, 0xFF, 0x8D, 0xFE, 0x57, 0x48,
-       0x81, 0x09, 0x61, 0xFA, 0xC6, 0x03, 0x96, 0xFD, 0x5B, 0x01, 0x68,
-       0xFF, 0x26, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x35, 0x00, 0x3B, 0xFF,
-       0xE2, 0x01, 0x31, 0xFC, 0x15, 0x07, 0x6D, 0xF2, 0xBF, 0x25, 0xA5,
-       0x39, 0x4D, 0xF2, 0x0B, 0x06, 0x33, 0xFD, 0x2D, 0x01, 0x9D, 0xFF,
-       0x13, 0x00, 0xFF, 0xFF, 0x0E, 0x00, 0xC6, 0xFF, 0x6B, 0x00, 0x8E,
-       0xFF, 0x06, 0x00, 0x6E, 0x01, 0xE4, 0xF9, 0x48, 0x46, 0x75, 0x10,
-       0xD7, 0xF7, 0xFC, 0x04, 0x00, 0xFD, 0x9E, 0x01, 0x4E, 0xFF, 0x2E,
-       0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE3, 0x01,
-       0x4E, 0xFC, 0xA0, 0x06, 0xED, 0xF3, 0x0F, 0x1E, 0x2D, 0x3F, 0x10,
-       0xF4, 0xC8, 0x04, 0x07, 0xFE, 0xAF, 0x00, 0xDC, 0xFF, 0xFC, 0xFF,
-       0x03, 0x00, 0x07, 0x00, 0xE5, 0xFF, 0x18, 0x00, 0x36, 0x00, 0xD9,
-       0xFE, 0x71, 0x03, 0x3F, 0xF6, 0xDB, 0x42, 0xE0, 0x17, 0x86, 0xF5,
-       0x00, 0x06, 0x8C, 0xFC, 0xCE, 0x01, 0x3C, 0xFF, 0x34, 0x00, 0xFE,
-       0xFF, 0xFF, 0xFF, 0x33, 0x00, 0x3F, 0xFF, 0xC6, 0x01, 0x9F, 0xFC,
-       0xD3, 0x05, 0xF1, 0xF5, 0x6C, 0x16, 0x9E, 0x43, 0xDD, 0xF6, 0x15,
-       0x03, 0x10, 0xFF, 0x17, 0x00, 0x28, 0x00, 0xDF, 0xFF, 0x09, 0x00,
-       0x02, 0x00, 0x01, 0x00, 0xCF, 0xFF, 0xC9, 0x00, 0xDA, 0xFD, 0x0F,
-       0x05, 0xA5, 0xF3, 0x31, 0x3E, 0x8A, 0x1F, 0x97, 0xF3, 0xBD, 0x06,
-       0x44, 0xFC, 0xE5, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0xFF,
-       0xFF, 0x2D, 0x00, 0x52, 0xFF, 0x92, 0x01, 0x1B, 0xFD, 0xC4, 0x04,
-       0x51, 0xF8, 0x13, 0x0F, 0xC8, 0x46, 0xB6, 0xFA, 0x01, 0x01, 0x44,
-       0x00, 0x6C, 0xFF, 0x7B, 0x00, 0xBF, 0xFF, 0x10, 0x00, 0xFF, 0xFF,
-       0x17, 0x00, 0x92, 0xFF, 0x41, 0x01, 0x11, 0xFD, 0x3B, 0x06, 0x14,
-       0xF2, 0x78, 0x38, 0x36, 0x27, 0x35, 0xF2, 0x20, 0x07, 0x33, 0xFC,
-       0xDF, 0x01, 0x3E, 0xFF, 0x34, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x25,
-       0x00, 0x6D, 0xFF, 0x4C, 0x01, 0xB6, 0xFD, 0x86, 0x03, 0xE1, 0xFA,
-       0x3D, 0x08, 0x92, 0x48, 0x8E, 0xFF, 0xA1, 0xFE, 0x93, 0x01, 0xB8,
-       0xFE, 0xD3, 0x00, 0x9D, 0xFF, 0x18, 0x00, 0xFD, 0xFF, 0x28, 0x00,
-       0x64, 0xFF, 0x9A, 0x01, 0x88, 0xFC, 0xEE, 0x06, 0x7E, 0xF1, 0xE3,
-       0x31, 0x9F, 0x2E, 0x88, 0xF1, 0x19, 0x07, 0x5E, 0xFC, 0xB7, 0x01,
-       0x54, 0xFF, 0x2D, 0x00, 0xFD, 0xFF, 0x1C, 0x00, 0x8D, 0xFF, 0xFA,
-       0x00, 0x64, 0xFE, 0x32, 0x02, 0x78, 0xFD, 0x1B, 0x02, 0xEA, 0x48,
-       0x50, 0x05, 0x14, 0xFC, 0xEB, 0x02, 0x05, 0xFE, 0x27, 0x01, 0x7C,
-       0xFF, 0x21, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x32, 0x00, 0x46, 0xFF,
-       0xD1, 0x01, 0x3F, 0xFC, 0x2B, 0x07, 0xCD, 0xF1, 0xAE, 0x2A, 0x86,
-       0x35, 0xB1, 0xF1, 0x9D, 0x06, 0xCA, 0xFC, 0x6E, 0x01, 0x7B, 0xFF,
-       0x20, 0x00, 0xFE, 0xFF, 0x13, 0x00, 0xAF, 0xFF, 0xA4, 0x00, 0x19,
-       0xFF, 0xDD, 0x00, 0xF0, 0xFF, 0xD4, 0xFC, 0xC9, 0x47, 0xD8, 0x0B,
-       0x7C, 0xF9, 0x35, 0x04, 0x5F, 0xFD, 0x74, 0x01, 0x5E, 0xFF, 0x29,
-       0x00, 0x00, 0x00, 0xFD, 0xFF, 0x36, 0x00, 0x38, 0xFF, 0xE6, 0x01,
-       0x35, 0xFC, 0xF7, 0x06, 0xE0, 0xF2, 0x18, 0x23, 0xAB, 0x3B, 0xCC,
-       0xF2, 0xA8, 0x05, 0x76, 0xFD, 0x04, 0x01, 0xB1, 0xFF, 0x0C, 0x00,
-       0x00, 0x00, 0x0C, 0x00, 0xD1, 0xFF, 0x4E, 0x00, 0xCA, 0xFF, 0x9A,
-       0xFF, 0x2A, 0x02, 0x83, 0xF8, 0x3F, 0x45, 0xFB, 0x12, 0x01, 0xF7,
-       0x5D, 0x05, 0xD3, 0xFC, 0xB1, 0x01, 0x46, 0xFF, 0x31, 0x00, 0xFF,
-       0xFF, 0xFE, 0xFF, 0x36, 0x00, 0x38, 0xFF, 0xDC, 0x01, 0x64, 0xFC,
-       0x62, 0x06, 0x93, 0xF4, 0x66, 0x1B, 0xD9, 0x40, 0xEA, 0xF4, 0x3E,
-       0x04, 0x5D, 0xFE, 0x7D, 0x00, 0xF5, 0xFF, 0xF3, 0xFF, 0x05, 0x00,
-       0x05, 0x00, 0xEF, 0xFF, 0xFE, 0xFF, 0x6C, 0x00, 0x7B, 0xFE, 0x0C,
-       0x04, 0x3A, 0xF5, 0x5F, 0x41, 0x83, 0x1A, 0xCD, 0xF4, 0x4B, 0x06,
-       0x6D, 0xFC, 0xD9, 0x01, 0x39, 0xFF, 0x35, 0x00, 0xFE, 0xFF, 0xFF,
-       0xFF, 0x31, 0x00, 0x44, 0xFF, 0xB7, 0x01, 0xC5, 0xFC, 0x7C, 0x05,
-       0xBC, 0xF6, 0xD5, 0x13, 0xDC, 0x44, 0x14, 0xF8, 0x67, 0x02, 0x77,
-       0xFF, 0xDD, 0xFF, 0x44, 0x00, 0xD5, 0xFF, 0x0B, 0x00, 0x01, 0x00,
-       0x09, 0x00, 0xB8, 0xFF, 0xF6, 0x00, 0x8D, 0xFD, 0x84, 0x05, 0xFD,
-       0xF2, 0x52, 0x3C, 0x35, 0x22, 0x0B, 0xF3, 0xEB, 0x06, 0x37, 0xFC,
-       0xE6, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x2A,
-       0x00, 0x5B, 0xFF, 0x7C, 0x01, 0x4E, 0xFD, 0x5A, 0x04, 0x31, 0xF9,
-       0xA4, 0x0C, 0x90, 0x47, 0x47, 0xFC, 0x36, 0x00, 0xB6, 0x00, 0x2E,
-       0xFF, 0x99, 0x00, 0xB3, 0xFF, 0x12, 0x00, 0xFE, 0xFF, 0x1E, 0x00,
-       0x80, 0xFF, 0x64, 0x01, 0xDA, 0xFC, 0x87, 0x06, 0xC5, 0xF1, 0x46,
-       0x36, 0xD1, 0x29, 0xE3, 0xF1, 0x2A, 0x07, 0x3A, 0xFC, 0xD5, 0x01,
-       0x44, 0xFF, 0x32, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x22, 0x00, 0x78,
-       0xFF, 0x31, 0x01, 0xF1, 0xFD, 0x12, 0x03, 0xC7, 0xFB, 0x07, 0x06,
-       0xDB, 0x48, 0x73, 0x01, 0xC3, 0xFD, 0x0A, 0x02, 0x79, 0xFE, 0xF1,
-       0x00, 0x91, 0xFF, 0x1B, 0x00, 0xFD, 0xFF, 0x2C, 0x00, 0x58, 0xFF,
-       0xB1, 0x01, 0x67, 0xFC, 0x10, 0x07, 0x81, 0xF1, 0x73, 0x2F, 0x15,
-       0x31, 0x7C, 0xF1, 0xFB, 0x06, 0x7C, 0xFC, 0xA2, 0x01, 0x60, 0xFF,
-       0x29, 0x00, 0xFD, 0xFF, 0x19, 0x00, 0x99, 0xFF, 0xDD, 0x00, 0xA3,
-       0xFE, 0xBB, 0x01, 0x58, 0xFE, 0x2D, 0x00, 0xAF, 0x48, 0x7E, 0x07,
-       0x2E, 0xFB, 0x60, 0x03, 0xC9, 0xFD, 0x43, 0x01, 0x71, 0xFF, 0x24,
-       0x00, 0x00, 0x00, 0xFD, 0xFF, 0x34, 0x00, 0x3F, 0xFF, 0xDC, 0x01,
-       0x34, 0xFC, 0x25, 0x07, 0x18, 0xF2, 0x15, 0x28, 0xBF, 0x37, 0xF7,
-       0xF1, 0x56, 0x06, 0xFE, 0xFC, 0x4D, 0x01, 0x8C, 0xFF, 0x19, 0x00,
-       0xFF, 0xFF, 0x10, 0x00, 0xBB, 0xFF, 0x85, 0x00, 0x58, 0xFF, 0x6A,
-       0x00, 0xBE, 0x00, 0x38, 0xFB, 0x0F, 0x47, 0x42, 0x0E, 0x9B, 0xF8,
-       0xA1, 0x04, 0x2B, 0xFD, 0x8B, 0x01, 0x55, 0xFF, 0x2C, 0x00, 0xFF,
-       0xFF, 0xFD, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE6, 0x01, 0x3F, 0xFC,
-       0xCE, 0x06, 0x66, 0xF3, 0x6F, 0x20, 0x96, 0x3D, 0x69, 0xF3, 0x38,
-       0x05, 0xBF, 0xFD, 0xD9, 0x00, 0xC7, 0xFF, 0x04, 0x00, 0x02, 0x00,
-       0x09, 0x00, 0xDC, 0xFF, 0x31, 0x00, 0x04, 0x00, 0x32, 0xFF, 0xDC,
-       0x02, 0x42, 0xF7, 0x0B, 0x44, 0x8E, 0x15, 0x34, 0xF6, 0xB7, 0x05,
-       0xAB, 0xFC, 0xC1, 0x01, 0x40, 0xFF, 0x33, 0x00, 0xFF, 0xFF, 0xFE,
-       0xFF, 0x35, 0x00, 0x3B, 0xFF, 0xD2, 0x01, 0x81, 0xFC, 0x1A, 0x06,
-       0x47, 0xF5, 0xC1, 0x18, 0x60, 0x42, 0xE4, 0xF5, 0xA6, 0x03, 0xB9,
-       0xFE, 0x48, 0x00, 0x0F, 0x00, 0xE9, 0xFF, 0x07, 0x00, 0x04, 0x00,
-       0xF9, 0xFF, 0xE4, 0xFF, 0x9F, 0x00, 0x23, 0xFE, 0x9B, 0x04, 0x55,
-       0xF4, 0xC0, 0x3F, 0x2C, 0x1D, 0x22, 0xF4, 0x8C, 0x06, 0x55, 0xFC,
-       0xE1, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x2F,
-       0x00, 0x4B, 0xFF, 0xA4, 0x01, 0xF1, 0xFC, 0x1D, 0x05, 0x8F, 0xF7,
-       0x4A, 0x11, 0xF2, 0x45, 0x6B, 0xF9, 0xAE, 0x01, 0xE2, 0xFF, 0xA2,
-       0xFF, 0x61, 0x00, 0xC9, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0x11, 0x00,
-       0xA3, 0xFF, 0x20, 0x01, 0x49, 0xFD, 0xEB, 0x05, 0x74, 0xF2, 0x54,
-       0x3A, 0xDD, 0x24, 0x91, 0xF2, 0x0C, 0x07, 0x32, 0xFC, 0xE4, 0x01,
-       0x3A, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x27, 0x00, 0x64,
-       0xFF, 0x63, 0x01, 0x84, 0xFD, 0xEB, 0x03, 0x14, 0xFA, 0x47, 0x0A,
-       0x2C, 0x48, 0xF6, 0xFD, 0x63, 0xFF, 0x2B, 0x01, 0xF0, 0xFE, 0xB8,
-       0x00, 0xA8, 0xFF, 0x15, 0x00, 0xFE, 0xFF, 0x23, 0x00, 0x71, 0xFF,
-       0x82, 0x01, 0xAB, 0xFC, 0xC4, 0x06, 0x93, 0xF1, 0xFD, 0x33, 0x62,
-       0x2C, 0xA8, 0xF1, 0x27, 0x07, 0x4A, 0xFC, 0xC7, 0x01, 0x4C, 0xFF,
-       0x30, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x1F, 0x00, 0x83, 0xFF, 0x14,
-       0x01, 0x2D, 0xFE, 0x9C, 0x02, 0xAD, 0xFC, 0xE9, 0x03, 0xF6, 0x48,
-       0x73, 0x03, 0xE0, 0xFC, 0x82, 0x02, 0x3B, 0xFE, 0x0E, 0x01, 0x86,
-       0xFF, 0x1E, 0x00, 0xFD, 0xFF, 0x2F, 0x00, 0x4E, 0xFF, 0xC3, 0x01,
-       0x4E, 0xFC, 0x24, 0x07, 0x9E, 0xF1, 0xF2, 0x2C, 0x78, 0x33, 0x8C,
-       0xF1, 0xD0, 0x06, 0xA2, 0xFC, 0x88, 0x01, 0x6D, 0xFF, 0x24, 0x00,
-       0xFD, 0xFF, 0x16, 0x00, 0xA5, 0xFF, 0xBE, 0x00, 0xE2, 0xFE, 0x45,
-       0x01, 0x33, 0xFF, 0x5A, 0xFE, 0x48, 0x48, 0xC3, 0x09, 0x47, 0xFA,
-       0xD2, 0x03, 0x90, 0xFD, 0x5E, 0x01, 0x66, 0xFF, 0x27, 0x00, 0x00,
-       0x00, 0xFD, 0xFF, 0x35, 0x00, 0x3B, 0xFF, 0xE3, 0x01, 0x31, 0xFC,
-       0x12, 0x07, 0x79, 0xF2, 0x73, 0x25, 0xDF, 0x39, 0x5A, 0xF2, 0x00,
-       0x06, 0x3A, 0xFD, 0x28, 0x01, 0x9F, 0xFF, 0x13, 0x00, 0x00, 0x00,
-       0x0E, 0x00, 0xC7, 0xFF, 0x68, 0x00, 0x95, 0xFF, 0xFA, 0xFF, 0x83,
-       0x01, 0xBB, 0xF9, 0x2B, 0x46, 0xBB, 0x10, 0xBF, 0xF7, 0x07, 0x05,
-       0xFB, 0xFC, 0xA0, 0x01, 0x4D, 0xFF, 0x2F, 0x00, 0xFF, 0xFF, 0xFE,
-       0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE2, 0x01, 0x50, 0xFC, 0x99, 0x06,
-       0xFE, 0xF3, 0xC3, 0x1D, 0x5E, 0x3F, 0x27, 0xF4, 0xB9, 0x04, 0x10,
-       0xFE, 0xA9, 0x00, 0xDF, 0xFF, 0xFB, 0xFF, 0x03, 0x00, 0x07, 0x00,
-       0xE6, 0xFF, 0x15, 0x00, 0x3C, 0x00, 0xCF, 0xFE, 0x83, 0x03, 0x20,
-       0xF6, 0xB2, 0x42, 0x2B, 0x18, 0x71, 0xF5, 0x09, 0x06, 0x88, 0xFC,
-       0xCF, 0x01, 0x3C, 0xFF, 0x34, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x33,
-       0x00, 0x3F, 0xFF, 0xC5, 0x01, 0xA3, 0xFC, 0xCA, 0x05, 0x07, 0xF6,
-       0x22, 0x16, 0xC3, 0x43, 0xFE, 0xF6, 0x02, 0x03, 0x1B, 0xFF, 0x11,
-       0x00, 0x2B, 0x00, 0xDE, 0xFF, 0x09, 0x00, 0x02, 0x00, 0x02, 0x00,
-       0xCC, 0xFF, 0xCE, 0x00, 0xD1, 0xFD, 0x1D, 0x05, 0x91, 0xF3, 0xFE,
-       0x3D, 0xD7, 0x1F, 0x87, 0xF3, 0xC3, 0x06, 0x42, 0xFC, 0xE5, 0x01,
-       0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0xFF, 0xFF, 0x2D, 0x00, 0x53,
-       0xFF, 0x90, 0x01, 0x20, 0xFD, 0xB8, 0x04, 0x6A, 0xF8, 0xCD, 0x0E,
-       0xE1, 0x46, 0xE1, 0xFA, 0xEB, 0x00, 0x51, 0x00, 0x65, 0xFF, 0x7F,
-       0x00, 0xBE, 0xFF, 0x10, 0x00, 0xFF, 0xFF, 0x18, 0x00, 0x90, 0xFF,
-       0x45, 0x01, 0x0B, 0xFD, 0x44, 0x06, 0x0A, 0xF2, 0x3B, 0x38, 0x80,
-       0x27, 0x2B, 0xF2, 0x22, 0x07, 0x33, 0xFC, 0xDE, 0x01, 0x3E, 0xFF,
-       0x34, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x24, 0x00, 0x6E, 0xFF, 0x49,
-       0x01, 0xBC, 0xFD, 0x7A, 0x03, 0xFA, 0xFA, 0xFD, 0x07, 0x9C, 0x48,
-       0xC3, 0xFF, 0x89, 0xFE, 0xA1, 0x01, 0xB1, 0xFE, 0xD6, 0x00, 0x9C,
-       0xFF, 0x18, 0x00, 0xFD, 0xFF, 0x28, 0x00, 0x63, 0xFF, 0x9D, 0x01,
-       0x84, 0xFC, 0xF3, 0x06, 0x7D, 0xF1, 0x9E, 0x31, 0xE6, 0x2E, 0x85,
-       0xF1, 0x16, 0x07, 0x61, 0xFC, 0xB5, 0x01, 0x55, 0xFF, 0x2D, 0x00,
-       0xFD, 0xFF, 0x1C, 0x00, 0x8F, 0xFF, 0xF7, 0x00, 0x6B, 0xFE, 0x25,
-       0x02, 0x91, 0xFD, 0xE3, 0x01, 0xE5, 0x48, 0x8D, 0x05, 0xFB, 0xFB,
-       0xF8, 0x02, 0xFE, 0xFD, 0x2B, 0x01, 0x7A, 0xFF, 0x21, 0x00, 0x00,
-       0x00, 0xFD, 0xFF, 0x32, 0x00, 0x45, 0xFF, 0xD2, 0x01, 0x3D, 0xFC,
-       0x2B, 0x07, 0xD4, 0xF1, 0x64, 0x2A, 0xC6, 0x35, 0xB7, 0xF1, 0x96,
-       0x06, 0xCF, 0xFC, 0x6B, 0x01, 0x7D, 0xFF, 0x1F, 0x00, 0xFE, 0xFF,
-       0x13, 0x00, 0xB1, 0xFF, 0xA0, 0x00, 0x20, 0xFF, 0xD0, 0x00, 0x07,
-       0x00, 0xA4, 0xFC, 0xB6, 0x47, 0x1C, 0x0C, 0x63, 0xF9, 0x42, 0x04,
-       0x59, 0xFD, 0x76, 0x01, 0x5D, 0xFF, 0x2A, 0x00, 0x00, 0x00, 0xFD,
-       0xFF, 0x36, 0x00, 0x37, 0xFF, 0xE6, 0x01, 0x35, 0xFC, 0xF3, 0x06,
-       0xEE, 0xF2, 0xCD, 0x22, 0xE4, 0x3B, 0xDC, 0xF2, 0x9C, 0x05, 0x7E,
-       0xFD, 0x00, 0x01, 0xB4, 0xFF, 0x0B, 0x00, 0x01, 0x00, 0x0B, 0x00,
-       0xD2, 0xFF, 0x4A, 0x00, 0xD0, 0xFF, 0x8E, 0xFF, 0x3F, 0x02, 0x5E,
-       0xF8, 0x1E, 0x45, 0x44, 0x13, 0xEA, 0xF6, 0x67, 0x05, 0xCF, 0xFC,
-       0xB3, 0x01, 0x46, 0xFF, 0x31, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x36,
-       0x00, 0x38, 0xFF, 0xDB, 0x01, 0x67, 0xFC, 0x5A, 0x06, 0xA6, 0xF4,
-       0x1B, 0x1B, 0x07, 0x41, 0x04, 0xF5, 0x2D, 0x04, 0x67, 0xFE, 0x77,
-       0x00, 0xF8, 0xFF, 0xF2, 0xFF, 0x05, 0x00, 0x05, 0x00, 0xF0, 0xFF,
-       0xFB, 0xFF, 0x71, 0x00, 0x71, 0xFE, 0x1D, 0x04, 0x1F, 0xF5, 0x32,
-       0x41, 0xCE, 0x1A, 0xBA, 0xF4, 0x53, 0x06, 0x6A, 0xFC, 0xDA, 0x01,
-       0x38, 0xFF, 0x35, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x31, 0x00, 0x45,
-       0xFF, 0xB5, 0x01, 0xCA, 0xFC, 0x72, 0x05, 0xD3, 0xF6, 0x8D, 0x13,
-       0xFD, 0x44, 0x39, 0xF8, 0x53, 0x02, 0x82, 0xFF, 0xD7, 0xFF, 0x47,
-       0x00, 0xD3, 0xFF, 0x0B, 0x00, 0x01, 0x00, 0x0A, 0x00, 0xB6, 0xFF,
-       0xFB, 0x00, 0x85, 0xFD, 0x90, 0x05, 0xEC, 0xF2, 0x1C, 0x3C, 0x81,
-       0x22, 0xFC, 0xF2, 0xEF, 0x06, 0x36, 0xFC, 0xE6, 0x01, 0x37, 0xFF,
-       0x36, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x2A, 0x00, 0x5C, 0xFF, 0x79,
-       0x01, 0x53, 0xFD, 0x4E, 0x04, 0x4A, 0xF9, 0x60, 0x0C, 0xA3, 0x47,
-       0x76, 0xFC, 0x1F, 0x00, 0xC3, 0x00, 0x27, 0xFF, 0x9D, 0x00, 0xB2,
-       0xFF, 0x13, 0x00, 0xFE, 0xFF, 0x1E, 0x00, 0x7F, 0xFF, 0x67, 0x01,
-       0xD5, 0xFC, 0x8E, 0x06, 0xBE, 0xF1, 0x06, 0x36, 0x1A, 0x2A, 0xDC,
-       0xF1, 0x2A, 0x07, 0x3C, 0xFC, 0xD3, 0x01, 0x44, 0xFF, 0x32, 0x00,
-       0xFD, 0xFF, 0x00, 0x00, 0x21, 0x00, 0x79, 0xFF, 0x2E, 0x01, 0xF7,
-       0xFD, 0x05, 0x03, 0xE1, 0xFB, 0xCA, 0x05, 0xDF, 0x48, 0xAB, 0x01,
-       0xAA, 0xFD, 0x18, 0x02, 0x72, 0xFE, 0xF4, 0x00, 0x90, 0xFF, 0x1B,
-       0x00, 0xFD, 0xFF, 0x2C, 0x00, 0x57, 0xFF, 0xB3, 0x01, 0x64, 0xFC,
-       0x13, 0x07, 0x83, 0xF1, 0x2C, 0x2F, 0x5A, 0x31, 0x7D, 0xF1, 0xF7,
-       0x06, 0x80, 0xFC, 0x9F, 0x01, 0x61, 0xFF, 0x29, 0x00, 0xFD, 0xFF,
-       0x19, 0x00, 0x9A, 0xFF, 0xD9, 0x00, 0xAA, 0xFE, 0xAE, 0x01, 0x70,
-       0xFE, 0xF8, 0xFF, 0xA6, 0x48, 0xBE, 0x07, 0x14, 0xFB, 0x6D, 0x03,
-       0xC3, 0xFD, 0x46, 0x01, 0x70, 0xFF, 0x24, 0x00, 0x00, 0x00, 0xFD,
-       0xFF, 0x34, 0x00, 0x3F, 0xFF, 0xDD, 0x01, 0x34, 0xFC, 0x23, 0x07,
-       0x21, 0xF2, 0xCB, 0x27, 0xFE, 0x37, 0x00, 0xF2, 0x4D, 0x06, 0x04,
-       0xFD, 0x49, 0x01, 0x8E, 0xFF, 0x19, 0x00, 0xFF, 0xFF, 0x10, 0x00,
-       0xBD, 0xFF, 0x82, 0x00, 0x5E, 0xFF, 0x5D, 0x00, 0xD4, 0x00, 0x0C,
-       0xFB, 0xF9, 0x46, 0x87, 0x0E, 0x82, 0xF8, 0xAD, 0x04, 0x26, 0xFD,
-       0x8D, 0x01, 0x54, 0xFF, 0x2C, 0x00, 0xFF, 0xFF, 0xFD, 0xFF, 0x36,
-       0x00, 0x36, 0xFF, 0xE6, 0x01, 0x41, 0xFC, 0xC8, 0x06, 0x76, 0xF3,
-       0x22, 0x20, 0xCA, 0x3D, 0x7D, 0xF3, 0x2A, 0x05, 0xC8, 0xFD, 0xD4,
-       0x00, 0xCA, 0xFF, 0x03, 0x00, 0x02, 0x00, 0x09, 0x00, 0xDD, 0xFF,
-       0x2E, 0x00, 0x0A, 0x00, 0x27, 0xFF, 0xEF, 0x02, 0x20, 0xF7, 0xE7,
-       0x43, 0xD8, 0x15, 0x1E, 0xF6, 0xC0, 0x05, 0xA7, 0xFC, 0xC3, 0x01,
-       0x40, 0xFF, 0x33, 0x00, 0xFF, 0xFF, 0xFE, 0xFF, 0x34, 0x00, 0x3B,
-       0xFF, 0xD1, 0x01, 0x84, 0xFC, 0x12, 0x06, 0x5C, 0xF5, 0x76, 0x18,
-       0x89, 0x42, 0x02, 0xF6, 0x94, 0x03, 0xC4, 0xFE, 0x42, 0x00, 0x12,
-       0x00, 0xE8, 0xFF, 0x07, 0x00, 0x03, 0x00, 0xFA, 0xFF, 0xE2, 0xFF,
-       0xA4, 0x00, 0x19, 0xFE, 0xAA, 0x04, 0x3E, 0xF4, 0x90, 0x3F, 0x78,
-       0x1D, 0x10, 0xF4, 0x93, 0x06, 0x52, 0xFC, 0xE1, 0x01, 0x36, 0xFF,
-       0x36, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x2F, 0x00, 0x4C, 0xFF, 0xA2,
-       0x01, 0xF6, 0xFC, 0x12, 0x05, 0xA7, 0xF7, 0x03, 0x11, 0x10, 0x46,
-       0x93, 0xF9, 0x98, 0x01, 0xEE, 0xFF, 0x9B, 0xFF, 0x64, 0x00, 0xC8,
-       0xFF, 0x0E, 0x00, 0x00, 0x00, 0x12, 0x00, 0xA1, 0xFF, 0x24, 0x01,
-       0x41, 0xFD, 0xF6, 0x05, 0x67, 0xF2, 0x1A, 0x3A, 0x29, 0x25, 0x84,
-       0xF2, 0x0F, 0x07, 0x31, 0xFC, 0xE3, 0x01, 0x3A, 0xFF, 0x35, 0x00,
-       0xFD, 0xFF, 0x00, 0x00, 0x27, 0x00, 0x65, 0xFF, 0x60, 0x01, 0x8A,
-       0xFD, 0xDF, 0x03, 0x2E, 0xFA, 0x04, 0x0A, 0x3A, 0x48, 0x28, 0xFE,
-       0x4B, 0xFF, 0x38, 0x01, 0xE9, 0xFE, 0xBB, 0x00, 0xA6, 0xFF, 0x16,
-       0x00, 0xFD, 0xFF, 0x24, 0x00, 0x6F, 0xFF, 0x85, 0x01, 0xA6, 0xFC,
-       0xCA, 0x06, 0x8F, 0xF1, 0xBB, 0x33, 0xAB, 0x2C, 0xA3, 0xF1, 0x26,
-       0x07, 0x4C, 0xFC, 0xC5, 0x01, 0x4D, 0xFF, 0x30, 0x00, 0xFD, 0xFF,
-       0x00, 0x00, 0x1E, 0x00, 0x84, 0xFF, 0x11, 0x01, 0x34, 0xFE, 0x8F,
-       0x02, 0xC7, 0xFC, 0xAE, 0x03, 0xF7, 0x48, 0xAE, 0x03, 0xC7, 0xFC,
-       0x8F, 0x02, 0x34, 0xFE, 0x11, 0x01, 0x84, 0xFF, 0x1E, 0x00, 0xFD,
-       0xFF, 0x2A, 0x00, 0x5C, 0xFF, 0xAA, 0x01, 0x71, 0xFC, 0x07, 0x07,
-       0x7E, 0xF1, 0x44, 0x30, 0x44, 0x30, 0x7E, 0xF1, 0x07, 0x07, 0x71,
-       0xFC, 0xAA, 0x01, 0x5C, 0xFF, 0x2A, 0x00, 0xFD, 0xFF, 0x00, 0x00,
-       0x1E, 0x00, 0x84, 0xFF, 0x11, 0x01, 0x34, 0xFE, 0x8F, 0x02, 0xC7,
-       0xFC, 0xAE, 0x03, 0xF7, 0x48, 0xAE, 0x03, 0xC7, 0xFC, 0x8F, 0x02,
-       0x34, 0xFE, 0x11, 0x01, 0x84, 0xFF, 0x1E, 0x00, 0x02, 0x00, 0x05,
-       0x00, 0xC3, 0xFF, 0xE1, 0x00, 0xB1, 0xFD, 0x4E, 0x05, 0x4A, 0xF3,
-       0x3D, 0x3D, 0xED, 0x20, 0x4C, 0xF3, 0xD6, 0x06, 0x3D, 0xFC, 0xE6,
-       0x01, 0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0xFD, 0xFF, 0x36, 0x00,
-       0x36, 0xFF, 0xE6, 0x01, 0x3D, 0xFC, 0xD6, 0x06, 0x4C, 0xF3, 0xED,
-       0x20, 0x3D, 0x3D, 0x4A, 0xF3, 0x4E, 0x05, 0xB1, 0xFD, 0xE1, 0x00,
-       0xC3, 0xFF, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x84,
-       0xFF, 0x11, 0x01, 0x34, 0xFE, 0x8F, 0x02, 0xC7, 0xFC, 0xAE, 0x03,
-       0xF7, 0x48, 0xAE, 0x03, 0xC7, 0xFC, 0x8F, 0x02, 0x34, 0xFE, 0x11,
-       0x01, 0x84, 0xFF, 0x1E, 0x00, 0x16, 0x00, 0xA6, 0xFF, 0xBB, 0x00,
-       0xE9, 0xFE, 0x38, 0x01, 0x4B, 0xFF, 0x28, 0xFE, 0x3A, 0x48, 0x04,
-       0x0A, 0x2E, 0xFA, 0xDF, 0x03, 0x8A, 0xFD, 0x60, 0x01, 0x65, 0xFF,
-       0x27, 0x00, 0x00, 0x00, 0x0E, 0x00, 0xC8, 0xFF, 0x64, 0x00, 0x9B,
-       0xFF, 0xEE, 0xFF, 0x98, 0x01, 0x93, 0xF9, 0x10, 0x46, 0x03, 0x11,
-       0xA7, 0xF7, 0x12, 0x05, 0xF6, 0xFC, 0xA2, 0x01, 0x4C, 0xFF, 0x2F,
-       0x00, 0xFF, 0xFF, 0x07, 0x00, 0xE8, 0xFF, 0x12, 0x00, 0x42, 0x00,
-       0xC4, 0xFE, 0x94, 0x03, 0x02, 0xF6, 0x89, 0x42, 0x76, 0x18, 0x5C,
-       0xF5, 0x12, 0x06, 0x84, 0xFC, 0xD1, 0x01, 0x3B, 0xFF, 0x34, 0x00,
-       0xFE, 0xFF, 0x02, 0x00, 0x03, 0x00, 0xCA, 0xFF, 0xD4, 0x00, 0xC8,
-       0xFD, 0x2A, 0x05, 0x7D, 0xF3, 0xCA, 0x3D, 0x22, 0x20, 0x76, 0xF3,
-       0xC8, 0x06, 0x41, 0xFC, 0xE6, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFD,
-       0xFF, 0xFF, 0xFF, 0x19, 0x00, 0x8E, 0xFF, 0x49, 0x01, 0x04, 0xFD,
-       0x4D, 0x06, 0x00, 0xF2, 0xFE, 0x37, 0xCB, 0x27, 0x21, 0xF2, 0x23,
-       0x07, 0x34, 0xFC, 0xDD, 0x01, 0x3F, 0xFF, 0x34, 0x00, 0xFD, 0xFF,
-       0xFD, 0xFF, 0x29, 0x00, 0x61, 0xFF, 0x9F, 0x01, 0x80, 0xFC, 0xF7,
-       0x06, 0x7D, 0xF1, 0x5A, 0x31, 0x2C, 0x2F, 0x83, 0xF1, 0x13, 0x07,
-       0x64, 0xFC, 0xB3, 0x01, 0x57, 0xFF, 0x2C, 0x00, 0xFD, 0xFF, 0xFD,
-       0xFF, 0x32, 0x00, 0x44, 0xFF, 0xD3, 0x01, 0x3C, 0xFC, 0x2A, 0x07,
-       0xDC, 0xF1, 0x1A, 0x2A, 0x06, 0x36, 0xBE, 0xF1, 0x8E, 0x06, 0xD5,
-       0xFC, 0x67, 0x01, 0x7F, 0xFF, 0x1E, 0x00, 0xFE, 0xFF, 0xFD, 0xFF,
-       0x36, 0x00, 0x37, 0xFF, 0xE6, 0x01, 0x36, 0xFC, 0xEF, 0x06, 0xFC,
-       0xF2, 0x81, 0x22, 0x1C, 0x3C, 0xEC, 0xF2, 0x90, 0x05, 0x85, 0xFD,
-       0xFB, 0x00, 0xB6, 0xFF, 0x0A, 0x00, 0x01, 0x00, 0xFE, 0xFF, 0x35,
-       0x00, 0x38, 0xFF, 0xDA, 0x01, 0x6A, 0xFC, 0x53, 0x06, 0xBA, 0xF4,
-       0xCE, 0x1A, 0x32, 0x41, 0x1F, 0xF5, 0x1D, 0x04, 0x71, 0xFE, 0x71,
-       0x00, 0xFB, 0xFF, 0xF0, 0xFF, 0x05, 0x00, 0xFF, 0xFF, 0x31, 0x00,
-       0x46, 0xFF, 0xB3, 0x01, 0xCF, 0xFC, 0x67, 0x05, 0xEA, 0xF6, 0x44,
-       0x13, 0x1E, 0x45, 0x5E, 0xF8, 0x3F, 0x02, 0x8E, 0xFF, 0xD0, 0xFF,
-       0x4A, 0x00, 0xD2, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x5D,
-       0xFF, 0x76, 0x01, 0x59, 0xFD, 0x42, 0x04, 0x63, 0xF9, 0x1C, 0x0C,
-       0xB6, 0x47, 0xA4, 0xFC, 0x07, 0x00, 0xD0, 0x00, 0x20, 0xFF, 0xA0,
-       0x00, 0xB1, 0xFF, 0x13, 0x00, 0x00, 0x00, 0x21, 0x00, 0x7A, 0xFF,
-       0x2B, 0x01, 0xFE, 0xFD, 0xF8, 0x02, 0xFB, 0xFB, 0x8D, 0x05, 0xE5,
-       0x48, 0xE3, 0x01, 0x91, 0xFD, 0x25, 0x02, 0x6B, 0xFE, 0xF7, 0x00,
-       0x8F, 0xFF, 0x1C, 0x00, 0x18, 0x00, 0x9C, 0xFF, 0xD6, 0x00, 0xB1,
-       0xFE, 0xA1, 0x01, 0x89, 0xFE, 0xC3, 0xFF, 0x9C, 0x48, 0xFD, 0x07,
-       0xFA, 0xFA, 0x7A, 0x03, 0xBC, 0xFD, 0x49, 0x01, 0x6E, 0xFF, 0x24,
-       0x00, 0x00, 0x00, 0x10, 0x00, 0xBE, 0xFF, 0x7F, 0x00, 0x65, 0xFF,
-       0x51, 0x00, 0xEB, 0x00, 0xE1, 0xFA, 0xE1, 0x46, 0xCD, 0x0E, 0x6A,
-       0xF8, 0xB8, 0x04, 0x20, 0xFD, 0x90, 0x01, 0x53, 0xFF, 0x2D, 0x00,
-       0xFF, 0xFF, 0x09, 0x00, 0xDE, 0xFF, 0x2B, 0x00, 0x11, 0x00, 0x1B,
-       0xFF, 0x02, 0x03, 0xFE, 0xF6, 0xC3, 0x43, 0x22, 0x16, 0x07, 0xF6,
-       0xCA, 0x05, 0xA3, 0xFC, 0xC5, 0x01, 0x3F, 0xFF, 0x33, 0x00, 0xFF,
-       0xFF, 0x03, 0x00, 0xFB, 0xFF, 0xDF, 0xFF, 0xA9, 0x00, 0x10, 0xFE,
-       0xB9, 0x04, 0x27, 0xF4, 0x5E, 0x3F, 0xC3, 0x1D, 0xFE, 0xF3, 0x99,
-       0x06, 0x50, 0xFC, 0xE2, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFE, 0xFF,
-       0x00, 0x00, 0x13, 0x00, 0x9F, 0xFF, 0x28, 0x01, 0x3A, 0xFD, 0x00,
-       0x06, 0x5A, 0xF2, 0xDF, 0x39, 0x73, 0x25, 0x79, 0xF2, 0x12, 0x07,
-       0x31, 0xFC, 0xE3, 0x01, 0x3B, 0xFF, 0x35, 0x00, 0xFD, 0xFF, 0xFD,
-       0xFF, 0x24, 0x00, 0x6D, 0xFF, 0x88, 0x01, 0xA2, 0xFC, 0xD0, 0x06,
-       0x8C, 0xF1, 0x78, 0x33, 0xF2, 0x2C, 0x9E, 0xF1, 0x24, 0x07, 0x4E,
-       0xFC, 0xC3, 0x01, 0x4E, 0xFF, 0x2F, 0x00, 0xFD, 0xFF, 0xFD, 0xFF,
-       0x30, 0x00, 0x4C, 0xFF, 0xC7, 0x01, 0x4A, 0xFC, 0x27, 0x07, 0xA8,
-       0xF1, 0x62, 0x2C, 0xFD, 0x33, 0x93, 0xF1, 0xC4, 0x06, 0xAB, 0xFC,
-       0x82, 0x01, 0x71, 0xFF, 0x23, 0x00, 0xFE, 0xFF, 0xFD, 0xFF, 0x36,
-       0x00, 0x3A, 0xFF, 0xE4, 0x01, 0x32, 0xFC, 0x0C, 0x07, 0x91, 0xF2,
-       0xDD, 0x24, 0x54, 0x3A, 0x74, 0xF2, 0xEB, 0x05, 0x49, 0xFD, 0x20,
-       0x01, 0xA3, 0xFF, 0x11, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x36, 0x00,
-       0x37, 0xFF, 0xE1, 0x01, 0x55, 0xFC, 0x8C, 0x06, 0x22, 0xF4, 0x2C,
-       0x1D, 0xC0, 0x3F, 0x55, 0xF4, 0x9B, 0x04, 0x23, 0xFE, 0x9F, 0x00,
-       0xE4, 0xFF, 0xF9, 0xFF, 0x04, 0x00, 0xFF, 0xFF, 0x33, 0x00, 0x40,
-       0xFF, 0xC1, 0x01, 0xAB, 0xFC, 0xB7, 0x05, 0x34, 0xF6, 0x8E, 0x15,
-       0x0B, 0x44, 0x42, 0xF7, 0xDC, 0x02, 0x32, 0xFF, 0x04, 0x00, 0x31,
-       0x00, 0xDC, 0xFF, 0x09, 0x00, 0xFF, 0xFF, 0x2C, 0x00, 0x55, 0xFF,
-       0x8B, 0x01, 0x2B, 0xFD, 0xA1, 0x04, 0x9B, 0xF8, 0x42, 0x0E, 0x0F,
-       0x47, 0x38, 0xFB, 0xBE, 0x00, 0x6A, 0x00, 0x58, 0xFF, 0x85, 0x00,
-       0xBB, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x24, 0x00, 0x71, 0xFF, 0x43,
-       0x01, 0xC9, 0xFD, 0x60, 0x03, 0x2E, 0xFB, 0x7E, 0x07, 0xAF, 0x48,
-       0x2D, 0x00, 0x58, 0xFE, 0xBB, 0x01, 0xA3, 0xFE, 0xDD, 0x00, 0x99,
-       0xFF, 0x19, 0x00, 0x1B, 0x00, 0x91, 0xFF, 0xF1, 0x00, 0x79, 0xFE,
-       0x0A, 0x02, 0xC3, 0xFD, 0x73, 0x01, 0xDB, 0x48, 0x07, 0x06, 0xC7,
-       0xFB, 0x12, 0x03, 0xF1, 0xFD, 0x31, 0x01, 0x78, 0xFF, 0x22, 0x00,
-       0x00, 0x00, 0x12, 0x00, 0xB3, 0xFF, 0x99, 0x00, 0x2E, 0xFF, 0xB6,
-       0x00, 0x36, 0x00, 0x47, 0xFC, 0x90, 0x47, 0xA4, 0x0C, 0x31, 0xF9,
-       0x5A, 0x04, 0x4E, 0xFD, 0x7C, 0x01, 0x5B, 0xFF, 0x2A, 0x00, 0x00,
-       0x00, 0x0B, 0x00, 0xD5, 0xFF, 0x44, 0x00, 0xDD, 0xFF, 0x77, 0xFF,
-       0x67, 0x02, 0x14, 0xF8, 0xDC, 0x44, 0xD5, 0x13, 0xBC, 0xF6, 0x7C,
-       0x05, 0xC5, 0xFC, 0xB7, 0x01, 0x44, 0xFF, 0x31, 0x00, 0xFF, 0xFF,
-       0x05, 0x00, 0xF3, 0xFF, 0xF5, 0xFF, 0x7D, 0x00, 0x5D, 0xFE, 0x3E,
-       0x04, 0xEA, 0xF4, 0xD9, 0x40, 0x66, 0x1B, 0x93, 0xF4, 0x62, 0x06,
-       0x64, 0xFC, 0xDC, 0x01, 0x38, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x00,
-       0x00, 0x0C, 0x00, 0xB1, 0xFF, 0x04, 0x01, 0x76, 0xFD, 0xA8, 0x05,
-       0xCC, 0xF2, 0xAB, 0x3B, 0x18, 0x23, 0xE0, 0xF2, 0xF7, 0x06, 0x35,
-       0xFC, 0xE6, 0x01, 0x38, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0xFE, 0xFF,
-       0x20, 0x00, 0x7B, 0xFF, 0x6E, 0x01, 0xCA, 0xFC, 0x9D, 0x06, 0xB1,
-       0xF1, 0x86, 0x35, 0xAE, 0x2A, 0xCD, 0xF1, 0x2B, 0x07, 0x3F, 0xFC,
-       0xD1, 0x01, 0x46, 0xFF, 0x32, 0x00, 0xFD, 0xFF, 0xFD, 0xFF, 0x2D,
-       0x00, 0x54, 0xFF, 0xB7, 0x01, 0x5E, 0xFC, 0x19, 0x07, 0x88, 0xF1,
-       0x9F, 0x2E, 0xE3, 0x31, 0x7E, 0xF1, 0xEE, 0x06, 0x88, 0xFC, 0x9A,
-       0x01, 0x64, 0xFF, 0x28, 0x00, 0xFD, 0xFF, 0xFD, 0xFF, 0x34, 0x00,
-       0x3E, 0xFF, 0xDF, 0x01, 0x33, 0xFC, 0x20, 0x07, 0x35, 0xF2, 0x36,
-       0x27, 0x78, 0x38, 0x14, 0xF2, 0x3B, 0x06, 0x11, 0xFD, 0x41, 0x01,
-       0x92, 0xFF, 0x17, 0x00, 0xFF, 0xFF, 0xFD, 0xFF, 0x36, 0x00, 0x36,
-       0xFF, 0xE5, 0x01, 0x44, 0xFC, 0xBD, 0x06, 0x97, 0xF3, 0x8A, 0x1F,
-       0x31, 0x3E, 0xA5, 0xF3, 0x0F, 0x05, 0xDA, 0xFD, 0xC9, 0x00, 0xCF,
-       0xFF, 0x01, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0x34, 0x00, 0x3C, 0xFF,
-       0xCE, 0x01, 0x8C, 0xFC, 0x00, 0x06, 0x86, 0xF5, 0xE0, 0x17, 0xDB,
-       0x42, 0x3F, 0xF6, 0x71, 0x03, 0xD9, 0xFE, 0x36, 0x00, 0x18, 0x00,
-       0xE5, 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0x2E, 0x00, 0x4E, 0xFF, 0x9E,
-       0x01, 0x00, 0xFD, 0xFC, 0x04, 0xD7, 0xF7, 0x75, 0x10, 0x48, 0x46,
-       0xE4, 0xF9, 0x6E, 0x01, 0x06, 0x00, 0x8E, 0xFF, 0x6B, 0x00, 0xC6,
-       0xFF, 0x0E, 0x00, 0x00, 0x00, 0x26, 0x00, 0x68, 0xFF, 0x5B, 0x01,
-       0x96, 0xFD, 0xC6, 0x03, 0x61, 0xFA, 0x81, 0x09, 0x57, 0x48, 0x8D,
-       0xFE, 0x1B, 0xFF, 0x52, 0x01, 0xDB, 0xFE, 0xC2, 0x00, 0xA4, 0xFF,
-       0x16, 0x00, 0x1E, 0x00, 0x87, 0xFF, 0x0B, 0x01, 0x42, 0xFE, 0x74,
-       0x02, 0xF9, 0xFC, 0x39, 0x03, 0xF5, 0x48, 0x24, 0x04, 0x94, 0xFC,
-       0xA9, 0x02, 0x27, 0xFE, 0x18, 0x01, 0x82, 0xFF, 0x1F, 0x00, 0x00,
-       0x00, 0x15, 0x00, 0xA9, 0xFF, 0xB4, 0x00, 0xF7, 0xFE, 0x1D, 0x01,
-       0x7A, 0xFF, 0xC5, 0xFD, 0x1D, 0x48, 0x89, 0x0A, 0xFB, 0xF9, 0xF8,
-       0x03, 0x7D, 0xFD, 0x66, 0x01, 0x63, 0xFF, 0x28, 0x00, 0x00, 0x00,
-       0x0D, 0x00, 0xCB, 0xFF, 0x5E, 0x00, 0xA9, 0xFF, 0xD6, 0xFF, 0xC3,
-       0x01, 0x43, 0xF9, 0xD7, 0x45, 0x92, 0x11, 0x77, 0xF7, 0x28, 0x05,
-       0xEC, 0xFC, 0xA7, 0x01, 0x4A, 0xFF, 0x2F, 0x00, 0xFF, 0xFF, 0x06,
-       0x00, 0xEA, 0xFF, 0x0C, 0x00, 0x4E, 0x00, 0xAF, 0xFE, 0xB8, 0x03,
-       0xC7, 0xF5, 0x38, 0x42, 0x0C, 0x19, 0x32, 0xF5, 0x23, 0x06, 0x7D,
-       0xFC, 0xD3, 0x01, 0x3A, 0xFF, 0x35, 0x00, 0xFE, 0xFF, 0x02, 0x00,
-       0x05, 0x00, 0xC5, 0xFF, 0xDE, 0x00, 0xB7, 0xFD, 0x45, 0x05, 0x56,
-       0xF3, 0x61, 0x3D, 0xBA, 0x20, 0x56, 0xF3, 0xD3, 0x06, 0x3E, 0xFC,
-       0xE6, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0xFF, 0xFF, 0x1A,
-       0x00, 0x8A, 0xFF, 0x51, 0x01, 0xF8, 0xFC, 0x5E, 0x06, 0xED, 0xF1,
-       0x82, 0x37, 0x60, 0x28, 0x0E, 0xF2, 0x26, 0x07, 0x35, 0xFC, 0xDB,
-       0x01, 0x40, 0xFF, 0x34, 0x00, 0xFD, 0xFF, 0xFD, 0xFF, 0x29, 0x00,
-       0x5F, 0xFF, 0xA5, 0x01, 0x78, 0xFC, 0xFF, 0x06, 0x7D, 0xF1, 0xCF,
-       0x30, 0xB8, 0x2F, 0x80, 0xF1, 0x0D, 0x07, 0x6A, 0xFC, 0xAE, 0x01,
-       0x59, 0xFF, 0x2B, 0x00, 0xFD, 0xFF, 0xFD, 0xFF, 0x33, 0x00, 0x43,
-       0xFF, 0xD6, 0x01, 0x39, 0xFC, 0x2A, 0x07, 0xEB, 0xF1, 0x87, 0x29,
-       0x85, 0x36, 0xCC, 0xF1, 0x7F, 0x06, 0xE0, 0xFC, 0x60, 0x01, 0x82,
-       0xFF, 0x1D, 0x00, 0xFE, 0xFF, 0xFD, 0xFF, 0x36, 0x00, 0x37, 0xFF,
-       0xE6, 0x01, 0x38, 0xFC, 0xE6, 0x06, 0x19, 0xF3, 0xEA, 0x21, 0x8A,
-       0x3C, 0x0E, 0xF3, 0x78, 0x05, 0x96, 0xFD, 0xF1, 0x00, 0xBB, 0xFF,
-       0x08, 0x00, 0x01, 0x00, 0xFE, 0xFF, 0x35, 0x00, 0x39, 0xFF, 0xD8,
-       0x01, 0x70, 0xFC, 0x43, 0x06, 0xE1, 0xF4, 0x38, 0x1A, 0x8C, 0x41,
-       0x55, 0xF5, 0xFC, 0x03, 0x85, 0xFE, 0x66, 0x00, 0x01, 0x00, 0xEE,
-       0xFF, 0x06, 0x00, 0xFF, 0xFF, 0x30, 0x00, 0x47, 0xFF, 0xAF, 0x01,
-       0xD8, 0xFC, 0x52, 0x05, 0x19, 0xF7, 0xB2, 0x12, 0x5C, 0x45, 0xA9,
-       0xF8, 0x16, 0x02, 0xA6, 0xFF, 0xC3, 0xFF, 0x51, 0x00, 0xD0, 0xFF,
-       0x0C, 0x00, 0x00, 0x00, 0x29, 0x00, 0x5F, 0xFF, 0x71, 0x01, 0x65,
-       0xFD, 0x29, 0x04, 0x96, 0xF9, 0x95, 0x0B, 0xDC, 0x47, 0x03, 0xFD,
-       0xD9, 0xFF, 0xEA, 0x00, 0x12, 0xFF, 0xA7, 0x00, 0xAE, 0xFF, 0x14,
-       0x00, 0x00, 0x00, 0x20, 0x00, 0x7D, 0xFF, 0x24, 0x01, 0x0C, 0xFE,
-       0xDE, 0x02, 0x2E, 0xFC, 0x13, 0x05, 0xEC, 0x48, 0x54, 0x02, 0x5E,
-       0xFD, 0x3F, 0x02, 0x5D, 0xFE, 0xFE, 0x00, 0x8C, 0xFF, 0x1C, 0x00,
-       0x17, 0x00, 0x9E, 0xFF, 0xCF, 0x00, 0xBF, 0xFE, 0x86, 0x01, 0xBA,
-       0xFE, 0x5A, 0xFF, 0x86, 0x48, 0x7D, 0x08, 0xC7, 0xFA, 0x93, 0x03,
-       0xB0, 0xFD, 0x4F, 0x01, 0x6C, 0xFF, 0x25, 0x00, 0x00, 0x00, 0x0F,
-       0x00, 0xC0, 0xFF, 0x78, 0x00, 0x73, 0xFF, 0x38, 0x00, 0x17, 0x01,
-       0x8B, 0xFA, 0xAF, 0x46, 0x59, 0x0F, 0x39, 0xF8, 0xCF, 0x04, 0x15,
-       0xFD, 0x95, 0x01, 0x51, 0xFF, 0x2D, 0x00, 0xFF, 0xFF, 0x08, 0x00,
-       0xE1, 0xFF, 0x25, 0x00, 0x1D, 0x00, 0x05, 0xFF, 0x28, 0x03, 0xBD,
-       0xF6, 0x77, 0x43, 0xB6, 0x16, 0xDC, 0xF5, 0xDD, 0x05, 0x9B, 0xFC,
-       0xC8, 0x01, 0x3E, 0xFF, 0x33, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0xFD,
-       0xFF, 0xD9, 0xFF, 0xB4, 0x00, 0xFD, 0xFD, 0xD7, 0x04, 0xFA, 0xF3,
-       0xFC, 0x3E, 0x5B, 0x1E, 0xDB, 0xF3, 0xA6, 0x06, 0x4C, 0xFC, 0xE3,
-       0x01, 0x36, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x14, 0x00,
-       0x9B, 0xFF, 0x31, 0x01, 0x2C, 0xFD, 0x15, 0x06, 0x41, 0xF2, 0x6A,
-       0x39, 0x0A, 0x26, 0x61, 0xF2, 0x17, 0x07, 0x31, 0xFC, 0xE2, 0x01,
-       0x3B, 0xFF, 0x35, 0x00, 0xFD, 0xFF, 0xFD, 0xFF, 0x25, 0x00, 0x6A,
-       0xFF, 0x8E, 0x01, 0x99, 0xFC, 0xDB, 0x06, 0x86, 0xF1, 0xF2, 0x32,
-       0x82, 0x2D, 0x96, 0xF1, 0x21, 0x07, 0x53, 0xFC, 0xC0, 0x01, 0x50,
-       0xFF, 0x2E, 0x00, 0xFD, 0xFF, 0xFD, 0xFF, 0x30, 0x00, 0x4A, 0xFF,
-       0xCA, 0x01, 0x46, 0xFC, 0x29, 0x07, 0xB3, 0xF1, 0xD1, 0x2B, 0x81,
-       0x34, 0x9C, 0xF1, 0xB8, 0x06, 0xB5, 0xFC, 0x7C, 0x01, 0x74, 0xFF,
-       0x22, 0x00, 0xFE, 0xFF, 0xFD, 0xFF, 0x36, 0x00, 0x39, 0xFF, 0xE5,
-       0x01, 0x32, 0xFC, 0x06, 0x07, 0xAA, 0xF2, 0x46, 0x24, 0xC8, 0x3A,
-       0x90, 0xF2, 0xD6, 0x05, 0x57, 0xFD, 0x17, 0x01, 0xA8, 0xFF, 0x0F,
-       0x00, 0x00, 0x00, 0xFE, 0xFF, 0x36, 0x00, 0x37, 0xFF, 0xDF, 0x01,
-       0x5A, 0xFC, 0x7E, 0x06, 0x47, 0xF4, 0x94, 0x1C, 0x1F, 0x40, 0x85,
-       0xF4, 0x7D, 0x04, 0x36, 0xFE, 0x93, 0x00, 0xEA, 0xFF, 0xF7, 0xFF,
-       0x04, 0x00, 0xFF, 0xFF, 0x32, 0x00, 0x42, 0xFF, 0xBE, 0x01, 0xB4,
-       0xFC, 0xA4, 0x05, 0x61, 0xF6, 0xFB, 0x14, 0x53, 0x44, 0x86, 0xF7,
-       0xB6, 0x02, 0x49, 0xFF, 0xF7, 0xFF, 0x37, 0x00, 0xD9, 0xFF, 0x0A,
-       0x00, 0x00, 0x00, 0x2B, 0x00, 0x57, 0xFF, 0x86, 0x01, 0x36, 0xFD,
-       0x89, 0x04, 0xCD, 0xF8, 0xB7, 0x0D, 0x3D, 0x47, 0x91, 0xFB, 0x91,
-       0x00, 0x83, 0x00, 0x4A, 0xFF, 0x8C, 0x00, 0xB9, 0xFF, 0x11, 0x00,
-       0x00, 0x00, 0x23, 0x00, 0x73, 0xFF, 0x3D, 0x01, 0xD6, 0xFD, 0x46,
-       0x03, 0x61, 0xFB, 0x00, 0x07, 0xBF, 0x48, 0x98, 0x00, 0x26, 0xFE,
-       0xD5, 0x01, 0x95, 0xFE, 0xE3, 0x00, 0x96, 0xFF, 0x1A, 0x00, 0x1A,
-       0x00, 0x94, 0xFF, 0xEA, 0x00, 0x87, 0xFE, 0xF0, 0x01, 0xF5, 0xFD,
-       0x05, 0x01, 0xCE, 0x48, 0x83, 0x06, 0x94, 0xFB, 0x2C, 0x03, 0xE4,
-       0xFD, 0x37, 0x01, 0x76, 0xFF, 0x22, 0x00, 0x00, 0x00, 0x12, 0x00,
-       0xB6, 0xFF, 0x93, 0x00, 0x3C, 0xFF, 0x9D, 0x00, 0x63, 0x00, 0xEB,
-       0xFB, 0x69, 0x47, 0x2D, 0x0D, 0xFF, 0xF8, 0x72, 0x04, 0x42, 0xFD,
-       0x81, 0x01, 0x59, 0xFF, 0x2B, 0x00, 0x00, 0x00, 0x0A, 0x00, 0xD7,
-       0xFF, 0x3E, 0x00, 0xEA, 0xFF, 0x60, 0xFF, 0x8F, 0x02, 0xCD, 0xF7,
-       0x99, 0x44, 0x68, 0x14, 0x8E, 0xF6, 0x90, 0x05, 0xBC, 0xFC, 0xBA,
-       0x01, 0x43, 0xFF, 0x32, 0x00, 0xFF, 0xFF, 0x04, 0x00, 0xF5, 0xFF,
-       0xEF, 0xFF, 0x88, 0x00, 0x49, 0xFE, 0x5D, 0x04, 0xB7, 0xF4, 0x7D,
-       0x40, 0xFD, 0x1B, 0x6C, 0xF4, 0x70, 0x06, 0x5F, 0xFC, 0xDE, 0x01,
-       0x37, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x0E, 0x00, 0xAC,
-       0xFF, 0x0E, 0x01, 0x66, 0xFD, 0xBF, 0x05, 0xAD, 0xF2, 0x3B, 0x3B,
-       0xB0, 0x23, 0xC4, 0xF2, 0xFF, 0x06, 0x33, 0xFC, 0xE5, 0x01, 0x38,
-       0xFF, 0x36, 0x00, 0xFD, 0xFF, 0xFE, 0xFF, 0x21, 0x00, 0x77, 0xFF,
-       0x75, 0x01, 0xBF, 0xFC, 0xAB, 0x06, 0xA6, 0xF1, 0x05, 0x35, 0x40,
-       0x2B, 0xBF, 0xF1, 0x2A, 0x07, 0x42, 0xFC, 0xCE, 0x01, 0x48, 0xFF,
-       0x31, 0x00, 0xFD, 0xFF, 0xFD, 0xFF, 0x2E, 0x00, 0x52, 0xFF, 0xBC,
-       0x01, 0x58, 0xFC, 0x1D, 0x07, 0x8E, 0xF1, 0x11, 0x2E, 0x6B, 0x32,
-       0x81, 0xF1, 0xE5, 0x06, 0x90, 0xFC, 0x94, 0x01, 0x67, 0xFF, 0x26,
-       0x00, 0xFD, 0xFF, 0xFD, 0xFF, 0x35, 0x00, 0x3C, 0xFF, 0xE0, 0x01,
-       0x32, 0xFC, 0x1C, 0x07, 0x4B, 0xF2, 0xA0, 0x26, 0xF2, 0x38, 0x2A,
-       0xF2, 0x28, 0x06, 0x1F, 0xFD, 0x39, 0x01, 0x96, 0xFF, 0x16, 0x00,
-       0xFF, 0xFF, 0xFE, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE4, 0x01, 0x48,
-       0xFC, 0xB2, 0x06, 0xB9, 0xF3, 0xF3, 0x1E, 0x98, 0x3E, 0xCF, 0xF3,
-       0xF3, 0x04, 0xEB, 0xFD, 0xBF, 0x00, 0xD4, 0xFF, 0xFF, 0xFF, 0x03,
-       0x00, 0xFE, 0xFF, 0x34, 0x00, 0x3D, 0xFF, 0xCB, 0x01, 0x93, 0xFC,
-       0xEF, 0x05, 0xB0, 0xF5, 0x4B, 0x17, 0x2A, 0x43, 0x7D, 0xF6, 0x4D,
-       0x03, 0xEF, 0xFE, 0x2A, 0x00, 0x1E, 0x00, 0xE3, 0xFF, 0x08, 0x00,
-       0xFF, 0xFF, 0x2E, 0x00, 0x4F, 0xFF, 0x99, 0x01, 0x0B, 0xFD, 0xE6,
-       0x04, 0x08, 0xF8, 0xE7, 0x0F, 0x7C, 0x46, 0x37, 0xFA, 0x42, 0x01,
-       0x1F, 0x00, 0x81, 0xFF, 0x71, 0x00, 0xC3, 0xFF, 0x0F, 0x00, 0x00,
-       0x00, 0x26, 0x00, 0x6A, 0xFF, 0x55, 0x01, 0xA3, 0xFD, 0xAD, 0x03,
-       0x94, 0xFA, 0xFF, 0x08, 0x70, 0x48, 0xF3, 0xFE, 0xEA, 0xFE, 0x6C,
-       0x01, 0xCD, 0xFE, 0xC9, 0x00, 0xA1, 0xFF, 0x17, 0x00, 0x1D, 0x00,
-       0x8A, 0xFF, 0x04, 0x01, 0x50, 0xFE, 0x5A, 0x02, 0x2C, 0xFD, 0xC6,
-       0x02, 0xF2, 0x48, 0x9B, 0x04, 0x61, 0xFC, 0xC3, 0x02, 0x19, 0xFE,
-       0x1E, 0x01, 0x7F, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0xAC,
-       0xFF, 0xAE, 0x00, 0x05, 0xFF, 0x03, 0x01, 0xAA, 0xFF, 0x63, 0xFD,
-       0xFD, 0x47, 0x0E, 0x0B, 0xC8, 0xF9, 0x11, 0x04, 0x71, 0xFD, 0x6C,
-       0x01, 0x61, 0xFF, 0x28, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xCD, 0xFF,
-       0x57, 0x00, 0xB6, 0xFF, 0xBE, 0xFF, 0xED, 0x01, 0xF5, 0xF8, 0x9B,
-       0x45, 0x22, 0x12, 0x48, 0xF7, 0x3D, 0x05, 0xE2, 0xFC, 0xAB, 0x01,
-       0x49, 0xFF, 0x30, 0x00, 0xFF, 0xFF, 0x06, 0x00, 0xEC, 0xFF, 0x06,
-       0x00, 0x5A, 0x00, 0x9A, 0xFE, 0xDA, 0x03, 0x8D, 0xF5, 0xE1, 0x41,
-       0xA1, 0x19, 0x09, 0xF5, 0x33, 0x06, 0x77, 0xFC, 0xD6, 0x01, 0x3A,
-       0xFF, 0x35, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x07, 0x00, 0xC0, 0xFF,
-       0xE8, 0x00, 0xA6, 0xFD, 0x5F, 0x05, 0x31, 0xF3, 0xF6, 0x3C, 0x52,
-       0x21, 0x37, 0xF3, 0xDD, 0x06, 0x3B, 0xFC, 0xE6, 0x01, 0x36, 0xFF,
-       0x36, 0x00, 0xFD, 0xFF, 0xFE, 0xFF, 0x1C, 0x00, 0x86, 0xFF, 0x59,
-       0x01, 0xEC, 0xFC, 0x6F, 0x06, 0xDC, 0xF1, 0x04, 0x37, 0xF3, 0x28,
-       0xFC, 0xF1, 0x28, 0x07, 0x37, 0xFC, 0xD8, 0x01, 0x41, 0xFF, 0x33,
-       0x00, 0xFD, 0xFF, 0xFD, 0xFF, 0x2A, 0x00, 0x5C, 0xFF, 0xAA, 0x01,
-       0x71, 0xFC, 0x07, 0x07, 0x7E, 0xF1, 0x44, 0x30, 0x44, 0x30, 0x7E,
-       0xF1, 0x07, 0x07, 0x71, 0xFC, 0xAA, 0x01, 0x5C, 0xFF, 0x2A, 0x00,
-       0xFD, 0xFF, 0xFD, 0xFF, 0x33, 0x00, 0x41, 0xFF, 0xD8, 0x01, 0x37,
-       0xFC, 0x28, 0x07, 0xFC, 0xF1, 0xF3, 0x28, 0x04, 0x37, 0xDC, 0xF1,
-       0x6F, 0x06, 0xEC, 0xFC, 0x59, 0x01, 0x86, 0xFF, 0x1C, 0x00, 0xFE,
-       0xFF, 0xFD, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE6, 0x01, 0x3B, 0xFC,
-       0xDD, 0x06, 0x37, 0xF3, 0x52, 0x21, 0xF6, 0x3C, 0x31, 0xF3, 0x5F,
-       0x05, 0xA6, 0xFD, 0xE8, 0x00, 0xC0, 0xFF, 0x07, 0x00, 0x01, 0x00,
-       0xFE, 0xFF, 0x35, 0x00, 0x3A, 0xFF, 0xD6, 0x01, 0x77, 0xFC, 0x33,
-       0x06, 0x09, 0xF5, 0xA1, 0x19, 0xE1, 0x41, 0x8D, 0xF5, 0xDA, 0x03,
-       0x9A, 0xFE, 0x5A, 0x00, 0x06, 0x00, 0xEC, 0xFF, 0x06, 0x00, 0xFF,
-       0xFF, 0x30, 0x00, 0x49, 0xFF, 0xAB, 0x01, 0xE2, 0xFC, 0x3D, 0x05,
-       0x48, 0xF7, 0x22, 0x12, 0x9B, 0x45, 0xF5, 0xF8, 0xED, 0x01, 0xBE,
-       0xFF, 0xB6, 0xFF, 0x57, 0x00, 0xCD, 0xFF, 0x0C, 0x00, 0x00, 0x00,
-       0x28, 0x00, 0x61, 0xFF, 0x6C, 0x01, 0x71, 0xFD, 0x11, 0x04, 0xC8,
-       0xF9, 0x0E, 0x0B, 0xFD, 0x47, 0x63, 0xFD, 0xAA, 0xFF, 0x03, 0x01,
-       0x05, 0xFF, 0xAE, 0x00, 0xAC, 0xFF, 0x14, 0x00, 0x00, 0x00, 0x20,
-       0x00, 0x7F, 0xFF, 0x1E, 0x01, 0x19, 0xFE, 0xC3, 0x02, 0x61, 0xFC,
-       0x9B, 0x04, 0xF2, 0x48, 0xC6, 0x02, 0x2C, 0xFD, 0x5A, 0x02, 0x50,
-       0xFE, 0x04, 0x01, 0x8A, 0xFF, 0x1D, 0x00, 0x17, 0x00, 0xA1, 0xFF,
-       0xC9, 0x00, 0xCD, 0xFE, 0x6C, 0x01, 0xEA, 0xFE, 0xF3, 0xFE, 0x70,
-       0x48, 0xFF, 0x08, 0x94, 0xFA, 0xAD, 0x03, 0xA3, 0xFD, 0x55, 0x01,
-       0x6A, 0xFF, 0x26, 0x00, 0x00, 0x00, 0x0F, 0x00, 0xC3, 0xFF, 0x71,
-       0x00, 0x81, 0xFF, 0x1F, 0x00, 0x42, 0x01, 0x37, 0xFA, 0x7C, 0x46,
-       0xE7, 0x0F, 0x08, 0xF8, 0xE6, 0x04, 0x0B, 0xFD, 0x99, 0x01, 0x4F,
-       0xFF, 0x2E, 0x00, 0xFF, 0xFF, 0x08, 0x00, 0xE3, 0xFF, 0x1E, 0x00,
-       0x2A, 0x00, 0xEF, 0xFE, 0x4D, 0x03, 0x7D, 0xF6, 0x2A, 0x43, 0x4B,
-       0x17, 0xB0, 0xF5, 0xEF, 0x05, 0x93, 0xFC, 0xCB, 0x01, 0x3D, 0xFF,
-       0x34, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0xFF, 0xFF, 0xD4, 0xFF, 0xBF,
-       0x00, 0xEB, 0xFD, 0xF3, 0x04, 0xCF, 0xF3, 0x98, 0x3E, 0xF3, 0x1E,
-       0xB9, 0xF3, 0xB2, 0x06, 0x48, 0xFC, 0xE4, 0x01, 0x36, 0xFF, 0x36,
-       0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x16, 0x00, 0x96, 0xFF, 0x39, 0x01,
-       0x1F, 0xFD, 0x28, 0x06, 0x2A, 0xF2, 0xF2, 0x38, 0xA0, 0x26, 0x4B,
-       0xF2, 0x1C, 0x07, 0x32, 0xFC, 0xE0, 0x01, 0x3C, 0xFF, 0x35, 0x00,
-       0xFD, 0xFF, 0xFD, 0xFF, 0x26, 0x00, 0x67, 0xFF, 0x94, 0x01, 0x90,
-       0xFC, 0xE5, 0x06, 0x81, 0xF1, 0x6B, 0x32, 0x11, 0x2E, 0x8E, 0xF1,
-       0x1D, 0x07, 0x58, 0xFC, 0xBC, 0x01, 0x52, 0xFF, 0x2E, 0x00, 0xFD,
-       0xFF, 0xFD, 0xFF, 0x31, 0x00, 0x48, 0xFF, 0xCE, 0x01, 0x42, 0xFC,
-       0x2A, 0x07, 0xBF, 0xF1, 0x40, 0x2B, 0x05, 0x35, 0xA6, 0xF1, 0xAB,
-       0x06, 0xBF, 0xFC, 0x75, 0x01, 0x77, 0xFF, 0x21, 0x00, 0xFE, 0xFF,
-       0xFD, 0xFF, 0x36, 0x00, 0x38, 0xFF, 0xE5, 0x01, 0x33, 0xFC, 0xFF,
-       0x06, 0xC4, 0xF2, 0xB0, 0x23, 0x3B, 0x3B, 0xAD, 0xF2, 0xBF, 0x05,
-       0x66, 0xFD, 0x0E, 0x01, 0xAC, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0xFE,
-       0xFF, 0x36, 0x00, 0x37, 0xFF, 0xDE, 0x01, 0x5F, 0xFC, 0x70, 0x06,
-       0x6C, 0xF4, 0xFD, 0x1B, 0x7D, 0x40, 0xB7, 0xF4, 0x5D, 0x04, 0x49,
-       0xFE, 0x88, 0x00, 0xEF, 0xFF, 0xF5, 0xFF, 0x04, 0x00, 0xFF, 0xFF,
-       0x32, 0x00, 0x43, 0xFF, 0xBA, 0x01, 0xBC, 0xFC, 0x90, 0x05, 0x8E,
-       0xF6, 0x68, 0x14, 0x99, 0x44, 0xCD, 0xF7, 0x8F, 0x02, 0x60, 0xFF,
-       0xEA, 0xFF, 0x3E, 0x00, 0xD7, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0x2B,
-       0x00, 0x59, 0xFF, 0x81, 0x01, 0x42, 0xFD, 0x72, 0x04, 0xFF, 0xF8,
-       0x2D, 0x0D, 0x69, 0x47, 0xEB, 0xFB, 0x63, 0x00, 0x9D, 0x00, 0x3C,
-       0xFF, 0x93, 0x00, 0xB6, 0xFF, 0x12, 0x00, 0x00, 0x00, 0x22, 0x00,
-       0x76, 0xFF, 0x37, 0x01, 0xE4, 0xFD, 0x2C, 0x03, 0x94, 0xFB, 0x83,
-       0x06, 0xCE, 0x48, 0x05, 0x01, 0xF5, 0xFD, 0xF0, 0x01, 0x87, 0xFE,
-       0xEA, 0x00, 0x94, 0xFF, 0x1A, 0x00, 0x1A, 0x00, 0x96, 0xFF, 0xE3,
-       0x00, 0x95, 0xFE, 0xD5, 0x01, 0x26, 0xFE, 0x98, 0x00, 0xBF, 0x48,
-       0x00, 0x07, 0x61, 0xFB, 0x46, 0x03, 0xD6, 0xFD, 0x3D, 0x01, 0x73,
-       0xFF, 0x23, 0x00, 0x00, 0x00, 0x11, 0x00, 0xB9, 0xFF, 0x8C, 0x00,
-       0x4A, 0xFF, 0x83, 0x00, 0x91, 0x00, 0x91, 0xFB, 0x3D, 0x47, 0xB7,
-       0x0D, 0xCD, 0xF8, 0x89, 0x04, 0x36, 0xFD, 0x86, 0x01, 0x57, 0xFF,
-       0x2B, 0x00, 0x00, 0x00, 0x0A, 0x00, 0xD9, 0xFF, 0x37, 0x00, 0xF7,
-       0xFF, 0x49, 0xFF, 0xB6, 0x02, 0x86, 0xF7, 0x53, 0x44, 0xFB, 0x14,
-       0x61, 0xF6, 0xA4, 0x05, 0xB4, 0xFC, 0xBE, 0x01, 0x42, 0xFF, 0x32,
-       0x00, 0xFF, 0xFF, 0x04, 0x00, 0xF7, 0xFF, 0xEA, 0xFF, 0x93, 0x00,
-       0x36, 0xFE, 0x7D, 0x04, 0x85, 0xF4, 0x1F, 0x40, 0x94, 0x1C, 0x47,
-       0xF4, 0x7E, 0x06, 0x5A, 0xFC, 0xDF, 0x01, 0x37, 0xFF, 0x36, 0x00,
-       0xFE, 0xFF, 0x00, 0x00, 0x0F, 0x00, 0xA8, 0xFF, 0x17, 0x01, 0x57,
-       0xFD, 0xD6, 0x05, 0x90, 0xF2, 0xC8, 0x3A, 0x46, 0x24, 0xAA, 0xF2,
-       0x06, 0x07, 0x32, 0xFC, 0xE5, 0x01, 0x39, 0xFF, 0x36, 0x00, 0xFD,
-       0xFF, 0xFE, 0xFF, 0x22, 0x00, 0x74, 0xFF, 0x7C, 0x01, 0xB5, 0xFC,
-       0xB8, 0x06, 0x9C, 0xF1, 0x81, 0x34, 0xD1, 0x2B, 0xB3, 0xF1, 0x29,
-       0x07, 0x46, 0xFC, 0xCA, 0x01, 0x4A, 0xFF, 0x30, 0x00, 0xFD, 0xFF,
-       0xFD, 0xFF, 0x2E, 0x00, 0x50, 0xFF, 0xC0, 0x01, 0x53, 0xFC, 0x21,
-       0x07, 0x96, 0xF1, 0x82, 0x2D, 0xF2, 0x32, 0x86, 0xF1, 0xDB, 0x06,
-       0x99, 0xFC, 0x8E, 0x01, 0x6A, 0xFF, 0x25, 0x00, 0xFD, 0xFF, 0xFD,
-       0xFF, 0x35, 0x00, 0x3B, 0xFF, 0xE2, 0x01, 0x31, 0xFC, 0x17, 0x07,
-       0x61, 0xF2, 0x0A, 0x26, 0x6A, 0x39, 0x41, 0xF2, 0x15, 0x06, 0x2C,
-       0xFD, 0x31, 0x01, 0x9B, 0xFF, 0x14, 0x00, 0xFF, 0xFF, 0xFE, 0xFF,
-       0x36, 0x00, 0x36, 0xFF, 0xE3, 0x01, 0x4C, 0xFC, 0xA6, 0x06, 0xDB,
-       0xF3, 0x5B, 0x1E, 0xFC, 0x3E, 0xFA, 0xF3, 0xD7, 0x04, 0xFD, 0xFD,
-       0xB4, 0x00, 0xD9, 0xFF, 0xFD, 0xFF, 0x03, 0x00, 0xFF, 0xFF, 0x33,
-       0x00, 0x3E, 0xFF, 0xC8, 0x01, 0x9B, 0xFC, 0xDD, 0x05, 0xDC, 0xF5,
-       0xB6, 0x16, 0x77, 0x43, 0xBD, 0xF6, 0x28, 0x03, 0x05, 0xFF, 0x1D,
-       0x00, 0x25, 0x00, 0xE1, 0xFF, 0x08, 0x00, 0xFF, 0xFF, 0x2D, 0x00,
-       0x51, 0xFF, 0x95, 0x01, 0x15, 0xFD, 0xCF, 0x04, 0x39, 0xF8, 0x59,
-       0x0F, 0xAF, 0x46, 0x8B, 0xFA, 0x17, 0x01, 0x38, 0x00, 0x73, 0xFF,
-       0x78, 0x00, 0xC0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x25, 0x00, 0x6C,
-       0xFF, 0x4F, 0x01, 0xB0, 0xFD, 0x93, 0x03, 0xC7, 0xFA, 0x7D, 0x08,
-       0x86, 0x48, 0x5A, 0xFF, 0xBA, 0xFE, 0x86, 0x01, 0xBF, 0xFE, 0xCF,
-       0x00, 0x9E, 0xFF, 0x17, 0x00, 0x1C, 0x00, 0x8C, 0xFF, 0xFE, 0x00,
-       0x5D, 0xFE, 0x3F, 0x02, 0x5E, 0xFD, 0x54, 0x02, 0xEC, 0x48, 0x13,
-       0x05, 0x2E, 0xFC, 0xDE, 0x02, 0x0C, 0xFE, 0x24, 0x01, 0x7D, 0xFF,
-       0x20, 0x00, 0x00, 0x00, 0x14, 0x00, 0xAE, 0xFF, 0xA7, 0x00, 0x12,
-       0xFF, 0xEA, 0x00, 0xD9, 0xFF, 0x03, 0xFD, 0xDC, 0x47, 0x95, 0x0B,
-       0x96, 0xF9, 0x29, 0x04, 0x65, 0xFD, 0x71, 0x01, 0x5F, 0xFF, 0x29,
-       0x00, 0x00, 0x00, 0x0C, 0x00, 0xD0, 0xFF, 0x51, 0x00, 0xC3, 0xFF,
-       0xA6, 0xFF, 0x16, 0x02, 0xA9, 0xF8, 0x5C, 0x45, 0xB2, 0x12, 0x19,
-       0xF7, 0x52, 0x05, 0xD8, 0xFC, 0xAF, 0x01, 0x47, 0xFF, 0x30, 0x00,
-       0xFF, 0xFF, 0x06, 0x00, 0xEE, 0xFF, 0x01, 0x00, 0x66, 0x00, 0x85,
-       0xFE, 0xFC, 0x03, 0x55, 0xF5, 0x8C, 0x41, 0x38, 0x1A, 0xE1, 0xF4,
-       0x43, 0x06, 0x70, 0xFC, 0xD8, 0x01, 0x39, 0xFF, 0x35, 0x00, 0xFE,
-       0xFF, 0x01, 0x00, 0x08, 0x00, 0xBB, 0xFF, 0xF1, 0x00, 0x96, 0xFD,
-       0x78, 0x05, 0x0E, 0xF3, 0x8A, 0x3C, 0xEA, 0x21, 0x19, 0xF3, 0xE6,
-       0x06, 0x38, 0xFC, 0xE6, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFD, 0xFF,
-       0xFE, 0xFF, 0x1D, 0x00, 0x82, 0xFF, 0x60, 0x01, 0xE0, 0xFC, 0x7F,
-       0x06, 0xCC, 0xF1, 0x85, 0x36, 0x87, 0x29, 0xEB, 0xF1, 0x2A, 0x07,
-       0x39, 0xFC, 0xD6, 0x01, 0x43, 0xFF, 0x33, 0x00, 0xFD, 0xFF, 0xFD,
-       0xFF, 0x2B, 0x00, 0x59, 0xFF, 0xAE, 0x01, 0x6A, 0xFC, 0x0D, 0x07,
-       0x80, 0xF1, 0xB8, 0x2F, 0xCF, 0x30, 0x7D, 0xF1, 0xFF, 0x06, 0x78,
-       0xFC, 0xA5, 0x01, 0x5F, 0xFF, 0x29, 0x00, 0xFD, 0xFF, 0xFD, 0xFF,
-       0x34, 0x00, 0x40, 0xFF, 0xDB, 0x01, 0x35, 0xFC, 0x26, 0x07, 0x0E,
-       0xF2, 0x60, 0x28, 0x82, 0x37, 0xED, 0xF1, 0x5E, 0x06, 0xF8, 0xFC,
-       0x51, 0x01, 0x8A, 0xFF, 0x1A, 0x00, 0xFF, 0xFF, 0xFD, 0xFF, 0x36,
-       0x00, 0x36, 0xFF, 0xE6, 0x01, 0x3E, 0xFC, 0xD3, 0x06, 0x56, 0xF3,
-       0xBA, 0x20, 0x61, 0x3D, 0x56, 0xF3, 0x45, 0x05, 0xB7, 0xFD, 0xDE,
-       0x00, 0xC5, 0xFF, 0x05, 0x00, 0x02, 0x00, 0xFE, 0xFF, 0x35, 0x00,
-       0x3A, 0xFF, 0xD3, 0x01, 0x7D, 0xFC, 0x23, 0x06, 0x32, 0xF5, 0x0C,
-       0x19, 0x38, 0x42, 0xC7, 0xF5, 0xB8, 0x03, 0xAF, 0xFE, 0x4E, 0x00,
-       0x0C, 0x00, 0xEA, 0xFF, 0x06, 0x00, 0xFF, 0xFF, 0x2F, 0x00, 0x4A,
-       0xFF, 0xA7, 0x01, 0xEC, 0xFC, 0x28, 0x05, 0x77, 0xF7, 0x92, 0x11,
-       0xD7, 0x45, 0x43, 0xF9, 0xC3, 0x01, 0xD6, 0xFF, 0xA9, 0xFF, 0x5E,
-       0x00, 0xCB, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0x28, 0x00, 0x63, 0xFF,
-       0x66, 0x01, 0x7D, 0xFD, 0xF8, 0x03, 0xFB, 0xF9, 0x89, 0x0A, 0x1D,
-       0x48, 0xC5, 0xFD, 0x7A, 0xFF, 0x1D, 0x01, 0xF7, 0xFE, 0xB4, 0x00,
-       0xA9, 0xFF, 0x15, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x82, 0xFF, 0x18,
-       0x01, 0x27, 0xFE, 0xA9, 0x02, 0x94, 0xFC, 0x24, 0x04, 0xF5, 0x48,
-       0x39, 0x03, 0xF9, 0xFC, 0x74, 0x02, 0x42, 0xFE, 0x0B, 0x01, 0x87,
-       0xFF, 0x1E, 0x00, 0x16, 0x00, 0xA4, 0xFF, 0xC2, 0x00, 0xDB, 0xFE,
-       0x52, 0x01, 0x1B, 0xFF, 0x8D, 0xFE, 0x57, 0x48, 0x81, 0x09, 0x61,
-       0xFA, 0xC6, 0x03, 0x96, 0xFD, 0x5B, 0x01, 0x68, 0xFF, 0x26, 0x00,
-       0x00, 0x00, 0x0E, 0x00, 0xC6, 0xFF, 0x6B, 0x00, 0x8E, 0xFF, 0x06,
-       0x00, 0x6E, 0x01, 0xE4, 0xF9, 0x48, 0x46, 0x75, 0x10, 0xD7, 0xF7,
-       0xFC, 0x04, 0x00, 0xFD, 0x9E, 0x01, 0x4E, 0xFF, 0x2E, 0x00, 0xFF,
-       0xFF, 0x07, 0x00, 0xE5, 0xFF, 0x18, 0x00, 0x36, 0x00, 0xD9, 0xFE,
-       0x71, 0x03, 0x3F, 0xF6, 0xDB, 0x42, 0xE0, 0x17, 0x86, 0xF5, 0x00,
-       0x06, 0x8C, 0xFC, 0xCE, 0x01, 0x3C, 0xFF, 0x34, 0x00, 0xFE, 0xFF,
-       0x02, 0x00, 0x01, 0x00, 0xCF, 0xFF, 0xC9, 0x00, 0xDA, 0xFD, 0x0F,
-       0x05, 0xA5, 0xF3, 0x31, 0x3E, 0x8A, 0x1F, 0x97, 0xF3, 0xBD, 0x06,
-       0x44, 0xFC, 0xE5, 0x01, 0x36, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0xFF,
-       0xFF, 0x17, 0x00, 0x92, 0xFF, 0x41, 0x01, 0x11, 0xFD, 0x3B, 0x06,
-       0x14, 0xF2, 0x78, 0x38, 0x36, 0x27, 0x35, 0xF2, 0x20, 0x07, 0x33,
-       0xFC, 0xDF, 0x01, 0x3E, 0xFF, 0x34, 0x00, 0xFD, 0xFF, 0xFD, 0xFF,
-       0x28, 0x00, 0x64, 0xFF, 0x9A, 0x01, 0x88, 0xFC, 0xEE, 0x06, 0x7E,
-       0xF1, 0xE3, 0x31, 0x9F, 0x2E, 0x88, 0xF1, 0x19, 0x07, 0x5E, 0xFC,
-       0xB7, 0x01, 0x54, 0xFF, 0x2D, 0x00, 0xFD, 0xFF, 0xFD, 0xFF, 0x32,
-       0x00, 0x46, 0xFF, 0xD1, 0x01, 0x3F, 0xFC, 0x2B, 0x07, 0xCD, 0xF1,
-       0xAE, 0x2A, 0x86, 0x35, 0xB1, 0xF1, 0x9D, 0x06, 0xCA, 0xFC, 0x6E,
-       0x01, 0x7B, 0xFF, 0x20, 0x00, 0xFE, 0xFF, 0xFD, 0xFF, 0x36, 0x00,
-       0x38, 0xFF, 0xE6, 0x01, 0x35, 0xFC, 0xF7, 0x06, 0xE0, 0xF2, 0x18,
-       0x23, 0xAB, 0x3B, 0xCC, 0xF2, 0xA8, 0x05, 0x76, 0xFD, 0x04, 0x01,
-       0xB1, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x36, 0x00, 0x38,
-       0xFF, 0xDC, 0x01, 0x64, 0xFC, 0x62, 0x06, 0x93, 0xF4, 0x66, 0x1B,
-       0xD9, 0x40, 0xEA, 0xF4, 0x3E, 0x04, 0x5D, 0xFE, 0x7D, 0x00, 0xF5,
-       0xFF, 0xF3, 0xFF, 0x05, 0x00, 0xFF, 0xFF, 0x31, 0x00, 0x44, 0xFF,
-       0xB7, 0x01, 0xC5, 0xFC, 0x7C, 0x05, 0xBC, 0xF6, 0xD5, 0x13, 0xDC,
-       0x44, 0x14, 0xF8, 0x67, 0x02, 0x77, 0xFF, 0xDD, 0xFF, 0x44, 0x00,
-       0xD5, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x5B, 0xFF, 0x7C,
-       0x01, 0x4E, 0xFD, 0x5A, 0x04, 0x31, 0xF9, 0xA4, 0x0C, 0x90, 0x47,
-       0x47, 0xFC, 0x36, 0x00, 0xB6, 0x00, 0x2E, 0xFF, 0x99, 0x00, 0xB3,
-       0xFF, 0x12, 0x00, 0x00, 0x00, 0x22, 0x00, 0x78, 0xFF, 0x31, 0x01,
-       0xF1, 0xFD, 0x12, 0x03, 0xC7, 0xFB, 0x07, 0x06, 0xDB, 0x48, 0x73,
-       0x01, 0xC3, 0xFD, 0x0A, 0x02, 0x79, 0xFE, 0xF1, 0x00, 0x91, 0xFF,
-       0x1B, 0x00, 0x19, 0x00, 0x99, 0xFF, 0xDD, 0x00, 0xA3, 0xFE, 0xBB,
-       0x01, 0x58, 0xFE, 0x2D, 0x00, 0xAF, 0x48, 0x7E, 0x07, 0x2E, 0xFB,
-       0x60, 0x03, 0xC9, 0xFD, 0x43, 0x01, 0x71, 0xFF, 0x24, 0x00, 0x00,
-       0x00, 0x10, 0x00, 0xBB, 0xFF, 0x85, 0x00, 0x58, 0xFF, 0x6A, 0x00,
-       0xBE, 0x00, 0x38, 0xFB, 0x0F, 0x47, 0x42, 0x0E, 0x9B, 0xF8, 0xA1,
-       0x04, 0x2B, 0xFD, 0x8B, 0x01, 0x55, 0xFF, 0x2C, 0x00, 0xFF, 0xFF,
-       0x09, 0x00, 0xDC, 0xFF, 0x31, 0x00, 0x04, 0x00, 0x32, 0xFF, 0xDC,
-       0x02, 0x42, 0xF7, 0x0B, 0x44, 0x8E, 0x15, 0x34, 0xF6, 0xB7, 0x05,
-       0xAB, 0xFC, 0xC1, 0x01, 0x40, 0xFF, 0x33, 0x00, 0xFF, 0xFF, 0x04,
-       0x00, 0xF9, 0xFF, 0xE4, 0xFF, 0x9F, 0x00, 0x23, 0xFE, 0x9B, 0x04,
-       0x55, 0xF4, 0xC0, 0x3F, 0x2C, 0x1D, 0x22, 0xF4, 0x8C, 0x06, 0x55,
-       0xFC, 0xE1, 0x01, 0x37, 0xFF, 0x36, 0x00, 0xFE, 0xFF, 0x00, 0x00,
-       0x11, 0x00, 0xA3, 0xFF, 0x20, 0x01, 0x49, 0xFD, 0xEB, 0x05, 0x74,
-       0xF2, 0x54, 0x3A, 0xDD, 0x24, 0x91, 0xF2, 0x0C, 0x07, 0x32, 0xFC,
-       0xE4, 0x01, 0x3A, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0xFE, 0xFF, 0x23,
-       0x00, 0x71, 0xFF, 0x82, 0x01, 0xAB, 0xFC, 0xC4, 0x06, 0x93, 0xF1,
-       0xFD, 0x33, 0x62, 0x2C, 0xA8, 0xF1, 0x27, 0x07, 0x4A, 0xFC, 0xC7,
-       0x01, 0x4C, 0xFF, 0x30, 0x00, 0xFD, 0xFF, 0xFD, 0xFF, 0x2F, 0x00,
-       0x4E, 0xFF, 0xC3, 0x01, 0x4E, 0xFC, 0x24, 0x07, 0x9E, 0xF1, 0xF2,
-       0x2C, 0x78, 0x33, 0x8C, 0xF1, 0xD0, 0x06, 0xA2, 0xFC, 0x88, 0x01,
-       0x6D, 0xFF, 0x24, 0x00, 0xFD, 0xFF, 0xFD, 0xFF, 0x35, 0x00, 0x3B,
-       0xFF, 0xE3, 0x01, 0x31, 0xFC, 0x12, 0x07, 0x79, 0xF2, 0x73, 0x25,
-       0xDF, 0x39, 0x5A, 0xF2, 0x00, 0x06, 0x3A, 0xFD, 0x28, 0x01, 0x9F,
-       0xFF, 0x13, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x36, 0x00, 0x36, 0xFF,
-       0xE2, 0x01, 0x50, 0xFC, 0x99, 0x06, 0xFE, 0xF3, 0xC3, 0x1D, 0x5E,
-       0x3F, 0x27, 0xF4, 0xB9, 0x04, 0x10, 0xFE, 0xA9, 0x00, 0xDF, 0xFF,
-       0xFB, 0xFF, 0x03, 0x00, 0xFF, 0xFF, 0x33, 0x00, 0x3F, 0xFF, 0xC5,
-       0x01, 0xA3, 0xFC, 0xCA, 0x05, 0x07, 0xF6, 0x22, 0x16, 0xC3, 0x43,
-       0xFE, 0xF6, 0x02, 0x03, 0x1B, 0xFF, 0x11, 0x00, 0x2B, 0x00, 0xDE,
-       0xFF, 0x09, 0x00, 0xFF, 0xFF, 0x2D, 0x00, 0x53, 0xFF, 0x90, 0x01,
-       0x20, 0xFD, 0xB8, 0x04, 0x6A, 0xF8, 0xCD, 0x0E, 0xE1, 0x46, 0xE1,
-       0xFA, 0xEB, 0x00, 0x51, 0x00, 0x65, 0xFF, 0x7F, 0x00, 0xBE, 0xFF,
-       0x10, 0x00, 0x00, 0x00, 0x24, 0x00, 0x6E, 0xFF, 0x49, 0x01, 0xBC,
-       0xFD, 0x7A, 0x03, 0xFA, 0xFA, 0xFD, 0x07, 0x9C, 0x48, 0xC3, 0xFF,
-       0x89, 0xFE, 0xA1, 0x01, 0xB1, 0xFE, 0xD6, 0x00, 0x9C, 0xFF, 0x18,
-       0x00, 0x1C, 0x00, 0x8F, 0xFF, 0xF7, 0x00, 0x6B, 0xFE, 0x25, 0x02,
-       0x91, 0xFD, 0xE3, 0x01, 0xE5, 0x48, 0x8D, 0x05, 0xFB, 0xFB, 0xF8,
-       0x02, 0xFE, 0xFD, 0x2B, 0x01, 0x7A, 0xFF, 0x21, 0x00, 0x00, 0x00,
-       0x13, 0x00, 0xB1, 0xFF, 0xA0, 0x00, 0x20, 0xFF, 0xD0, 0x00, 0x07,
-       0x00, 0xA4, 0xFC, 0xB6, 0x47, 0x1C, 0x0C, 0x63, 0xF9, 0x42, 0x04,
-       0x59, 0xFD, 0x76, 0x01, 0x5D, 0xFF, 0x2A, 0x00, 0x00, 0x00, 0x0B,
-       0x00, 0xD2, 0xFF, 0x4A, 0x00, 0xD0, 0xFF, 0x8E, 0xFF, 0x3F, 0x02,
-       0x5E, 0xF8, 0x1E, 0x45, 0x44, 0x13, 0xEA, 0xF6, 0x67, 0x05, 0xCF,
-       0xFC, 0xB3, 0x01, 0x46, 0xFF, 0x31, 0x00, 0xFF, 0xFF, 0x05, 0x00,
-       0xF0, 0xFF, 0xFB, 0xFF, 0x71, 0x00, 0x71, 0xFE, 0x1D, 0x04, 0x1F,
-       0xF5, 0x32, 0x41, 0xCE, 0x1A, 0xBA, 0xF4, 0x53, 0x06, 0x6A, 0xFC,
-       0xDA, 0x01, 0x38, 0xFF, 0x35, 0x00, 0xFE, 0xFF, 0x01, 0x00, 0x0A,
-       0x00, 0xB6, 0xFF, 0xFB, 0x00, 0x85, 0xFD, 0x90, 0x05, 0xEC, 0xF2,
-       0x1C, 0x3C, 0x81, 0x22, 0xFC, 0xF2, 0xEF, 0x06, 0x36, 0xFC, 0xE6,
-       0x01, 0x37, 0xFF, 0x36, 0x00, 0xFD, 0xFF, 0xFE, 0xFF, 0x1E, 0x00,
-       0x7F, 0xFF, 0x67, 0x01, 0xD5, 0xFC, 0x8E, 0x06, 0xBE, 0xF1, 0x06,
-       0x36, 0x1A, 0x2A, 0xDC, 0xF1, 0x2A, 0x07, 0x3C, 0xFC, 0xD3, 0x01,
-       0x44, 0xFF, 0x32, 0x00, 0xFD, 0xFF, 0xFD, 0xFF, 0x2C, 0x00, 0x57,
-       0xFF, 0xB3, 0x01, 0x64, 0xFC, 0x13, 0x07, 0x83, 0xF1, 0x2C, 0x2F,
-       0x5A, 0x31, 0x7D, 0xF1, 0xF7, 0x06, 0x80, 0xFC, 0x9F, 0x01, 0x61,
-       0xFF, 0x29, 0x00, 0xFD, 0xFF, 0xFD, 0xFF, 0x34, 0x00, 0x3F, 0xFF,
-       0xDD, 0x01, 0x34, 0xFC, 0x23, 0x07, 0x21, 0xF2, 0xCB, 0x27, 0xFE,
-       0x37, 0x00, 0xF2, 0x4D, 0x06, 0x04, 0xFD, 0x49, 0x01, 0x8E, 0xFF,
-       0x19, 0x00, 0xFF, 0xFF, 0xFD, 0xFF, 0x36, 0x00, 0x36, 0xFF, 0xE6,
-       0x01, 0x41, 0xFC, 0xC8, 0x06, 0x76, 0xF3, 0x22, 0x20, 0xCA, 0x3D,
-       0x7D, 0xF3, 0x2A, 0x05, 0xC8, 0xFD, 0xD4, 0x00, 0xCA, 0xFF, 0x03,
-       0x00, 0x02, 0x00, 0xFE, 0xFF, 0x34, 0x00, 0x3B, 0xFF, 0xD1, 0x01,
-       0x84, 0xFC, 0x12, 0x06, 0x5C, 0xF5, 0x76, 0x18, 0x89, 0x42, 0x02,
-       0xF6, 0x94, 0x03, 0xC4, 0xFE, 0x42, 0x00, 0x12, 0x00, 0xE8, 0xFF,
-       0x07, 0x00, 0xFF, 0xFF, 0x2F, 0x00, 0x4C, 0xFF, 0xA2, 0x01, 0xF6,
-       0xFC, 0x12, 0x05, 0xA7, 0xF7, 0x03, 0x11, 0x10, 0x46, 0x93, 0xF9,
-       0x98, 0x01, 0xEE, 0xFF, 0x9B, 0xFF, 0x64, 0x00, 0xC8, 0xFF, 0x0E,
-       0x00, 0x00, 0x00, 0x27, 0x00, 0x65, 0xFF, 0x60, 0x01, 0x8A, 0xFD,
-       0xDF, 0x03, 0x2E, 0xFA, 0x04, 0x0A, 0x3A, 0x48, 0x28, 0xFE, 0x4B,
-       0xFF, 0x38, 0x01, 0xE9, 0xFE, 0xBB, 0x00, 0xA6, 0xFF, 0x16, 0x00,
-       0x00, 0x00, 0x1E, 0x00, 0x84, 0xFF, 0x11, 0x01, 0x34, 0xFE, 0x8F,
-       0x02, 0xC7, 0xFC, 0xAE, 0x03, 0xF7, 0x48, 0xAE, 0x03, 0xC7, 0xFC,
-       0x8F, 0x02, 0x34, 0xFE, 0x11, 0x01, 0x84, 0xFF, 0x1E, 0x00, 0x00,
-       0x00, 0xF4, 0xFF, 0x1A, 0x00, 0xFF, 0x00, 0x07, 0x03, 0x16, 0x06,
-       0x7C, 0x09, 0x2A, 0x0C, 0x2E, 0x0D, 0x2A, 0x0C, 0x7C, 0x09, 0x16,
-       0x06, 0x07, 0x03, 0xFF, 0x00, 0x1A, 0x00, 0xF4, 0xFF, 0xF2, 0xFF,
-       0xA0, 0xFF, 0x71, 0xFF, 0x71, 0x00, 0x86, 0x03, 0x73, 0x08, 0x88,
-       0x0D, 0x78, 0x10, 0xC9, 0x0F, 0xD5, 0x0B, 0x8B, 0x06, 0x28, 0x02,
-       0xDF, 0xFF, 0x6F, 0xFF, 0xC3, 0xFF, 0xFD, 0xFF, 0x00, 0x00, 0xDC,
-       0xFF, 0x80, 0xFF, 0x9A, 0xFF, 0x46, 0x01, 0x1E, 0x05, 0x5A, 0x0A,
-       0xED, 0x0E, 0xAA, 0x10, 0xAF, 0x0E, 0xFD, 0x09, 0xCB, 0x04, 0x18,
-       0x01, 0x8E, 0xFF, 0x85, 0xFF, 0xE1, 0xFF, 0xFC, 0xFF, 0xBD, 0xFF,
-       0x6D, 0xFF, 0xF6, 0xFF, 0x65, 0x02, 0xE5, 0x06, 0x2B, 0x0C, 0xF3,
-       0x0F, 0x60, 0x10, 0x3B, 0x0D, 0x16, 0x08, 0x3F, 0x03, 0x50, 0x00,
-       0x6E, 0xFF, 0xA7, 0xFF, 0xF5, 0xFF, 0xEF, 0xFF, 0x9A, 0xFF, 0x75,
-       0xFF, 0x91, 0x00, 0xC9, 0x03, 0xC8, 0x08, 0xCC, 0x0D, 0x89, 0x10,
-       0x9F, 0x0F, 0x85, 0x0B, 0x3B, 0x06, 0xF4, 0x01, 0xCD, 0xFF, 0x72,
-       0xFF, 0xC9, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0xD7, 0xFF, 0x7B, 0xFF,
-       0xA5, 0xFF, 0x73, 0x01, 0x6A, 0x05, 0xAD, 0x0A, 0x21, 0x0F, 0xA6,
-       0x10, 0x74, 0x0E, 0xA9, 0x09, 0x83, 0x04, 0xF0, 0x00, 0x85, 0xFF,
-       0x8B, 0xFF, 0xE5, 0xFF, 0xFA, 0xFF, 0xB7, 0xFF, 0x6C, 0xFF, 0x0C,
-       0x00, 0x9D, 0x02, 0x37, 0x07, 0x78, 0x0C, 0x15, 0x10, 0x47, 0x10,
-       0xF3, 0x0C, 0xC2, 0x07, 0x01, 0x03, 0x35, 0x00, 0x6D, 0xFF, 0xAD,
-       0xFF, 0xF7, 0xFF, 0xEB, 0xFF, 0x94, 0xFF, 0x7A, 0xFF, 0xB3, 0x00,
-       0x0D, 0x04, 0x1C, 0x09, 0x0D, 0x0E, 0x97, 0x10, 0x73, 0x0F, 0x35,
-       0x0B, 0xEB, 0x05, 0xC1, 0x01, 0xBD, 0xFF, 0x75, 0xFF, 0xCE, 0xFF,
-       0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0xFF, 0x77, 0xFF, 0xB3, 0xFF, 0xA1,
-       0x01, 0xB7, 0x05, 0xFF, 0x0A, 0x53, 0x0F, 0x9E, 0x10, 0x37, 0x0E,
-       0x55, 0x09, 0x3B, 0x04, 0xCB, 0x00, 0x7E, 0xFF, 0x90, 0xFF, 0xE9,
-       0xFF, 0xF8, 0xFF, 0xB1, 0xFF, 0x6C, 0xFF, 0x24, 0x00, 0xD8, 0x02,
-       0x8A, 0x07, 0xC2, 0x0C, 0x34, 0x10, 0x2A, 0x10, 0xAA, 0x0C, 0x6F,
-       0x07, 0xC4, 0x02, 0x1C, 0x00, 0x6C, 0xFF, 0xB3, 0xFF, 0xF9, 0xFF,
-       0xE8, 0xFF, 0x8E, 0xFF, 0x80, 0xFF, 0xD7, 0x00, 0x53, 0x04, 0x71,
-       0x09, 0x4C, 0x0E, 0xA1, 0x10, 0x43, 0x0F, 0xE3, 0x0A, 0x9D, 0x05,
-       0x91, 0x01, 0xAE, 0xFF, 0x79, 0xFF, 0xD4, 0xFF, 0x00, 0x00, 0xFF,
-       0xFF, 0xCD, 0xFF, 0x74, 0xFF, 0xC2, 0xFF, 0xD2, 0x01, 0x06, 0x06,
-       0x50, 0x0B, 0x82, 0x0F, 0x93, 0x10, 0xF8, 0x0D, 0x00, 0x09, 0xF6,
-       0x03, 0xA7, 0x00, 0x78, 0xFF, 0x96, 0xFF, 0xEC, 0xFF, 0xF6, 0xFF,
-       0xAB, 0xFF, 0x6D, 0xFF, 0x3E, 0x00, 0x15, 0x03, 0xDE, 0x07, 0x0B,
-       0x0D, 0x50, 0x10, 0x0A, 0x10, 0x5E, 0x0C, 0x1C, 0x07, 0x8A, 0x02,
-       0x04, 0x00, 0x6C, 0xFF, 0xB9, 0xFF, 0xFB, 0xFF, 0xE4, 0xFF, 0x89,
-       0xFF, 0x88, 0xFF, 0xFD, 0x00, 0x9B, 0x04, 0xC5, 0x09, 0x88, 0x0E,
-       0xA8, 0x10, 0x10, 0x0F, 0x91, 0x0A, 0x50, 0x05, 0x64, 0x01, 0xA1,
-       0xFF, 0x7D, 0xFF, 0xD9, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0xC7, 0xFF,
-       0x71, 0xFF, 0xD3, 0xFF, 0x05, 0x02, 0x55, 0x06, 0xA0, 0x0B, 0xAD,
-       0x0F, 0x84, 0x10, 0xB6, 0x0D, 0xAC, 0x08, 0xB3, 0x03, 0x86, 0x00,
-       0x74, 0xFF, 0x9C, 0xFF, 0xF0, 0xFF, 0xF4, 0xFF, 0xA5, 0xFF, 0x6F,
-       0xFF, 0x5A, 0x00, 0x54, 0x03, 0x32, 0x08, 0x52, 0x0D, 0x68, 0x10,
-       0xE6, 0x0F, 0x11, 0x0C, 0xCA, 0x06, 0x52, 0x02, 0xEF, 0xFF, 0x6E,
-       0xFF, 0xBF, 0xFF, 0xFC, 0xFF, 0xDF, 0xFF, 0x84, 0xFF, 0x91, 0xFF,
-       0x25, 0x01, 0xE4, 0x04, 0x19, 0x0A, 0xC2, 0x0E, 0xAA, 0x10, 0xDA,
-       0x0E, 0x3E, 0x0A, 0x05, 0x05, 0x38, 0x01, 0x96, 0xFF, 0x81, 0xFF,
-       0xDD, 0xFF, 0x00, 0x00, 0xFD, 0xFF, 0xC1, 0xFF, 0x6E, 0xFF, 0xE6,
-       0xFF, 0x3A, 0x02, 0xA6, 0x06, 0xEF, 0x0B, 0xD6, 0x0F, 0x71, 0x10,
-       0x71, 0x0D, 0x57, 0x08, 0x71, 0x03, 0x67, 0x00, 0x70, 0xFF, 0xA2,
-       0xFF, 0xF3, 0xFF, 0xF1, 0xFF, 0x9F, 0xFF, 0x72, 0xFF, 0x78, 0x00,
-       0x95, 0x03, 0x86, 0x08, 0x98, 0x0D, 0x7C, 0x10, 0xC0, 0x0F, 0xC3,
-       0x0B, 0x79, 0x06, 0x1C, 0x02, 0xDB, 0xFF, 0x70, 0xFF, 0xC5, 0xFF,
-       0xFE, 0xFF, 0x00, 0x00, 0xDB, 0xFF, 0x7F, 0xFF, 0x9C, 0xFF, 0x50,
-       0x01, 0x2F, 0x05, 0x6C, 0x0A, 0xF9, 0x0E, 0xA9, 0x10, 0xA2, 0x0E,
-       0xEA, 0x09, 0xBB, 0x04, 0x0F, 0x01, 0x8C, 0xFF, 0x87, 0xFF, 0xE2,
-       0xFF, 0xFC, 0xFF, 0xBC, 0xFF, 0x6D, 0xFF, 0xFA, 0xFF, 0x71, 0x02,
-       0xF7, 0x06, 0x3C, 0x0C, 0xFB, 0x0F, 0x5B, 0x10, 0x2B, 0x0D, 0x03,
-       0x08, 0x31, 0x03, 0x4A, 0x00, 0x6E, 0xFF, 0xA8, 0xFF, 0xF5, 0xFF,
-       0xEE, 0xFF, 0x99, 0xFF, 0x76, 0xFF, 0x98, 0x00, 0xD8, 0x03, 0xDB,
-       0x08, 0xDB, 0x0D, 0x8D, 0x10, 0x96, 0x0F, 0x73, 0x0B, 0x29, 0x06,
-       0xE8, 0x01, 0xC9, 0xFF, 0x72, 0xFF, 0xCA, 0xFF, 0xFE, 0xFF, 0x00,
-       0x00, 0xD6, 0xFF, 0x7A, 0xFF, 0xA8, 0xFF, 0x7D, 0x01, 0x7B, 0x05,
-       0xBF, 0x0A, 0x2D, 0x0F, 0xA5, 0x10, 0x67, 0x0E, 0x96, 0x09, 0x73,
-       0x04, 0xE7, 0x00, 0x84, 0xFF, 0x8C, 0xFF, 0xE6, 0xFF, 0xFA, 0xFF,
-       0xB6, 0xFF, 0x6C, 0xFF, 0x11, 0x00, 0xAA, 0x02, 0x4A, 0x07, 0x88,
-       0x0C, 0x1C, 0x10, 0x41, 0x10, 0xE3, 0x0C, 0xAF, 0x07, 0xF3, 0x02,
-       0x2F, 0x00, 0x6C, 0xFF, 0xAE, 0xFF, 0xF7, 0xFF, 0xEA, 0xFF, 0x93,
-       0xFF, 0x7B, 0xFF, 0xBB, 0x00, 0x1C, 0x04, 0x2F, 0x09, 0x1B, 0x0E,
-       0x9A, 0x10, 0x68, 0x0F, 0x23, 0x0B, 0xDA, 0x05, 0xB7, 0x01, 0xB9,
-       0xFF, 0x76, 0xFF, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1, 0xFF,
-       0x76, 0xFF, 0xB6, 0xFF, 0xAC, 0x01, 0xC8, 0x05, 0x11, 0x0B, 0x5E,
-       0x0F, 0x9C, 0x10, 0x29, 0x0E, 0x42, 0x09, 0x2C, 0x04, 0xC2, 0x00,
-       0x7D, 0xFF, 0x92, 0xFF, 0xEA, 0xFF, 0xF8, 0xFF, 0xB0, 0xFF, 0x6C,
-       0xFF, 0x29, 0x00, 0xE6, 0x02, 0x9D, 0x07, 0xD3, 0x0C, 0x3B, 0x10,
-       0x23, 0x10, 0x99, 0x0C, 0x5C, 0x07, 0xB7, 0x02, 0x16, 0x00, 0x6C,
-       0xFF, 0xB4, 0xFF, 0xF9, 0xFF, 0xE7, 0xFF, 0x8D, 0xFF, 0x82, 0xFF,
-       0xDF, 0x00, 0x63, 0x04, 0x84, 0x09, 0x59, 0x0E, 0xA3, 0x10, 0x38,
-       0x0F, 0xD1, 0x0A, 0x8C, 0x05, 0x87, 0x01, 0xAB, 0xFF, 0x79, 0xFF,
-       0xD5, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xCB, 0xFF, 0x73, 0xFF, 0xC6,
-       0xFF, 0xDD, 0x01, 0x17, 0x06, 0x62, 0x0B, 0x8C, 0x0F, 0x90, 0x10,
-       0xE9, 0x0D, 0xED, 0x08, 0xE7, 0x03, 0xA0, 0x00, 0x77, 0xFF, 0x97,
-       0xFF, 0xED, 0xFF, 0xF6, 0xFF, 0xA9, 0xFF, 0x6D, 0xFF, 0x44, 0x00,
-       0x23, 0x03, 0xF1, 0x07, 0x1B, 0x0D, 0x55, 0x10, 0x02, 0x10, 0x4D,
-       0x0C, 0x0A, 0x07, 0x7E, 0x02, 0xFF, 0xFF, 0x6D, 0xFF, 0xBA, 0xFF,
-       0xFB, 0xFF, 0xE3, 0xFF, 0x88, 0xFF, 0x8A, 0xFF, 0x06, 0x01, 0xAB,
-       0x04, 0xD8, 0x09, 0x95, 0x0E, 0xA9, 0x10, 0x05, 0x0F, 0x7F, 0x0A,
-       0x40, 0x05, 0x5A, 0x01, 0x9F, 0xFF, 0x7E, 0xFF, 0xDA, 0xFF, 0x00,
-       0x00, 0xFE, 0xFF, 0xC6, 0xFF, 0x70, 0xFF, 0xD7, 0xFF, 0x10, 0x02,
-       0x67, 0x06, 0xB1, 0x0B, 0xB7, 0x0F, 0x80, 0x10, 0xA7, 0x0D, 0x99,
-       0x08, 0xA4, 0x03, 0x7F, 0x00, 0x73, 0xFF, 0x9D, 0xFF, 0xF0, 0xFF,
-       0xF3, 0xFF, 0xA3, 0xFF, 0x70, 0xFF, 0x60, 0x00, 0x62, 0x03, 0x45,
-       0x08, 0x62, 0x0D, 0x6C, 0x10, 0xDE, 0x0F, 0x00, 0x0C, 0xB8, 0x06,
-       0x46, 0x02, 0xEA, 0xFF, 0x6E, 0xFF, 0xC0, 0xFF, 0xFD, 0xFF, 0x00,
-       0x00, 0xDE, 0xFF, 0x83, 0xFF, 0x94, 0xFF, 0x2F, 0x01, 0xF4, 0x04,
-       0x2B, 0x0A, 0xCE, 0x0E, 0xAA, 0x10, 0xCE, 0x0E, 0x2B, 0x0A, 0xF4,
-       0x04, 0x2F, 0x01, 0x94, 0xFF, 0x83, 0xFF, 0xDE, 0xFF, 0xFD, 0xFF,
-       0xC0, 0xFF, 0x6E, 0xFF, 0xEA, 0xFF, 0x46, 0x02, 0xB8, 0x06, 0x00,
-       0x0C, 0xDE, 0x0F, 0x6C, 0x10, 0x62, 0x0D, 0x45, 0x08, 0x62, 0x03,
-       0x60, 0x00, 0x70, 0xFF, 0xA3, 0xFF, 0xF3, 0xFF, 0xF0, 0xFF, 0x9D,
-       0xFF, 0x73, 0xFF, 0x7F, 0x00, 0xA4, 0x03, 0x99, 0x08, 0xA7, 0x0D,
-       0x80, 0x10, 0xB7, 0x0F, 0xB1, 0x0B, 0x67, 0x06, 0x10, 0x02, 0xD7,
-       0xFF, 0x70, 0xFF, 0xC6, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0xDA, 0xFF,
-       0x7E, 0xFF, 0x9F, 0xFF, 0x5A, 0x01, 0x40, 0x05, 0x7F, 0x0A, 0x05,
-       0x0F, 0xA9, 0x10, 0x95, 0x0E, 0xD8, 0x09, 0xAB, 0x04, 0x06, 0x01,
-       0x8A, 0xFF, 0x88, 0xFF, 0xE3, 0xFF, 0xFB, 0xFF, 0xBA, 0xFF, 0x6D,
-       0xFF, 0xFF, 0xFF, 0x7E, 0x02, 0x0A, 0x07, 0x4D, 0x0C, 0x02, 0x10,
-       0x55, 0x10, 0x1B, 0x0D, 0xF1, 0x07, 0x23, 0x03, 0x44, 0x00, 0x6D,
-       0xFF, 0xA9, 0xFF, 0xF6, 0xFF, 0xED, 0xFF, 0x97, 0xFF, 0x77, 0xFF,
-       0xA0, 0x00, 0xE7, 0x03, 0xED, 0x08, 0xE9, 0x0D, 0x90, 0x10, 0x8C,
-       0x0F, 0x62, 0x0B, 0x17, 0x06, 0xDD, 0x01, 0xC6, 0xFF, 0x73, 0xFF,
-       0xCB, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xD5, 0xFF, 0x79, 0xFF, 0xAB,
-       0xFF, 0x87, 0x01, 0x8C, 0x05, 0xD1, 0x0A, 0x38, 0x0F, 0xA3, 0x10,
-       0x59, 0x0E, 0x84, 0x09, 0x63, 0x04, 0xDF, 0x00, 0x82, 0xFF, 0x8D,
-       0xFF, 0xE7, 0xFF, 0xF9, 0xFF, 0xB4, 0xFF, 0x6C, 0xFF, 0x16, 0x00,
-       0xB7, 0x02, 0x5C, 0x07, 0x99, 0x0C, 0x23, 0x10, 0x3B, 0x10, 0xD3,
-       0x0C, 0x9D, 0x07, 0xE6, 0x02, 0x29, 0x00, 0x6C, 0xFF, 0xB0, 0xFF,
-       0xF8, 0xFF, 0xEA, 0xFF, 0x92, 0xFF, 0x7D, 0xFF, 0xC2, 0x00, 0x2C,
-       0x04, 0x42, 0x09, 0x29, 0x0E, 0x9C, 0x10, 0x5E, 0x0F, 0x11, 0x0B,
-       0xC8, 0x05, 0xAC, 0x01, 0xB6, 0xFF, 0x76, 0xFF, 0xD1, 0xFF, 0xFF,
-       0xFF, 0xFF, 0xFF, 0xD0, 0xFF, 0x76, 0xFF, 0xB9, 0xFF, 0xB7, 0x01,
-       0xDA, 0x05, 0x23, 0x0B, 0x68, 0x0F, 0x9A, 0x10, 0x1B, 0x0E, 0x2F,
-       0x09, 0x1C, 0x04, 0xBB, 0x00, 0x7B, 0xFF, 0x93, 0xFF, 0xEA, 0xFF,
-       0xF7, 0xFF, 0xAE, 0xFF, 0x6C, 0xFF, 0x2F, 0x00, 0xF3, 0x02, 0xAF,
-       0x07, 0xE3, 0x0C, 0x41, 0x10, 0x1C, 0x10, 0x88, 0x0C, 0x4A, 0x07,
-       0xAA, 0x02, 0x11, 0x00, 0x6C, 0xFF, 0xB6, 0xFF, 0xFA, 0xFF, 0xE6,
-       0xFF, 0x8C, 0xFF, 0x84, 0xFF, 0xE7, 0x00, 0x73, 0x04, 0x96, 0x09,
-       0x67, 0x0E, 0xA5, 0x10, 0x2D, 0x0F, 0xBF, 0x0A, 0x7B, 0x05, 0x7D,
-       0x01, 0xA8, 0xFF, 0x7A, 0xFF, 0xD6, 0xFF, 0x00, 0x00, 0xFE, 0xFF,
-       0xCA, 0xFF, 0x72, 0xFF, 0xC9, 0xFF, 0xE8, 0x01, 0x29, 0x06, 0x73,
-       0x0B, 0x96, 0x0F, 0x8D, 0x10, 0xDB, 0x0D, 0xDB, 0x08, 0xD8, 0x03,
-       0x98, 0x00, 0x76, 0xFF, 0x99, 0xFF, 0xEE, 0xFF, 0xF5, 0xFF, 0xA8,
-       0xFF, 0x6E, 0xFF, 0x4A, 0x00, 0x31, 0x03, 0x03, 0x08, 0x2B, 0x0D,
-       0x5B, 0x10, 0xFB, 0x0F, 0x3C, 0x0C, 0xF7, 0x06, 0x71, 0x02, 0xFA,
-       0xFF, 0x6D, 0xFF, 0xBC, 0xFF, 0xFC, 0xFF, 0xE2, 0xFF, 0x87, 0xFF,
-       0x8C, 0xFF, 0x0F, 0x01, 0xBB, 0x04, 0xEA, 0x09, 0xA2, 0x0E, 0xA9,
-       0x10, 0xF9, 0x0E, 0x6C, 0x0A, 0x2F, 0x05, 0x50, 0x01, 0x9C, 0xFF,
-       0x7F, 0xFF, 0xDB, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0xC5, 0xFF, 0x70,
-       0xFF, 0xDB, 0xFF, 0x1C, 0x02, 0x79, 0x06, 0xC3, 0x0B, 0xC0, 0x0F,
-       0x7C, 0x10, 0x98, 0x0D, 0x86, 0x08, 0x95, 0x03, 0x78, 0x00, 0x72,
-       0xFF, 0x9F, 0xFF, 0xF1, 0xFF, 0xF3, 0xFF, 0xA2, 0xFF, 0x70, 0xFF,
-       0x67, 0x00, 0x71, 0x03, 0x57, 0x08, 0x71, 0x0D, 0x71, 0x10, 0xD6,
-       0x0F, 0xEF, 0x0B, 0xA6, 0x06, 0x3A, 0x02, 0xE6, 0xFF, 0x6E, 0xFF,
-       0xC1, 0xFF, 0xFD, 0xFF, 0x00, 0x00, 0xDD, 0xFF, 0x81, 0xFF, 0x96,
-       0xFF, 0x38, 0x01, 0x05, 0x05, 0x3E, 0x0A, 0xDA, 0x0E, 0xAA, 0x10,
-       0xC2, 0x0E, 0x19, 0x0A, 0xE4, 0x04, 0x25, 0x01, 0x91, 0xFF, 0x84,
-       0xFF, 0xDF, 0xFF, 0xFC, 0xFF, 0xBF, 0xFF, 0x6E, 0xFF, 0xEF, 0xFF,
-       0x52, 0x02, 0xCA, 0x06, 0x11, 0x0C, 0xE6, 0x0F, 0x68, 0x10, 0x52,
-       0x0D, 0x32, 0x08, 0x54, 0x03, 0x5A, 0x00, 0x6F, 0xFF, 0xA5, 0xFF,
-       0xF4, 0xFF, 0xF0, 0xFF, 0x9C, 0xFF, 0x74, 0xFF, 0x86, 0x00, 0xB3,
-       0x03, 0xAC, 0x08, 0xB6, 0x0D, 0x84, 0x10, 0xAD, 0x0F, 0xA0, 0x0B,
-       0x55, 0x06, 0x05, 0x02, 0xD3, 0xFF, 0x71, 0xFF, 0xC7, 0xFF, 0xFE,
-       0xFF, 0x00, 0x00, 0xD9, 0xFF, 0x7D, 0xFF, 0xA1, 0xFF, 0x64, 0x01,
-       0x50, 0x05, 0x91, 0x0A, 0x10, 0x0F, 0xA8, 0x10, 0x88, 0x0E, 0xC5,
-       0x09, 0x9B, 0x04, 0xFD, 0x00, 0x88, 0xFF, 0x89, 0xFF, 0xE4, 0xFF,
-       0xFB, 0xFF, 0xB9, 0xFF, 0x6C, 0xFF, 0x04, 0x00, 0x8A, 0x02, 0x1C,
-       0x07, 0x5E, 0x0C, 0x0A, 0x10, 0x50, 0x10, 0x0B, 0x0D, 0xDE, 0x07,
-       0x15, 0x03, 0x3E, 0x00, 0x6D, 0xFF, 0xAB, 0xFF, 0xF6, 0xFF, 0xEC,
-       0xFF, 0x96, 0xFF, 0x78, 0xFF, 0xA7, 0x00, 0xF6, 0x03, 0x00, 0x09,
-       0xF8, 0x0D, 0x93, 0x10, 0x82, 0x0F, 0x50, 0x0B, 0x06, 0x06, 0xD2,
-       0x01, 0xC2, 0xFF, 0x74, 0xFF, 0xCD, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
-       0xD4, 0xFF, 0x79, 0xFF, 0xAE, 0xFF, 0x91, 0x01, 0x9D, 0x05, 0xE3,
-       0x0A, 0x43, 0x0F, 0xA1, 0x10, 0x4C, 0x0E, 0x71, 0x09, 0x53, 0x04,
-       0xD7, 0x00, 0x80, 0xFF, 0x8E, 0xFF, 0xE8, 0xFF, 0xF9, 0xFF, 0xB3,
-       0xFF, 0x6C, 0xFF, 0x1C, 0x00, 0xC4, 0x02, 0x6F, 0x07, 0xAA, 0x0C,
-       0x2A, 0x10, 0x34, 0x10, 0xC2, 0x0C, 0x8A, 0x07, 0xD8, 0x02, 0x24,
-       0x00, 0x6C, 0xFF, 0xB1, 0xFF, 0xF8, 0xFF, 0xE9, 0xFF, 0x90, 0xFF,
-       0x7E, 0xFF, 0xCB, 0x00, 0x3B, 0x04, 0x55, 0x09, 0x37, 0x0E, 0x9E,
-       0x10, 0x53, 0x0F, 0xFF, 0x0A, 0xB7, 0x05, 0xA1, 0x01, 0xB3, 0xFF,
-       0x77, 0xFF, 0xD2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCE, 0xFF, 0x75,
-       0xFF, 0xBD, 0xFF, 0xC1, 0x01, 0xEB, 0x05, 0x35, 0x0B, 0x73, 0x0F,
-       0x97, 0x10, 0x0D, 0x0E, 0x1C, 0x09, 0x0D, 0x04, 0xB3, 0x00, 0x7A,
-       0xFF, 0x94, 0xFF, 0xEB, 0xFF, 0xF7, 0xFF, 0xAD, 0xFF, 0x6D, 0xFF,
-       0x35, 0x00, 0x01, 0x03, 0xC2, 0x07, 0xF3, 0x0C, 0x47, 0x10, 0x15,
-       0x10, 0x78, 0x0C, 0x37, 0x07, 0x9D, 0x02, 0x0C, 0x00, 0x6C, 0xFF,
-       0xB7, 0xFF, 0xFA, 0xFF, 0xE5, 0xFF, 0x8B, 0xFF, 0x85, 0xFF, 0xF0,
-       0x00, 0x83, 0x04, 0xA9, 0x09, 0x74, 0x0E, 0xA6, 0x10, 0x21, 0x0F,
-       0xAD, 0x0A, 0x6A, 0x05, 0x73, 0x01, 0xA5, 0xFF, 0x7B, 0xFF, 0xD7,
-       0xFF, 0x00, 0x00, 0xFE, 0xFF, 0xC9, 0xFF, 0x72, 0xFF, 0xCD, 0xFF,
-       0xF4, 0x01, 0x3B, 0x06, 0x85, 0x0B, 0x9F, 0x0F, 0x89, 0x10, 0xCC,
-       0x0D, 0xC8, 0x08, 0xC9, 0x03, 0x91, 0x00, 0x75, 0xFF, 0x9A, 0xFF,
-       0xEF, 0xFF, 0xF5, 0xFF, 0xA7, 0xFF, 0x6E, 0xFF, 0x50, 0x00, 0x3F,
-       0x03, 0x16, 0x08, 0x3B, 0x0D, 0x60, 0x10, 0xF3, 0x0F, 0x2B, 0x0C,
-       0xE5, 0x06, 0x65, 0x02, 0xF6, 0xFF, 0x6D, 0xFF, 0xBD, 0xFF, 0xFC,
-       0xFF, 0xE1, 0xFF, 0x85, 0xFF, 0x8E, 0xFF, 0x18, 0x01, 0xCB, 0x04,
-       0xFD, 0x09, 0xAF, 0x0E, 0xAA, 0x10, 0xED, 0x0E, 0x5A, 0x0A, 0x1E,
-       0x05, 0x46, 0x01, 0x9A, 0xFF, 0x80, 0xFF, 0xDC, 0xFF, 0x00, 0x00,
-       0xFD, 0xFF, 0xC3, 0xFF, 0x6F, 0xFF, 0xDF, 0xFF, 0x28, 0x02, 0x8B,
-       0x06, 0xD5, 0x0B, 0xC9, 0x0F, 0x78, 0x10, 0x88, 0x0D, 0x73, 0x08,
-       0x86, 0x03, 0x71, 0x00, 0x71, 0xFF, 0xA0, 0xFF, 0xF2, 0xFF, 0xF2,
-       0xFF, 0xA1, 0xFF, 0x71, 0xFF, 0x6E, 0x00, 0x7F, 0x03, 0x6A, 0x08,
-       0x81, 0x0D, 0x76, 0x10, 0xCD, 0x0F, 0xDD, 0x0B, 0x94, 0x06, 0x2E,
-       0x02, 0xE1, 0xFF, 0x6F, 0xFF, 0xC3, 0xFF, 0xFD, 0xFF, 0x00, 0x00,
-       0xDC, 0xFF, 0x80, 0xFF, 0x98, 0xFF, 0x42, 0x01, 0x16, 0x05, 0x50,
-       0x0A, 0xE7, 0x0E, 0xAA, 0x10, 0xB5, 0x0E, 0x06, 0x0A, 0xD3, 0x04,
-       0x1C, 0x01, 0x8F, 0xFF, 0x85, 0xFF, 0xE0, 0xFF, 0xFC, 0xFF, 0xBE,
-       0xFF, 0x6D, 0xFF, 0xF3, 0xFF, 0x5E, 0x02, 0xDC, 0x06, 0x23, 0x0C,
-       0xEF, 0x0F, 0x63, 0x10, 0x43, 0x0D, 0x1F, 0x08, 0x46, 0x03, 0x53,
-       0x00, 0x6E, 0xFF, 0xA6, 0xFF, 0xF4, 0xFF, 0xEF, 0xFF, 0x9B, 0xFF,
-       0x75, 0xFF, 0x8D, 0x00, 0xC1, 0x03, 0xBE, 0x08, 0xC4, 0x0D, 0x88,
-       0x10, 0xA4, 0x0F, 0x8E, 0x0B, 0x43, 0x06, 0xF9, 0x01, 0xCF, 0xFF,
-       0x71, 0xFF, 0xC8, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0xD8, 0xFF, 0x7C,
-       0xFF, 0xA4, 0xFF, 0x6E, 0x01, 0x61, 0x05, 0xA3, 0x0A, 0x1C, 0x0F,
-       0xA7, 0x10, 0x7B, 0x0E, 0xB2, 0x09, 0x8B, 0x04, 0xF4, 0x00, 0x86,
-       0xFF, 0x8A, 0xFF, 0xE4, 0xFF, 0xFA, 0xFF, 0xB8, 0xFF, 0x6C, 0xFF,
-       0x09, 0x00, 0x97, 0x02, 0x2E, 0x07, 0x6F, 0x0C, 0x11, 0x10, 0x4A,
-       0x10, 0xFB, 0x0C, 0xCB, 0x07, 0x07, 0x03, 0x38, 0x00, 0x6D, 0xFF,
-       0xAC, 0xFF, 0xF7, 0xFF, 0xEC, 0xFF, 0x95, 0xFF, 0x79, 0xFF, 0xAF,
-       0x00, 0x05, 0x04, 0x13, 0x09, 0x06, 0x0E, 0x96, 0x10, 0x78, 0x0F,
-       0x3E, 0x0B, 0xF4, 0x05, 0xC7, 0x01, 0xBF, 0xFF, 0x74, 0xFF, 0xCE,
-       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0xFF, 0x78, 0xFF, 0xB1, 0xFF,
-       0x9C, 0x01, 0xAE, 0x05, 0xF6, 0x0A, 0x4E, 0x0F, 0x9F, 0x10, 0x3E,
-       0x0E, 0x5E, 0x09, 0x43, 0x04, 0xCF, 0x00, 0x7F, 0xFF, 0x90, 0xFF,
-       0xE8, 0xFF, 0xF9, 0xFF, 0xB2, 0xFF, 0x6C, 0xFF, 0x21, 0x00, 0xD2,
-       0x02, 0x81, 0x07, 0xBA, 0x0C, 0x31, 0x10, 0x2E, 0x10, 0xB2, 0x0C,
-       0x78, 0x07, 0xCB, 0x02, 0x1E, 0x00, 0x6C, 0xFF, 0xB2, 0xFF, 0xF9,
-       0xFF, 0xE8, 0xFF, 0x8F, 0xFF, 0x80, 0xFF, 0xD3, 0x00, 0x4B, 0x04,
-       0x67, 0x09, 0x45, 0x0E, 0xA0, 0x10, 0x48, 0x0F, 0xEC, 0x0A, 0xA6,
-       0x05, 0x97, 0x01, 0xB0, 0xFF, 0x78, 0xFF, 0xD3, 0xFF, 0x00, 0x00,
-       0xFF, 0xFF, 0xCD, 0xFF, 0x74, 0xFF, 0xC0, 0xFF, 0xCC, 0x01, 0xFD,
-       0x05, 0x47, 0x0B, 0x7D, 0x0F, 0x94, 0x10, 0xFF, 0x0D, 0x0A, 0x09,
-       0xFE, 0x03, 0xAB, 0x00, 0x79, 0xFF, 0x95, 0xFF, 0xEC, 0xFF, 0xF7,
-       0xFF, 0xAC, 0xFF, 0x6D, 0xFF, 0x3B, 0x00, 0x0E, 0x03, 0xD5, 0x07,
-       0x03, 0x0D, 0x4D, 0x10, 0x0E, 0x10, 0x67, 0x0C, 0x25, 0x07, 0x91,
-       0x02, 0x07, 0x00, 0x6C, 0xFF, 0xB8, 0xFF, 0xFB, 0xFF, 0xE4, 0xFF,
-       0x89, 0xFF, 0x87, 0xFF, 0xF9, 0x00, 0x93, 0x04, 0xBC, 0x09, 0x82,
-       0x0E, 0xA7, 0x10, 0x16, 0x0F, 0x9A, 0x0A, 0x59, 0x05, 0x69, 0x01,
-       0xA3, 0xFF, 0x7C, 0xFF, 0xD8, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0xC8,
-       0xFF, 0x71, 0xFF, 0xD1, 0xFF, 0xFF, 0x01, 0x4C, 0x06, 0x97, 0x0B,
-       0xA9, 0x0F, 0x86, 0x10, 0xBD, 0x0D, 0xB5, 0x08, 0xBA, 0x03, 0x8A,
-       0x00, 0x74, 0xFF, 0x9B, 0xFF, 0xEF, 0xFF, 0xF4, 0xFF, 0xA5, 0xFF,
-       0x6F, 0xFF, 0x57, 0x00, 0x4D, 0x03, 0x29, 0x08, 0x4B, 0x0D, 0x65,
-       0x10, 0xEB, 0x0F, 0x1A, 0x0C, 0xD3, 0x06, 0x58, 0x02, 0xF1, 0xFF,
-       0x6D, 0xFF, 0xBE, 0xFF, 0xFC, 0xFF, 0xE0, 0xFF, 0x84, 0xFF, 0x90,
-       0xFF, 0x21, 0x01, 0xDC, 0x04, 0x10, 0x0A, 0xBB, 0x0E, 0xAA, 0x10,
-       0xE1, 0x0E, 0x47, 0x0A, 0x0D, 0x05, 0x3D, 0x01, 0x97, 0xFF, 0x81,
-       0xFF, 0xDD, 0xFF, 0x00, 0x00, 0xFD, 0xFF, 0xC2, 0xFF, 0x6F, 0xFF,
-       0xE4, 0xFF, 0x34, 0x02, 0x9D, 0x06, 0xE6, 0x0B, 0xD1, 0x0F, 0x73,
-       0x10, 0x79, 0x0D, 0x61, 0x08, 0x78, 0x03, 0x6A, 0x00, 0x70, 0xFF,
-       0xA1, 0xFF, 0xF2, 0xFF, 0xF1, 0xFF, 0x9F, 0xFF, 0x72, 0xFF, 0x74,
-       0x00, 0x8E, 0x03, 0x7D, 0x08, 0x90, 0x0D, 0x7A, 0x10, 0xC4, 0x0F,
-       0xCC, 0x0B, 0x82, 0x06, 0x22, 0x02, 0xDD, 0xFF, 0x6F, 0xFF, 0xC4,
-       0xFF, 0xFD, 0xFF, 0x00, 0x00, 0xDB, 0xFF, 0x7F, 0xFF, 0x9B, 0xFF,
-       0x4B, 0x01, 0x26, 0x05, 0x63, 0x0A, 0xF3, 0x0E, 0xAA, 0x10, 0xA8,
-       0x0E, 0xF4, 0x09, 0xC3, 0x04, 0x13, 0x01, 0x8D, 0xFF, 0x86, 0xFF,
-       0xE1, 0xFF, 0xFC, 0xFF, 0xBC, 0xFF, 0x6D, 0xFF, 0xF8, 0xFF, 0x6B,
-       0x02, 0xEE, 0x06, 0x34, 0x0C, 0xF7, 0x0F, 0x5D, 0x10, 0x33, 0x0D,
-       0x0D, 0x08, 0x38, 0x03, 0x4D, 0x00, 0x6E, 0xFF, 0xA7, 0xFF, 0xF5,
-       0xFF, 0xEE, 0xFF, 0x99, 0xFF, 0x76, 0xFF, 0x94, 0x00, 0xD0, 0x03,
-       0xD1, 0x08, 0xD3, 0x0D, 0x8B, 0x10, 0x9A, 0x0F, 0x7C, 0x0B, 0x32,
-       0x06, 0xEE, 0x01, 0xCB, 0xFF, 0x72, 0xFF, 0xCA, 0xFF, 0xFE, 0xFF,
-       0x00, 0x00, 0xD6, 0xFF, 0x7B, 0xFF, 0xA7, 0xFF, 0x78, 0x01, 0x72,
-       0x05, 0xB6, 0x0A, 0x27, 0x0F, 0xA5, 0x10, 0x6E, 0x0E, 0xA0, 0x09,
-       0x7B, 0x04, 0xEC, 0x00, 0x85, 0xFF, 0x8B, 0xFF, 0xE5, 0xFF, 0xFA,
-       0xFF, 0xB6, 0xFF, 0x6C, 0xFF, 0x0E, 0x00, 0xA4, 0x02, 0x41, 0x07,
-       0x80, 0x0C, 0x19, 0x10, 0x44, 0x10, 0xEB, 0x0C, 0xB9, 0x07, 0xFA,
-       0x02, 0x32, 0x00, 0x6D, 0xFF, 0xAE, 0xFF, 0xF7, 0xFF, 0xEB, 0xFF,
-       0x93, 0xFF, 0x7B, 0xFF, 0xB7, 0x00, 0x15, 0x04, 0x26, 0x09, 0x14,
-       0x0E, 0x98, 0x10, 0x6D, 0x0F, 0x2C, 0x0B, 0xE3, 0x05, 0xBC, 0x01,
-       0xBB, 0xFF, 0x75, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD1,
-       0xFF, 0x77, 0xFF, 0xB5, 0xFF, 0xA6, 0x01, 0xC0, 0x05, 0x08, 0x0B,
-       0x58, 0x0F, 0x9D, 0x10, 0x30, 0x0E, 0x4B, 0x09, 0x34, 0x04, 0xC6,
-       0x00, 0x7D, 0xFF, 0x91, 0xFF, 0xE9, 0xFF, 0xF8, 0xFF, 0xB0, 0xFF,
-       0x6C, 0xFF, 0x27, 0x00, 0xDF, 0x02, 0x94, 0x07, 0xCA, 0x0C, 0x37,
-       0x10, 0x27, 0x10, 0xA1, 0x0C, 0x65, 0x07, 0xBE, 0x02, 0x19, 0x00,
-       0x6C, 0xFF, 0xB4, 0xFF, 0xF9, 0xFF, 0xE7, 0xFF, 0x8E, 0xFF, 0x81,
-       0xFF, 0xDB, 0x00, 0x5B, 0x04, 0x7A, 0x09, 0x53, 0x0E, 0xA2, 0x10,
-       0x3D, 0x0F, 0xDA, 0x0A, 0x95, 0x05, 0x8C, 0x01, 0xAD, 0xFF, 0x79,
-       0xFF, 0xD4, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xCC, 0xFF, 0x73, 0xFF,
-       0xC4, 0xFF, 0xD7, 0x01, 0x0E, 0x06, 0x59, 0x0B, 0x87, 0x0F, 0x91,
-       0x10, 0xF0, 0x0D, 0xF7, 0x08, 0xEF, 0x03, 0xA3, 0x00, 0x78, 0xFF,
-       0x97, 0xFF, 0xED, 0xFF, 0xF6, 0xFF, 0xAA, 0xFF, 0x6D, 0xFF, 0x41,
-       0x00, 0x1C, 0x03, 0xE7, 0x07, 0x13, 0x0D, 0x52, 0x10, 0x06, 0x10,
-       0x56, 0x0C, 0x13, 0x07, 0x84, 0x02, 0x02, 0x00, 0x6D, 0xFF, 0xBA,
-       0xFF, 0xFB, 0xFF, 0xE3, 0xFF, 0x88, 0xFF, 0x89, 0xFF, 0x01, 0x01,
-       0xA3, 0x04, 0xCE, 0x09, 0x8F, 0x0E, 0xA8, 0x10, 0x0A, 0x0F, 0x88,
-       0x0A, 0x48, 0x05, 0x5F, 0x01, 0xA0, 0xFF, 0x7D, 0xFF, 0xD9, 0xFF,
-       0x00, 0x00, 0xFE, 0xFF, 0xC7, 0xFF, 0x70, 0xFF, 0xD5, 0xFF, 0x0B,
-       0x02, 0x5E, 0x06, 0xA9, 0x0B, 0xB2, 0x0F, 0x82, 0x10, 0xAE, 0x0D,
-       0xA2, 0x08, 0xAB, 0x03, 0x82, 0x00, 0x73, 0xFF, 0x9D, 0xFF, 0xF0,
-       0xFF, 0xF3, 0xFF, 0xA4, 0xFF, 0x6F, 0xFF, 0x5D, 0x00, 0x5B, 0x03,
-       0x3B, 0x08, 0x5A, 0x0D, 0x6A, 0x10, 0xE2, 0x0F, 0x09, 0x0C, 0xC1,
-       0x06, 0x4C, 0x02, 0xEC, 0xFF, 0x6E, 0xFF, 0xC0, 0xFF, 0xFC, 0xFF,
-       0xDF, 0xFF, 0x83, 0xFF, 0x93, 0xFF, 0x2A, 0x01, 0xEC, 0x04, 0x22,
-       0x0A, 0xC8, 0x0E, 0xAB, 0x10, 0xD4, 0x0E, 0x35, 0x0A, 0xFD, 0x04,
-       0x33, 0x01, 0x95, 0xFF, 0x82, 0xFF, 0xDE, 0xFF, 0x00, 0x00, 0xFD,
-       0xFF, 0xC1, 0xFF, 0x6E, 0xFF, 0xE8, 0xFF, 0x40, 0x02, 0xAF, 0x06,
-       0xF7, 0x0B, 0xDA, 0x0F, 0x6F, 0x10, 0x6A, 0x0D, 0x4E, 0x08, 0x6A,
-       0x03, 0x64, 0x00, 0x70, 0xFF, 0xA3, 0xFF, 0xF3, 0xFF, 0xF1, 0xFF,
-       0x9E, 0xFF, 0x72, 0xFF, 0x7B, 0x00, 0x9C, 0x03, 0x90, 0x08, 0x9F,
-       0x0D, 0x7E, 0x10, 0xBB, 0x0F, 0xBA, 0x0B, 0x70, 0x06, 0x16, 0x02,
-       0xD9, 0xFF, 0x70, 0xFF, 0xC5, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0xDA,
-       0xFF, 0x7E, 0xFF, 0x9D, 0xFF, 0x55, 0x01, 0x37, 0x05, 0x75, 0x0A,
-       0xFF, 0x0E, 0xA9, 0x10, 0x9C, 0x0E, 0xE1, 0x09, 0xB3, 0x04, 0x0A,
-       0x01, 0x8B, 0xFF, 0x87, 0xFF, 0xE2, 0xFF, 0xFB, 0xFF, 0xBB, 0xFF,
-       0x6D, 0xFF, 0xFD, 0xFF, 0x77, 0x02, 0x01, 0x07, 0x45, 0x0C, 0xFF,
-       0x0F, 0x58, 0x10, 0x23, 0x0D, 0xFA, 0x07, 0x2A, 0x03, 0x47, 0x00,
-       0x6E, 0xFF, 0xA9, 0xFF, 0xF5, 0xFF, 0xED, 0xFF, 0x98, 0xFF, 0x77,
-       0xFF, 0x9C, 0x00, 0xDF, 0x03, 0xE4, 0x08, 0xE2, 0x0D, 0x8E, 0x10,
-       0x91, 0x0F, 0x6B, 0x0B, 0x20, 0x06, 0xE3, 0x01, 0xC8, 0xFF, 0x73,
-       0xFF, 0xCB, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xD5, 0xFF, 0x7A, 0xFF,
-       0xAA, 0xFF, 0x82, 0x01, 0x83, 0x05, 0xC8, 0x0A, 0x32, 0x0F, 0xA4,
-       0x10, 0x60, 0x0E, 0x8D, 0x09, 0x6B, 0x04, 0xE3, 0x00, 0x83, 0xFF,
-       0x8D, 0xFF, 0xE6, 0xFF, 0xFA, 0xFF, 0xB5, 0xFF, 0x6C, 0xFF, 0x14,
-       0x00, 0xB1, 0x02, 0x53, 0x07, 0x91, 0x0C, 0x20, 0x10, 0x3E, 0x10,
-       0xDB, 0x0C, 0xA6, 0x07, 0xEC, 0x02, 0x2C, 0x00, 0x6C, 0xFF, 0xAF,
-       0xFF, 0xF8, 0xFF, 0xEA, 0xFF, 0x92, 0xFF, 0x7C, 0xFF, 0xBE, 0x00,
-       0x24, 0x04, 0x38, 0x09, 0x22, 0x0E, 0x9B, 0x10, 0x63, 0x0F, 0x1A,
-       0x0B, 0xD1, 0x05, 0xB1, 0x01, 0xB8, 0xFF, 0x76, 0xFF, 0xD0, 0xFF,
-       0xFF, 0xFF, 0xFF, 0xFF, 0xD0, 0xFF, 0x76, 0xFF, 0xB8, 0xFF, 0xB1,
-       0x01, 0xD1, 0x05, 0x1A, 0x0B, 0x63, 0x0F, 0x9B, 0x10, 0x22, 0x0E,
-       0x38, 0x09, 0x24, 0x04, 0xBE, 0x00, 0x7C, 0xFF, 0x92, 0xFF, 0xEA,
-       0xFF, 0xF8, 0xFF, 0xAF, 0xFF, 0x6C, 0xFF, 0x2C, 0x00, 0xEC, 0x02,
-       0xA6, 0x07, 0xDB, 0x0C, 0x3E, 0x10, 0x20, 0x10, 0x91, 0x0C, 0x53,
-       0x07, 0xB1, 0x02, 0x14, 0x00, 0x6C, 0xFF, 0xB5, 0xFF, 0xFA, 0xFF,
-       0xE6, 0xFF, 0x8D, 0xFF, 0x83, 0xFF, 0xE3, 0x00, 0x6B, 0x04, 0x8D,
-       0x09, 0x60, 0x0E, 0xA4, 0x10, 0x32, 0x0F, 0xC8, 0x0A, 0x83, 0x05,
-       0x82, 0x01, 0xAA, 0xFF, 0x7A, 0xFF, 0xD5, 0xFF, 0x00, 0x00, 0xFF,
-       0xFF, 0xCB, 0xFF, 0x73, 0xFF, 0xC8, 0xFF, 0xE3, 0x01, 0x20, 0x06,
-       0x6B, 0x0B, 0x91, 0x0F, 0x8E, 0x10, 0xE2, 0x0D, 0xE4, 0x08, 0xDF,
-       0x03, 0x9C, 0x00, 0x77, 0xFF, 0x98, 0xFF, 0xED, 0xFF, 0xF5, 0xFF,
-       0xA9, 0xFF, 0x6E, 0xFF, 0x47, 0x00, 0x2A, 0x03, 0xFA, 0x07, 0x23,
-       0x0D, 0x58, 0x10, 0xFF, 0x0F, 0x45, 0x0C, 0x01, 0x07, 0x77, 0x02,
-       0xFD, 0xFF, 0x6D, 0xFF, 0xBB, 0xFF, 0xFB, 0xFF, 0xE2, 0xFF, 0x87,
-       0xFF, 0x8B, 0xFF, 0x0A, 0x01, 0xB3, 0x04, 0xE1, 0x09, 0x9C, 0x0E,
-       0xA9, 0x10, 0xFF, 0x0E, 0x75, 0x0A, 0x37, 0x05, 0x55, 0x01, 0x9D,
-       0xFF, 0x7E, 0xFF, 0xDA, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0xC5, 0xFF,
-       0x70, 0xFF, 0xD9, 0xFF, 0x16, 0x02, 0x70, 0x06, 0xBA, 0x0B, 0xBB,
-       0x0F, 0x7E, 0x10, 0x9F, 0x0D, 0x90, 0x08, 0x9C, 0x03, 0x7B, 0x00,
-       0x72, 0xFF, 0x9E, 0xFF, 0xF1, 0xFF, 0xF3, 0xFF, 0xA3, 0xFF, 0x70,
-       0xFF, 0x64, 0x00, 0x6A, 0x03, 0x4E, 0x08, 0x6A, 0x0D, 0x6F, 0x10,
-       0xDA, 0x0F, 0xF7, 0x0B, 0xAF, 0x06, 0x40, 0x02, 0xE8, 0xFF, 0x6E,
-       0xFF, 0xC1, 0xFF, 0xFD, 0xFF, 0x00, 0x00, 0xDE, 0xFF, 0x82, 0xFF,
-       0x95, 0xFF, 0x33, 0x01, 0xFD, 0x04, 0x35, 0x0A, 0xD4, 0x0E, 0xAB,
-       0x10, 0xC8, 0x0E, 0x22, 0x0A, 0xEC, 0x04, 0x2A, 0x01, 0x93, 0xFF,
-       0x83, 0xFF, 0xDF, 0xFF, 0xFC, 0xFF, 0xC0, 0xFF, 0x6E, 0xFF, 0xEC,
-       0xFF, 0x4C, 0x02, 0xC1, 0x06, 0x09, 0x0C, 0xE2, 0x0F, 0x6A, 0x10,
-       0x5A, 0x0D, 0x3B, 0x08, 0x5B, 0x03, 0x5D, 0x00, 0x6F, 0xFF, 0xA4,
-       0xFF, 0xF3, 0xFF, 0xF0, 0xFF, 0x9D, 0xFF, 0x73, 0xFF, 0x82, 0x00,
-       0xAB, 0x03, 0xA2, 0x08, 0xAE, 0x0D, 0x82, 0x10, 0xB2, 0x0F, 0xA9,
-       0x0B, 0x5E, 0x06, 0x0B, 0x02, 0xD5, 0xFF, 0x70, 0xFF, 0xC7, 0xFF,
-       0xFE, 0xFF, 0x00, 0x00, 0xD9, 0xFF, 0x7D, 0xFF, 0xA0, 0xFF, 0x5F,
-       0x01, 0x48, 0x05, 0x88, 0x0A, 0x0A, 0x0F, 0xA8, 0x10, 0x8F, 0x0E,
-       0xCE, 0x09, 0xA3, 0x04, 0x01, 0x01, 0x89, 0xFF, 0x88, 0xFF, 0xE3,
-       0xFF, 0xFB, 0xFF, 0xBA, 0xFF, 0x6D, 0xFF, 0x02, 0x00, 0x84, 0x02,
-       0x13, 0x07, 0x56, 0x0C, 0x06, 0x10, 0x52, 0x10, 0x13, 0x0D, 0xE7,
-       0x07, 0x1C, 0x03, 0x41, 0x00, 0x6D, 0xFF, 0xAA, 0xFF, 0xF6, 0xFF,
-       0xED, 0xFF, 0x97, 0xFF, 0x78, 0xFF, 0xA3, 0x00, 0xEF, 0x03, 0xF7,
-       0x08, 0xF0, 0x0D, 0x91, 0x10, 0x87, 0x0F, 0x59, 0x0B, 0x0E, 0x06,
-       0xD7, 0x01, 0xC4, 0xFF, 0x73, 0xFF, 0xCC, 0xFF, 0xFF, 0xFF, 0x00,
-       0x00, 0xD4, 0xFF, 0x79, 0xFF, 0xAD, 0xFF, 0x8C, 0x01, 0x95, 0x05,
-       0xDA, 0x0A, 0x3D, 0x0F, 0xA2, 0x10, 0x53, 0x0E, 0x7A, 0x09, 0x5B,
-       0x04, 0xDB, 0x00, 0x81, 0xFF, 0x8E, 0xFF, 0xE7, 0xFF, 0xF9, 0xFF,
-       0xB4, 0xFF, 0x6C, 0xFF, 0x19, 0x00, 0xBE, 0x02, 0x65, 0x07, 0xA1,
-       0x0C, 0x27, 0x10, 0x37, 0x10, 0xCA, 0x0C, 0x94, 0x07, 0xDF, 0x02,
-       0x27, 0x00, 0x6C, 0xFF, 0xB0, 0xFF, 0xF8, 0xFF, 0xE9, 0xFF, 0x91,
-       0xFF, 0x7D, 0xFF, 0xC6, 0x00, 0x34, 0x04, 0x4B, 0x09, 0x30, 0x0E,
-       0x9D, 0x10, 0x58, 0x0F, 0x08, 0x0B, 0xC0, 0x05, 0xA6, 0x01, 0xB5,
-       0xFF, 0x77, 0xFF, 0xD1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0xFF,
-       0x75, 0xFF, 0xBB, 0xFF, 0xBC, 0x01, 0xE3, 0x05, 0x2C, 0x0B, 0x6D,
-       0x0F, 0x98, 0x10, 0x14, 0x0E, 0x26, 0x09, 0x15, 0x04, 0xB7, 0x00,
-       0x7B, 0xFF, 0x93, 0xFF, 0xEB, 0xFF, 0xF7, 0xFF, 0xAE, 0xFF, 0x6D,
-       0xFF, 0x32, 0x00, 0xFA, 0x02, 0xB9, 0x07, 0xEB, 0x0C, 0x44, 0x10,
-       0x19, 0x10, 0x80, 0x0C, 0x41, 0x07, 0xA4, 0x02, 0x0E, 0x00, 0x6C,
-       0xFF, 0xB6, 0xFF, 0xFA, 0xFF, 0xE5, 0xFF, 0x8B, 0xFF, 0x85, 0xFF,
-       0xEC, 0x00, 0x7B, 0x04, 0xA0, 0x09, 0x6E, 0x0E, 0xA5, 0x10, 0x27,
-       0x0F, 0xB6, 0x0A, 0x72, 0x05, 0x78, 0x01, 0xA7, 0xFF, 0x7B, 0xFF,
-       0xD6, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0xCA, 0xFF, 0x72, 0xFF, 0xCB,
-       0xFF, 0xEE, 0x01, 0x32, 0x06, 0x7C, 0x0B, 0x9A, 0x0F, 0x8B, 0x10,
-       0xD3, 0x0D, 0xD1, 0x08, 0xD0, 0x03, 0x94, 0x00, 0x76, 0xFF, 0x99,
-       0xFF, 0xEE, 0xFF, 0xF5, 0xFF, 0xA7, 0xFF, 0x6E, 0xFF, 0x4D, 0x00,
-       0x38, 0x03, 0x0D, 0x08, 0x33, 0x0D, 0x5D, 0x10, 0xF7, 0x0F, 0x34,
-       0x0C, 0xEE, 0x06, 0x6B, 0x02, 0xF8, 0xFF, 0x6D, 0xFF, 0xBC, 0xFF,
-       0xFC, 0xFF, 0xE1, 0xFF, 0x86, 0xFF, 0x8D, 0xFF, 0x13, 0x01, 0xC3,
-       0x04, 0xF4, 0x09, 0xA8, 0x0E, 0xAA, 0x10, 0xF3, 0x0E, 0x63, 0x0A,
-       0x26, 0x05, 0x4B, 0x01, 0x9B, 0xFF, 0x7F, 0xFF, 0xDB, 0xFF, 0x00,
-       0x00, 0xFD, 0xFF, 0xC4, 0xFF, 0x6F, 0xFF, 0xDD, 0xFF, 0x22, 0x02,
-       0x82, 0x06, 0xCC, 0x0B, 0xC4, 0x0F, 0x7A, 0x10, 0x90, 0x0D, 0x7D,
-       0x08, 0x8E, 0x03, 0x74, 0x00, 0x72, 0xFF, 0x9F, 0xFF, 0xF1, 0xFF,
-       0xF2, 0xFF, 0xA1, 0xFF, 0x70, 0xFF, 0x6A, 0x00, 0x78, 0x03, 0x61,
-       0x08, 0x79, 0x0D, 0x73, 0x10, 0xD1, 0x0F, 0xE6, 0x0B, 0x9D, 0x06,
-       0x34, 0x02, 0xE4, 0xFF, 0x6F, 0xFF, 0xC2, 0xFF, 0xFD, 0xFF, 0x00,
-       0x00, 0xDD, 0xFF, 0x81, 0xFF, 0x97, 0xFF, 0x3D, 0x01, 0x0D, 0x05,
-       0x47, 0x0A, 0xE1, 0x0E, 0xAA, 0x10, 0xBB, 0x0E, 0x10, 0x0A, 0xDC,
-       0x04, 0x21, 0x01, 0x90, 0xFF, 0x84, 0xFF, 0xE0, 0xFF, 0xFC, 0xFF,
-       0xBE, 0xFF, 0x6D, 0xFF, 0xF1, 0xFF, 0x58, 0x02, 0xD3, 0x06, 0x1A,
-       0x0C, 0xEB, 0x0F, 0x65, 0x10, 0x4B, 0x0D, 0x29, 0x08, 0x4D, 0x03,
-       0x57, 0x00, 0x6F, 0xFF, 0xA5, 0xFF, 0xF4, 0xFF, 0xEF, 0xFF, 0x9B,
-       0xFF, 0x74, 0xFF, 0x8A, 0x00, 0xBA, 0x03, 0xB5, 0x08, 0xBD, 0x0D,
-       0x86, 0x10, 0xA9, 0x0F, 0x97, 0x0B, 0x4C, 0x06, 0xFF, 0x01, 0xD1,
-       0xFF, 0x71, 0xFF, 0xC8, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0xD8, 0xFF,
-       0x7C, 0xFF, 0xA3, 0xFF, 0x69, 0x01, 0x59, 0x05, 0x9A, 0x0A, 0x16,
-       0x0F, 0xA7, 0x10, 0x82, 0x0E, 0xBC, 0x09, 0x93, 0x04, 0xF9, 0x00,
-       0x87, 0xFF, 0x89, 0xFF, 0xE4, 0xFF, 0xFB, 0xFF, 0xB8, 0xFF, 0x6C,
-       0xFF, 0x07, 0x00, 0x91, 0x02, 0x25, 0x07, 0x67, 0x0C, 0x0E, 0x10,
-       0x4D, 0x10, 0x03, 0x0D, 0xD5, 0x07, 0x0E, 0x03, 0x3B, 0x00, 0x6D,
-       0xFF, 0xAC, 0xFF, 0xF7, 0xFF, 0xEC, 0xFF, 0x95, 0xFF, 0x79, 0xFF,
-       0xAB, 0x00, 0xFE, 0x03, 0x0A, 0x09, 0xFF, 0x0D, 0x94, 0x10, 0x7D,
-       0x0F, 0x47, 0x0B, 0xFD, 0x05, 0xCC, 0x01, 0xC0, 0xFF, 0x74, 0xFF,
-       0xCD, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xD3, 0xFF, 0x78, 0xFF, 0xB0,
-       0xFF, 0x97, 0x01, 0xA6, 0x05, 0xEC, 0x0A, 0x48, 0x0F, 0xA0, 0x10,
-       0x45, 0x0E, 0x67, 0x09, 0x4B, 0x04, 0xD3, 0x00, 0x80, 0xFF, 0x8F,
-       0xFF, 0xE8, 0xFF, 0xF9, 0xFF, 0xB2, 0xFF, 0x6C, 0xFF, 0x1E, 0x00,
-       0xCB, 0x02, 0x78, 0x07, 0xB2, 0x0C, 0x2E, 0x10, 0x31, 0x10, 0xBA,
-       0x0C, 0x81, 0x07, 0xD2, 0x02, 0x21, 0x00, 0x6C, 0xFF, 0xB2, 0xFF,
-       0xF9, 0xFF, 0xE8, 0xFF, 0x90, 0xFF, 0x7F, 0xFF, 0xCF, 0x00, 0x43,
-       0x04, 0x5E, 0x09, 0x3E, 0x0E, 0x9F, 0x10, 0x4E, 0x0F, 0xF6, 0x0A,
-       0xAE, 0x05, 0x9C, 0x01, 0xB1, 0xFF, 0x78, 0xFF, 0xD2, 0xFF, 0xFF,
-       0xFF, 0xFF, 0xFF, 0xCE, 0xFF, 0x74, 0xFF, 0xBF, 0xFF, 0xC7, 0x01,
-       0xF4, 0x05, 0x3E, 0x0B, 0x78, 0x0F, 0x96, 0x10, 0x06, 0x0E, 0x13,
-       0x09, 0x05, 0x04, 0xAF, 0x00, 0x79, 0xFF, 0x95, 0xFF, 0xEC, 0xFF,
-       0xF7, 0xFF, 0xAC, 0xFF, 0x6D, 0xFF, 0x38, 0x00, 0x07, 0x03, 0xCB,
-       0x07, 0xFB, 0x0C, 0x4A, 0x10, 0x11, 0x10, 0x6F, 0x0C, 0x2E, 0x07,
-       0x97, 0x02, 0x09, 0x00, 0x6C, 0xFF, 0xB8, 0xFF, 0xFA, 0xFF, 0xE4,
-       0xFF, 0x8A, 0xFF, 0x86, 0xFF, 0xF4, 0x00, 0x8B, 0x04, 0xB2, 0x09,
-       0x7B, 0x0E, 0xA7, 0x10, 0x1C, 0x0F, 0xA3, 0x0A, 0x61, 0x05, 0x6E,
-       0x01, 0xA4, 0xFF, 0x7C, 0xFF, 0xD8, 0xFF, 0x00, 0x00, 0xFE, 0xFF,
-       0xC8, 0xFF, 0x71, 0xFF, 0xCF, 0xFF, 0xF9, 0x01, 0x43, 0x06, 0x8E,
-       0x0B, 0xA4, 0x0F, 0x88, 0x10, 0xC4, 0x0D, 0xBE, 0x08, 0xC1, 0x03,
-       0x8D, 0x00, 0x75, 0xFF, 0x9B, 0xFF, 0xEF, 0xFF, 0xF4, 0xFF, 0xA6,
-       0xFF, 0x6E, 0xFF, 0x53, 0x00, 0x46, 0x03, 0x1F, 0x08, 0x43, 0x0D,
-       0x63, 0x10, 0xEF, 0x0F, 0x23, 0x0C, 0xDC, 0x06, 0x5E, 0x02, 0xF3,
-       0xFF, 0x6D, 0xFF, 0xBE, 0xFF, 0xFC, 0xFF, 0xE0, 0xFF, 0x85, 0xFF,
-       0x8F, 0xFF, 0x1C, 0x01, 0xD3, 0x04, 0x06, 0x0A, 0xB5, 0x0E, 0xAA,
-       0x10, 0xE7, 0x0E, 0x50, 0x0A, 0x16, 0x05, 0x42, 0x01, 0x98, 0xFF,
-       0x80, 0xFF, 0xDC, 0xFF, 0x00, 0x00, 0xFD, 0xFF, 0xC3, 0xFF, 0x6F,
-       0xFF, 0xE1, 0xFF, 0x2E, 0x02, 0x94, 0x06, 0xDD, 0x0B, 0xCD, 0x0F,
-       0x76, 0x10, 0x81, 0x0D, 0x6A, 0x08, 0x7F, 0x03, 0x6E, 0x00, 0x71,
-       0xFF, 0xA1, 0xFF, 0xF2, 0xFF, 0x00, 0x00, 0x15, 0x00, 0xD1, 0xFF,
-       0x8B, 0xFE, 0xBC, 0xFD, 0xE1, 0x00, 0x84, 0x09, 0xB0, 0x13, 0x47,
-       0x18, 0xB0, 0x13, 0x84, 0x09, 0xE1, 0x00, 0xBC, 0xFD, 0x8B, 0xFE,
-       0xD1, 0xFF, 0x15, 0x00, 0xFD, 0xFF, 0x13, 0x00, 0xDA, 0x00, 0x30,
-       0x00, 0x5D, 0xFC, 0xB3, 0xFC, 0x35, 0x0A, 0xC2, 0x1C, 0x24, 0x20,
-       0x48, 0x10, 0x5D, 0xFF, 0x74, 0xFB, 0x3A, 0xFF, 0xFB, 0x00, 0x42,
-       0x00, 0xF8, 0xFF, 0xFA, 0xFF, 0x2C, 0x00, 0xF3, 0x00, 0xAD, 0xFF,
-       0xC5, 0xFB, 0x11, 0xFE, 0xAF, 0x0D, 0xEF, 0x1E, 0x68, 0x1E, 0xBC,
-       0x0C, 0xA7, 0xFD, 0xEA, 0xFB, 0xD3, 0xFF, 0xEE, 0x00, 0x24, 0x00,
-       0xFA, 0xFF, 0xF7, 0xFF, 0x4C, 0x00, 0xFB, 0x00, 0x0C, 0xFF, 0x5F,
-       0xFB, 0xE8, 0xFF, 0x3D, 0x11, 0x7E, 0x20, 0x13, 0x1C, 0x4C, 0x09,
-       0x6A, 0xFC, 0x8C, 0xFC, 0x4E, 0x00, 0xD1, 0x00, 0x0E, 0x00, 0xFD,
-       0xFF, 0xF7, 0xFF, 0x72, 0x00, 0xEC, 0x00, 0x55, 0xFE, 0x3D, 0xFB,
-       0x37, 0x02, 0xBE, 0x14, 0x5D, 0x21, 0x40, 0x19, 0x18, 0x06, 0xA2,
-       0xFB, 0x47, 0xFD, 0xA7, 0x00, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0xFC, 0xFF, 0x9B, 0x00, 0xC0, 0x00, 0x92, 0xFD, 0x73,
-       0xFB, 0xF2, 0x04, 0x0E, 0x18, 0x81, 0x21, 0x0C, 0x16, 0x37, 0x03,
-       0x47, 0xFB, 0x0B, 0xFE, 0xDF, 0x00, 0x82, 0x00, 0xF9, 0xFF, 0xFE,
-       0xFF, 0x08, 0x00, 0xC3, 0x00, 0x74, 0x00, 0xD2, 0xFC, 0x10, 0xFC,
-       0x08, 0x08, 0x0A, 0x1B, 0xE9, 0x20, 0x9A, 0x12, 0xBE, 0x00, 0x49,
-       0xFB, 0xC8, 0xFE, 0xF9, 0x00, 0x5A, 0x00, 0xF7, 0xFF, 0xFC, 0xFF,
-       0x1B, 0x00, 0xE4, 0x00, 0x06, 0x00, 0x24, 0xFC, 0x1E, 0xFD, 0x65,
-       0x0B, 0x94, 0x1D, 0x9D, 0x1F, 0x0D, 0x0F, 0xB8, 0xFE, 0x96, 0xFB,
-       0x72, 0xFF, 0xF9, 0x00, 0x37, 0x00, 0xF8, 0xFF, 0xF9, 0xFF, 0x36,
-       0x00, 0xF8, 0x00, 0x78, 0xFF, 0x9B, 0xFB, 0xA6, 0xFE, 0xE9, 0x0E,
-       0x8D, 0x1F, 0xAA, 0x1D, 0x87, 0x0B, 0x2B, 0xFD, 0x1E, 0xFC, 0x02,
-       0x00, 0xE5, 0x00, 0x1C, 0x00, 0xFB, 0xFF, 0xF7, 0xFF, 0x58, 0x00,
-       0xF9, 0x00, 0xCF, 0xFE, 0x4A, 0xFB, 0xA7, 0x00, 0x77, 0x12, 0xE0,
-       0x20, 0x26, 0x1B, 0x28, 0x08, 0x18, 0xFC, 0xCB, 0xFC, 0x71, 0x00,
-       0xC5, 0x00, 0x08, 0x00, 0xFE, 0xFF, 0xF8, 0xFF, 0x80, 0x00, 0xE1,
-       0x00, 0x13, 0xFE, 0x45, 0xFB, 0x1D, 0x03, 0xEB, 0x15, 0x7F, 0x21,
-       0x2D, 0x18, 0x0E, 0x05, 0x77, 0xFB, 0x8B, 0xFD, 0xBE, 0x00, 0x9D,
-       0x00, 0xFD, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA9, 0x00,
-       0xAA, 0x00, 0x4F, 0xFD, 0x9D, 0xFB, 0xFA, 0x05, 0x22, 0x19, 0x62,
-       0x21, 0xE0, 0x14, 0x50, 0x02, 0x3E, 0xFB, 0x4E, 0xFE, 0xEB, 0x00,
-       0x73, 0x00, 0xF7, 0xFF, 0xFE, 0xFF, 0x0D, 0x00, 0xD0, 0x00, 0x52,
-       0x00, 0x93, 0xFC, 0x60, 0xFC, 0x2C, 0x09, 0xFA, 0x1B, 0x8A, 0x20,
-       0x60, 0x11, 0xFD, 0xFF, 0x5C, 0xFB, 0x06, 0xFF, 0xFB, 0x00, 0x4D,
-       0x00, 0xF7, 0xFF, 0xFA, 0xFF, 0x23, 0x00, 0xED, 0x00, 0xD9, 0xFF,
-       0xEF, 0xFB, 0x98, 0xFD, 0x99, 0x0C, 0x54, 0x1E, 0x02, 0x1F, 0xD2,
-       0x0D, 0x20, 0xFE, 0xC0, 0xFB, 0xA7, 0xFF, 0xF4, 0x00, 0x2D, 0x00,
-       0xF9, 0xFF, 0xF8, 0xFF, 0x41, 0x00, 0xFB, 0x00, 0x41, 0xFF, 0x78,
-       0xFB, 0x4A, 0xFF, 0x25, 0x10, 0x16, 0x20, 0xDA, 0x1C, 0x56, 0x0A,
-       0xBE, 0xFC, 0x56, 0xFC, 0x2C, 0x00, 0xDB, 0x00, 0x14, 0x00, 0xFD,
-       0xFF, 0xF7, 0xFF, 0x66, 0x00, 0xF4, 0x00, 0x8F, 0xFE, 0x3F, 0xFB,
-       0x75, 0x01, 0xAE, 0x13, 0x2C, 0x21, 0x2A, 0x1A, 0x0D, 0x07, 0xD4,
-       0xFB, 0x0C, 0xFD, 0x8F, 0x00, 0xB7, 0x00, 0x03, 0x00, 0xFF, 0xFF,
-       0x00, 0x00, 0xFA, 0xFF, 0x8E, 0x00, 0xD1, 0x00, 0xCF, 0xFD, 0x58,
-       0xFB, 0x10, 0x04, 0x10, 0x17, 0x8A, 0x21, 0x10, 0x17, 0x10, 0x04,
-       0x58, 0xFB, 0xCF, 0xFD, 0xD1, 0x00, 0x8E, 0x00, 0xFA, 0xFF, 0xFF,
-       0xFF, 0x03, 0x00, 0xB7, 0x00, 0x8F, 0x00, 0x0C, 0xFD, 0xD4, 0xFB,
-       0x0D, 0x07, 0x2A, 0x1A, 0x2C, 0x21, 0xAE, 0x13, 0x75, 0x01, 0x3F,
-       0xFB, 0x8F, 0xFE, 0xF4, 0x00, 0x66, 0x00, 0xF7, 0xFF, 0xFD, 0xFF,
-       0x14, 0x00, 0xDB, 0x00, 0x2C, 0x00, 0x56, 0xFC, 0xBE, 0xFC, 0x56,
-       0x0A, 0xDA, 0x1C, 0x16, 0x20, 0x25, 0x10, 0x4A, 0xFF, 0x78, 0xFB,
-       0x41, 0xFF, 0xFB, 0x00, 0x41, 0x00, 0xF8, 0xFF, 0xF9, 0xFF, 0x2D,
-       0x00, 0xF4, 0x00, 0xA7, 0xFF, 0xC0, 0xFB, 0x20, 0xFE, 0xD2, 0x0D,
-       0x02, 0x1F, 0x54, 0x1E, 0x99, 0x0C, 0x98, 0xFD, 0xEF, 0xFB, 0xD9,
-       0xFF, 0xED, 0x00, 0x23, 0x00, 0xFA, 0xFF, 0xF7, 0xFF, 0x4D, 0x00,
-       0xFB, 0x00, 0x06, 0xFF, 0x5C, 0xFB, 0xFD, 0xFF, 0x60, 0x11, 0x8A,
-       0x20, 0xFA, 0x1B, 0x2C, 0x09, 0x60, 0xFC, 0x93, 0xFC, 0x52, 0x00,
-       0xD0, 0x00, 0x0D, 0x00, 0xFE, 0xFF, 0xF7, 0xFF, 0x73, 0x00, 0xEB,
-       0x00, 0x4E, 0xFE, 0x3E, 0xFB, 0x50, 0x02, 0xE0, 0x14, 0x62, 0x21,
-       0x22, 0x19, 0xFA, 0x05, 0x9D, 0xFB, 0x4F, 0xFD, 0xAA, 0x00, 0xA9,
-       0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0x9D, 0x00,
-       0xBE, 0x00, 0x8B, 0xFD, 0x77, 0xFB, 0x0E, 0x05, 0x2D, 0x18, 0x7F,
-       0x21, 0xEB, 0x15, 0x1D, 0x03, 0x45, 0xFB, 0x13, 0xFE, 0xE1, 0x00,
-       0x80, 0x00, 0xF8, 0xFF, 0xFE, 0xFF, 0x08, 0x00, 0xC5, 0x00, 0x71,
-       0x00, 0xCB, 0xFC, 0x18, 0xFC, 0x28, 0x08, 0x26, 0x1B, 0xE0, 0x20,
-       0x77, 0x12, 0xA7, 0x00, 0x4A, 0xFB, 0xCF, 0xFE, 0xF9, 0x00, 0x58,
-       0x00, 0xF7, 0xFF, 0xFB, 0xFF, 0x1C, 0x00, 0xE5, 0x00, 0x02, 0x00,
-       0x1E, 0xFC, 0x2B, 0xFD, 0x87, 0x0B, 0xAA, 0x1D, 0x8D, 0x1F, 0xE9,
-       0x0E, 0xA6, 0xFE, 0x9B, 0xFB, 0x78, 0xFF, 0xF8, 0x00, 0x36, 0x00,
-       0xF9, 0xFF, 0xF8, 0xFF, 0x37, 0x00, 0xF9, 0x00, 0x72, 0xFF, 0x96,
-       0xFB, 0xB8, 0xFE, 0x0D, 0x0F, 0x9D, 0x1F, 0x94, 0x1D, 0x65, 0x0B,
-       0x1E, 0xFD, 0x24, 0xFC, 0x06, 0x00, 0xE4, 0x00, 0x1B, 0x00, 0xFC,
-       0xFF, 0xF7, 0xFF, 0x5A, 0x00, 0xF9, 0x00, 0xC8, 0xFE, 0x49, 0xFB,
-       0xBE, 0x00, 0x9A, 0x12, 0xE9, 0x20, 0x0A, 0x1B, 0x08, 0x08, 0x10,
-       0xFC, 0xD2, 0xFC, 0x74, 0x00, 0xC3, 0x00, 0x08, 0x00, 0xFE, 0xFF,
-       0xF9, 0xFF, 0x82, 0x00, 0xDF, 0x00, 0x0B, 0xFE, 0x47, 0xFB, 0x37,
-       0x03, 0x0C, 0x16, 0x81, 0x21, 0x0E, 0x18, 0xF2, 0x04, 0x73, 0xFB,
-       0x92, 0xFD, 0xC0, 0x00, 0x9B, 0x00, 0xFC, 0xFF, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0xAB, 0x00, 0xA7, 0x00, 0x47, 0xFD, 0xA2, 0xFB,
-       0x18, 0x06, 0x40, 0x19, 0x5D, 0x21, 0xBE, 0x14, 0x37, 0x02, 0x3D,
-       0xFB, 0x55, 0xFE, 0xEC, 0x00, 0x72, 0x00, 0xF7, 0xFF, 0xFD, 0xFF,
-       0x0E, 0x00, 0xD1, 0x00, 0x4E, 0x00, 0x8C, 0xFC, 0x6A, 0xFC, 0x4C,
-       0x09, 0x13, 0x1C, 0x7E, 0x20, 0x3D, 0x11, 0xE8, 0xFF, 0x5F, 0xFB,
-       0x0C, 0xFF, 0xFB, 0x00, 0x4C, 0x00, 0xF7, 0xFF, 0xFA, 0xFF, 0x24,
-       0x00, 0xEE, 0x00, 0xD3, 0xFF, 0xEA, 0xFB, 0xA7, 0xFD, 0xBC, 0x0C,
-       0x68, 0x1E, 0xEF, 0x1E, 0xAF, 0x0D, 0x11, 0xFE, 0xC5, 0xFB, 0xAD,
-       0xFF, 0xF3, 0x00, 0x2C, 0x00, 0xFA, 0xFF, 0xF8, 0xFF, 0x42, 0x00,
-       0xFB, 0x00, 0x3A, 0xFF, 0x74, 0xFB, 0x5D, 0xFF, 0x48, 0x10, 0x24,
-       0x20, 0xC2, 0x1C, 0x35, 0x0A, 0xB3, 0xFC, 0x5D, 0xFC, 0x30, 0x00,
-       0xDA, 0x00, 0x13, 0x00, 0xFD, 0xFF, 0xF7, 0xFF, 0x67, 0x00, 0xF3,
-       0x00, 0x88, 0xFE, 0x3E, 0xFB, 0x8C, 0x01, 0xD0, 0x13, 0x33, 0x21,
-       0x0D, 0x1A, 0xEE, 0x06, 0xCD, 0xFB, 0x13, 0xFD, 0x92, 0x00, 0xB6,
-       0x00, 0x03, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFA, 0xFF, 0x90, 0x00,
-       0xCF, 0x00, 0xC7, 0xFD, 0x5B, 0xFB, 0x2B, 0x04, 0x31, 0x17, 0x8A,
-       0x21, 0xF0, 0x16, 0xF4, 0x03, 0x56, 0xFB, 0xD6, 0xFD, 0xD3, 0x00,
-       0x8D, 0x00, 0xFA, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0xB9, 0x00, 0x8C,
-       0x00, 0x05, 0xFD, 0xDB, 0xFB, 0x2C, 0x07, 0x47, 0x1A, 0x25, 0x21,
-       0x8B, 0x13, 0x5D, 0x01, 0x40, 0xFB, 0x97, 0xFE, 0xF5, 0x00, 0x64,
-       0x00, 0xF7, 0xFF, 0xFC, 0xFF, 0x15, 0x00, 0xDC, 0x00, 0x27, 0x00,
-       0x50, 0xFC, 0xCA, 0xFC, 0x78, 0x0A, 0xF2, 0x1C, 0x07, 0x20, 0x02,
-       0x10, 0x37, 0xFF, 0x7B, 0xFB, 0x47, 0xFF, 0xFB, 0x00, 0x40, 0x00,
-       0xF8, 0xFF, 0xF9, 0xFF, 0x2E, 0x00, 0xF5, 0x00, 0xA2, 0xFF, 0xBB,
-       0xFB, 0x31, 0xFE, 0xF5, 0x0D, 0x14, 0x1F, 0x3F, 0x1E, 0x77, 0x0C,
-       0x8A, 0xFD, 0xF5, 0xFB, 0xDE, 0xFF, 0xEC, 0x00, 0x22, 0x00, 0xFB,
-       0xFF, 0xF7, 0xFF, 0x4E, 0x00, 0xFB, 0x00, 0xFF, 0xFE, 0x59, 0xFB,
-       0x11, 0x00, 0x83, 0x11, 0x96, 0x20, 0xE0, 0x1B, 0x0B, 0x09, 0x56,
-       0xFC, 0x99, 0xFC, 0x56, 0x00, 0xCE, 0x00, 0x0D, 0x00, 0xFE, 0xFF,
-       0xF8, 0xFF, 0x75, 0x00, 0xEA, 0x00, 0x47, 0xFE, 0x3E, 0xFB, 0x69,
-       0x02, 0x02, 0x15, 0x66, 0x21, 0x04, 0x19, 0xDC, 0x05, 0x98, 0xFB,
-       0x56, 0xFD, 0xAD, 0x00, 0xA8, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00,
-       0x00, 0xFD, 0xFF, 0x9E, 0x00, 0xBC, 0x00, 0x83, 0xFD, 0x7B, 0xFB,
-       0x2B, 0x05, 0x4C, 0x18, 0x7C, 0x21, 0xCA, 0x15, 0x03, 0x03, 0x44,
-       0xFB, 0x1A, 0xFE, 0xE2, 0x00, 0x7E, 0x00, 0xF8, 0xFF, 0xFE, 0xFF,
-       0x09, 0x00, 0xC6, 0x00, 0x6D, 0x00, 0xC3, 0xFC, 0x20, 0xFC, 0x49,
-       0x08, 0x41, 0x1B, 0xD6, 0x20, 0x54, 0x12, 0x92, 0x00, 0x4C, 0xFB,
-       0xD6, 0xFE, 0xFA, 0x00, 0x57, 0x00, 0xF7, 0xFF, 0xFB, 0xFF, 0x1D,
-       0x00, 0xE6, 0x00, 0xFD, 0xFF, 0x18, 0xFC, 0x38, 0xFD, 0xA9, 0x0B,
-       0xC0, 0x1D, 0x7C, 0x1F, 0xC6, 0x0E, 0x95, 0xFE, 0x9F, 0xFB, 0x7E,
-       0xFF, 0xF8, 0x00, 0x35, 0x00, 0xF9, 0xFF, 0xF8, 0xFF, 0x38, 0x00,
-       0xF9, 0x00, 0x6C, 0xFF, 0x92, 0xFB, 0xC9, 0xFE, 0x2F, 0x0F, 0xAD,
-       0x1F, 0x7D, 0x1D, 0x42, 0x0B, 0x12, 0xFD, 0x2A, 0xFC, 0x0B, 0x00,
-       0xE3, 0x00, 0x1A, 0x00, 0xFC, 0xFF, 0xF7, 0xFF, 0x5B, 0x00, 0xF8,
-       0x00, 0xC1, 0xFE, 0x47, 0xFB, 0xD4, 0x00, 0xBC, 0x12, 0xF3, 0x20,
-       0xEF, 0x1A, 0xE9, 0x07, 0x08, 0xFC, 0xD9, 0xFC, 0x78, 0x00, 0xC2,
-       0x00, 0x07, 0x00, 0xFF, 0xFF, 0xF9, 0xFF, 0x83, 0x00, 0xDD, 0x00,
-       0x04, 0xFE, 0x49, 0xFB, 0x52, 0x03, 0x2D, 0x16, 0x83, 0x21, 0xEF,
-       0x17, 0xD5, 0x04, 0x6F, 0xFB, 0x9A, 0xFD, 0xC3, 0x00, 0x9A, 0x00,
-       0xFC, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xAD, 0x00, 0xA4,
-       0x00, 0x40, 0xFD, 0xA8, 0xFB, 0x36, 0x06, 0x5E, 0x19, 0x58, 0x21,
-       0x9C, 0x14, 0x1E, 0x02, 0x3D, 0xFB, 0x5D, 0xFE, 0xED, 0x00, 0x70,
-       0x00, 0xF7, 0xFF, 0xFD, 0xFF, 0x0F, 0x00, 0xD2, 0x00, 0x4A, 0x00,
-       0x85, 0xFC, 0x74, 0xFC, 0x6D, 0x09, 0x2D, 0x1C, 0x72, 0x20, 0x1A,
-       0x11, 0xD4, 0xFF, 0x61, 0xFB, 0x13, 0xFF, 0xFC, 0x00, 0x4A, 0x00,
-       0xF7, 0xFF, 0xFA, 0xFF, 0x25, 0x00, 0xEF, 0x00, 0xCE, 0xFF, 0xE4,
-       0xFB, 0xB5, 0xFD, 0xDE, 0x0C, 0x7C, 0x1E, 0xDD, 0x1E, 0x8C, 0x0D,
-       0x01, 0xFE, 0xCA, 0xFB, 0xB3, 0xFF, 0xF3, 0x00, 0x2B, 0x00, 0xFA,
-       0xFF, 0xF8, 0xFF, 0x44, 0x00, 0xFB, 0x00, 0x34, 0xFF, 0x71, 0xFB,
-       0x71, 0xFF, 0x6B, 0x10, 0x32, 0x20, 0xA9, 0x1C, 0x13, 0x0A, 0xA8,
-       0xFC, 0x63, 0xFC, 0x35, 0x00, 0xD9, 0x00, 0x12, 0x00, 0xFD, 0xFF,
-       0xF7, 0xFF, 0x69, 0x00, 0xF2, 0x00, 0x81, 0xFE, 0x3E, 0xFB, 0xA4,
-       0x01, 0xF2, 0x13, 0x3A, 0x21, 0xF0, 0x19, 0xCF, 0x06, 0xC7, 0xFB,
-       0x1B, 0xFD, 0x96, 0x00, 0xB4, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0x00,
-       0x00, 0xFB, 0xFF, 0x92, 0x00, 0xCD, 0x00, 0xC0, 0xFD, 0x5E, 0xFB,
-       0x47, 0x04, 0x51, 0x17, 0x8A, 0x21, 0xD0, 0x16, 0xD9, 0x03, 0x53,
-       0xFB, 0xDE, 0xFD, 0xD5, 0x00, 0x8B, 0x00, 0xFA, 0xFF, 0xFF, 0xFF,
-       0x04, 0x00, 0xBA, 0x00, 0x89, 0x00, 0xFD, 0xFC, 0xE2, 0xFB, 0x4B,
-       0x07, 0x63, 0x1A, 0x1D, 0x21, 0x69, 0x13, 0x46, 0x01, 0x41, 0xFB,
-       0x9E, 0xFE, 0xF5, 0x00, 0x63, 0x00, 0xF7, 0xFF, 0xFC, 0xFF, 0x16,
-       0x00, 0xDD, 0x00, 0x23, 0x00, 0x49, 0xFC, 0xD5, 0xFC, 0x99, 0x0A,
-       0x09, 0x1D, 0xF9, 0x1F, 0xDF, 0x0F, 0x24, 0xFF, 0x7F, 0xFB, 0x4D,
-       0xFF, 0xFB, 0x00, 0x3F, 0x00, 0xF8, 0xFF, 0xF9, 0xFF, 0x2F, 0x00,
-       0xF5, 0x00, 0x9C, 0xFF, 0xB6, 0xFB, 0x41, 0xFE, 0x17, 0x0E, 0x26,
-       0x1F, 0x2B, 0x1E, 0x54, 0x0C, 0x7C, 0xFD, 0xFA, 0xFB, 0xE3, 0xFF,
-       0xEB, 0x00, 0x21, 0x00, 0xFB, 0xFF, 0xF7, 0xFF, 0x50, 0x00, 0xFB,
-       0x00, 0xF8, 0xFE, 0x57, 0xFB, 0x26, 0x00, 0xA6, 0x11, 0xA1, 0x20,
-       0xC6, 0x1B, 0xEA, 0x08, 0x4D, 0xFC, 0xA0, 0xFC, 0x5A, 0x00, 0xCD,
-       0x00, 0x0C, 0x00, 0xFE, 0xFF, 0xF8, 0xFF, 0x77, 0x00, 0xE9, 0x00,
-       0x3F, 0xFE, 0x3F, 0xFB, 0x82, 0x02, 0x23, 0x15, 0x6B, 0x21, 0xE5,
-       0x18, 0xBE, 0x05, 0x93, 0xFB, 0x5E, 0xFD, 0xAF, 0x00, 0xA6, 0x00,
-       0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0xA0, 0x00, 0xB9,
-       0x00, 0x7C, 0xFD, 0x80, 0xFB, 0x48, 0x05, 0x6B, 0x18, 0x79, 0x21,
-       0xA9, 0x15, 0xE9, 0x02, 0x43, 0xFB, 0x21, 0xFE, 0xE3, 0x00, 0x7D,
-       0x00, 0xF8, 0xFF, 0xFE, 0xFF, 0x09, 0x00, 0xC7, 0x00, 0x69, 0x00,
-       0xBC, 0xFC, 0x29, 0xFC, 0x69, 0x08, 0x5C, 0x1B, 0xCC, 0x20, 0x32,
-       0x12, 0x7C, 0x00, 0x4E, 0xFB, 0xDD, 0xFE, 0xFA, 0x00, 0x56, 0x00,
-       0xF7, 0xFF, 0xFB, 0xFF, 0x1D, 0x00, 0xE7, 0x00, 0xF8, 0xFF, 0x12,
-       0xFC, 0x45, 0xFD, 0xCB, 0x0B, 0xD6, 0x1D, 0x6C, 0x1F, 0xA3, 0x0E,
-       0x84, 0xFE, 0xA4, 0xFB, 0x84, 0xFF, 0xF7, 0x00, 0x34, 0x00, 0xF9,
-       0xFF, 0xF8, 0xFF, 0x3A, 0x00, 0xFA, 0x00, 0x66, 0xFF, 0x8E, 0xFB,
-       0xDB, 0xFE, 0x53, 0x0F, 0xBD, 0x1F, 0x66, 0x1D, 0x21, 0x0B, 0x05,
-       0xFD, 0x30, 0xFC, 0x10, 0x00, 0xE2, 0x00, 0x19, 0x00, 0xFC, 0xFF,
-       0xF7, 0xFF, 0x5D, 0x00, 0xF8, 0x00, 0xBA, 0xFE, 0x46, 0xFB, 0xEA,
-       0x00, 0xDF, 0x12, 0xFC, 0x20, 0xD3, 0x1A, 0xC9, 0x07, 0x00, 0xFC,
-       0xE0, 0xFC, 0x7B, 0x00, 0xC0, 0x00, 0x07, 0x00, 0xFF, 0xFF, 0xF9,
-       0xFF, 0x85, 0x00, 0xDC, 0x00, 0xFC, 0xFD, 0x4A, 0xFB, 0x6C, 0x03,
-       0x4E, 0x16, 0x85, 0x21, 0xCF, 0x17, 0xB8, 0x04, 0x6C, 0xFB, 0xA2,
-       0xFD, 0xC5, 0x00, 0x98, 0x00, 0xFC, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
-       0x01, 0x00, 0xAE, 0x00, 0xA1, 0x00, 0x38, 0xFD, 0xAE, 0xFB, 0x54,
-       0x06, 0x7C, 0x19, 0x53, 0x21, 0x7B, 0x14, 0x05, 0x02, 0x3D, 0xFB,
-       0x64, 0xFE, 0xEE, 0x00, 0x6F, 0x00, 0xF7, 0xFF, 0xFD, 0xFF, 0x0F,
-       0x00, 0xD4, 0x00, 0x46, 0x00, 0x7E, 0xFC, 0x7E, 0xFC, 0x8E, 0x09,
-       0x46, 0x1C, 0x66, 0x20, 0xF7, 0x10, 0xC0, 0xFF, 0x64, 0xFB, 0x1A,
-       0xFF, 0xFC, 0x00, 0x49, 0x00, 0xF7, 0xFF, 0xFA, 0xFF, 0x26, 0x00,
-       0xF0, 0x00, 0xC9, 0xFF, 0xDF, 0xFB, 0xC4, 0xFD, 0x01, 0x0D, 0x90,
-       0x1E, 0xCA, 0x1E, 0x69, 0x0D, 0xF1, 0xFD, 0xCF, 0xFB, 0xB8, 0xFF,
-       0xF2, 0x00, 0x29, 0x00, 0xFA, 0xFF, 0xF7, 0xFF, 0x45, 0x00, 0xFC,
-       0x00, 0x2D, 0xFF, 0x6D, 0xFB, 0x84, 0xFF, 0x8E, 0x10, 0x3F, 0x20,
-       0x91, 0x1C, 0xF2, 0x09, 0x9D, 0xFC, 0x6A, 0xFC, 0x39, 0x00, 0xD7,
-       0x00, 0x12, 0x00, 0xFD, 0xFF, 0xF7, 0xFF, 0x6A, 0x00, 0xF1, 0x00,
-       0x7A, 0xFE, 0x3D, 0xFB, 0xBC, 0x01, 0x14, 0x14, 0x41, 0x21, 0xD4,
-       0x19, 0xB0, 0x06, 0xC0, 0xFB, 0x22, 0xFD, 0x99, 0x00, 0xB3, 0x00,
-       0x02, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFB, 0xFF, 0x93, 0x00, 0xCB,
-       0x00, 0xB8, 0xFD, 0x61, 0xFB, 0x63, 0x04, 0x71, 0x17, 0x89, 0x21,
-       0xB0, 0x16, 0xBD, 0x03, 0x51, 0xFB, 0xE6, 0xFD, 0xD7, 0x00, 0x8A,
-       0x00, 0xFA, 0xFF, 0xFF, 0xFF, 0x05, 0x00, 0xBC, 0x00, 0x86, 0x00,
-       0xF6, 0xFC, 0xE9, 0xFB, 0x6A, 0x07, 0x80, 0x1A, 0x15, 0x21, 0x47,
-       0x13, 0x2F, 0x01, 0x42, 0xFB, 0xA5, 0xFE, 0xF6, 0x00, 0x61, 0x00,
-       0xF7, 0xFF, 0xFC, 0xFF, 0x16, 0x00, 0xDF, 0x00, 0x1E, 0x00, 0x43,
-       0xFC, 0xE1, 0xFC, 0xBB, 0x0A, 0x21, 0x1D, 0xEA, 0x1F, 0xBC, 0x0F,
-       0x12, 0xFF, 0x82, 0xFB, 0x54, 0xFF, 0xFA, 0x00, 0x3D, 0x00, 0xF8,
-       0xFF, 0xF9, 0xFF, 0x30, 0x00, 0xF6, 0x00, 0x96, 0xFF, 0xB1, 0xFB,
-       0x51, 0xFE, 0x3A, 0x0E, 0x38, 0x1F, 0x16, 0x1E, 0x32, 0x0C, 0x6E,
-       0xFD, 0x00, 0xFC, 0xE8, 0xFF, 0xEA, 0x00, 0x20, 0x00, 0xFB, 0xFF,
-       0xF7, 0xFF, 0x51, 0x00, 0xFB, 0x00, 0xF1, 0xFE, 0x54, 0xFB, 0x3B,
-       0x00, 0xC9, 0x11, 0xAD, 0x20, 0xAC, 0x1B, 0xCA, 0x08, 0x44, 0xFC,
-       0xA7, 0xFC, 0x5E, 0x00, 0xCC, 0x00, 0x0B, 0x00, 0xFE, 0xFF, 0xF8,
-       0xFF, 0x78, 0x00, 0xE7, 0x00, 0x38, 0xFE, 0x40, 0xFB, 0x9B, 0x02,
-       0x45, 0x15, 0x6F, 0x21, 0xC7, 0x18, 0xA1, 0x05, 0x8E, 0xFB, 0x65,
-       0xFD, 0xB2, 0x00, 0xA5, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00,
-       0xFE, 0xFF, 0xA2, 0x00, 0xB7, 0x00, 0x74, 0xFD, 0x84, 0xFB, 0x66,
-       0x05, 0x8A, 0x18, 0x76, 0x21, 0x87, 0x15, 0xCF, 0x02, 0x41, 0xFB,
-       0x29, 0xFE, 0xE5, 0x00, 0x7B, 0x00, 0xF8, 0xFF, 0xFE, 0xFF, 0x0A,
-       0x00, 0xC9, 0x00, 0x66, 0x00, 0xB5, 0xFC, 0x32, 0xFC, 0x89, 0x08,
-       0x77, 0x1B, 0xC2, 0x20, 0x0F, 0x12, 0x66, 0x00, 0x50, 0xFB, 0xE4,
-       0xFE, 0xFA, 0x00, 0x54, 0x00, 0xF7, 0xFF, 0xFB, 0xFF, 0x1E, 0x00,
-       0xE8, 0x00, 0xF3, 0xFF, 0x0C, 0xFC, 0x53, 0xFD, 0xED, 0x0B, 0xEB,
-       0x1D, 0x5A, 0x1F, 0x80, 0x0E, 0x73, 0xFE, 0xA8, 0xFB, 0x8A, 0xFF,
-       0xF7, 0x00, 0x32, 0x00, 0xF9, 0xFF, 0xF8, 0xFF, 0x3B, 0x00, 0xFA,
-       0x00, 0x60, 0xFF, 0x8A, 0xFB, 0xED, 0xFE, 0x76, 0x0F, 0xCC, 0x1F,
-       0x4F, 0x1D, 0xFF, 0x0A, 0xF9, 0xFC, 0x36, 0xFC, 0x15, 0x00, 0xE1,
-       0x00, 0x18, 0x00, 0xFC, 0xFF, 0xF7, 0xFF, 0x5E, 0x00, 0xF7, 0x00,
-       0xB3, 0xFE, 0x44, 0xFB, 0x01, 0x01, 0x02, 0x13, 0x04, 0x21, 0xB8,
-       0x1A, 0xA9, 0x07, 0xF8, 0xFB, 0xE7, 0xFC, 0x7F, 0x00, 0xBF, 0x00,
-       0x06, 0x00, 0xFF, 0xFF, 0xF9, 0xFF, 0x86, 0x00, 0xDA, 0x00, 0xF5,
-       0xFD, 0x4C, 0xFB, 0x87, 0x03, 0x6E, 0x16, 0x86, 0x21, 0xB0, 0x17,
-       0x9C, 0x04, 0x68, 0xFB, 0xA9, 0xFD, 0xC7, 0x00, 0x96, 0x00, 0xFB,
-       0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0xB0, 0x00, 0x9F, 0x00,
-       0x31, 0xFD, 0xB4, 0xFB, 0x73, 0x06, 0x99, 0x19, 0x4D, 0x21, 0x59,
-       0x14, 0xED, 0x01, 0x3D, 0xFB, 0x6B, 0xFE, 0xEF, 0x00, 0x6D, 0x00,
-       0xF7, 0xFF, 0xFD, 0xFF, 0x10, 0x00, 0xD5, 0x00, 0x42, 0x00, 0x77,
-       0xFC, 0x88, 0xFC, 0xAF, 0x09, 0x5F, 0x1C, 0x59, 0x20, 0xD4, 0x10,
-       0xAC, 0xFF, 0x67, 0xFB, 0x20, 0xFF, 0xFC, 0x00, 0x48, 0x00, 0xF7,
-       0xFF, 0xFA, 0xFF, 0x27, 0x00, 0xF0, 0x00, 0xC3, 0xFF, 0xD9, 0xFB,
-       0xD3, 0xFD, 0x24, 0x0D, 0xA3, 0x1E, 0xB7, 0x1E, 0x46, 0x0D, 0xE2,
-       0xFD, 0xD4, 0xFB, 0xBE, 0xFF, 0xF1, 0x00, 0x28, 0x00, 0xFA, 0xFF,
-       0xF7, 0xFF, 0x46, 0x00, 0xFC, 0x00, 0x27, 0xFF, 0x6A, 0xFB, 0x98,
-       0xFF, 0xB1, 0x10, 0x4C, 0x20, 0x78, 0x1C, 0xD1, 0x09, 0x93, 0xFC,
-       0x71, 0xFC, 0x3D, 0x00, 0xD6, 0x00, 0x11, 0x00, 0xFD, 0xFF, 0xF7,
-       0xFF, 0x6C, 0x00, 0xF0, 0x00, 0x72, 0xFE, 0x3D, 0xFB, 0xD4, 0x01,
-       0x36, 0x14, 0x47, 0x21, 0xB6, 0x19, 0x91, 0x06, 0xBA, 0xFB, 0x29,
-       0xFD, 0x9C, 0x00, 0xB1, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0x00, 0x00,
-       0xFB, 0xFF, 0x95, 0x00, 0xC9, 0x00, 0xB1, 0xFD, 0x65, 0xFB, 0x80,
-       0x04, 0x90, 0x17, 0x88, 0x21, 0x8F, 0x16, 0xA2, 0x03, 0x4E, 0xFB,
-       0xED, 0xFD, 0xD9, 0x00, 0x88, 0x00, 0xF9, 0xFF, 0xFF, 0xFF, 0x05,
-       0x00, 0xBD, 0x00, 0x82, 0x00, 0xEF, 0xFC, 0xF0, 0xFB, 0x8A, 0x07,
-       0x9C, 0x1A, 0x0D, 0x21, 0x24, 0x13, 0x18, 0x01, 0x43, 0xFB, 0xAC,
-       0xFE, 0xF7, 0x00, 0x60, 0x00, 0xF7, 0xFF, 0xFC, 0xFF, 0x17, 0x00,
-       0xE0, 0x00, 0x1A, 0x00, 0x3D, 0xFC, 0xED, 0xFC, 0xDD, 0x0A, 0x38,
-       0x1D, 0xDB, 0x1F, 0x99, 0x0F, 0xFF, 0xFE, 0x86, 0xFB, 0x5A, 0xFF,
-       0xFA, 0x00, 0x3C, 0x00, 0xF8, 0xFF, 0xF9, 0xFF, 0x31, 0x00, 0xF6,
-       0x00, 0x90, 0xFF, 0xAD, 0xFB, 0x62, 0xFE, 0x5D, 0x0E, 0x49, 0x1F,
-       0x01, 0x1E, 0x10, 0x0C, 0x60, 0xFD, 0x06, 0xFC, 0xEE, 0xFF, 0xE9,
-       0x00, 0x1F, 0x00, 0xFB, 0xFF, 0xF7, 0xFF, 0x53, 0x00, 0xFB, 0x00,
-       0xEB, 0xFE, 0x52, 0xFB, 0x51, 0x00, 0xEC, 0x11, 0xB7, 0x20, 0x91,
-       0x1B, 0xA9, 0x08, 0x3B, 0xFC, 0xAE, 0xFC, 0x62, 0x00, 0xCA, 0x00,
-       0x0B, 0x00, 0xFE, 0xFF, 0xF8, 0xFF, 0x7A, 0x00, 0xE6, 0x00, 0x30,
-       0xFE, 0x40, 0xFB, 0xB5, 0x02, 0x66, 0x15, 0x73, 0x21, 0xA9, 0x18,
-       0x83, 0x05, 0x89, 0xFB, 0x6D, 0xFD, 0xB4, 0x00, 0xA3, 0x00, 0xFE,
-       0xFF, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xA3, 0x00, 0xB4, 0x00,
-       0x6D, 0xFD, 0x89, 0xFB, 0x83, 0x05, 0xA9, 0x18, 0x73, 0x21, 0x66,
-       0x15, 0xB5, 0x02, 0x40, 0xFB, 0x30, 0xFE, 0xE6, 0x00, 0x7A, 0x00,
-       0xF8, 0xFF, 0xFE, 0xFF, 0x0B, 0x00, 0xCA, 0x00, 0x62, 0x00, 0xAE,
-       0xFC, 0x3B, 0xFC, 0xA9, 0x08, 0x91, 0x1B, 0xB7, 0x20, 0xEC, 0x11,
-       0x51, 0x00, 0x52, 0xFB, 0xEB, 0xFE, 0xFB, 0x00, 0x53, 0x00, 0xF7,
-       0xFF, 0xFB, 0xFF, 0x1F, 0x00, 0xE9, 0x00, 0xEE, 0xFF, 0x06, 0xFC,
-       0x60, 0xFD, 0x10, 0x0C, 0x01, 0x1E, 0x49, 0x1F, 0x5D, 0x0E, 0x62,
-       0xFE, 0xAD, 0xFB, 0x90, 0xFF, 0xF6, 0x00, 0x31, 0x00, 0xF9, 0xFF,
-       0xF8, 0xFF, 0x3C, 0x00, 0xFA, 0x00, 0x5A, 0xFF, 0x86, 0xFB, 0xFF,
-       0xFE, 0x99, 0x0F, 0xDB, 0x1F, 0x38, 0x1D, 0xDD, 0x0A, 0xED, 0xFC,
-       0x3D, 0xFC, 0x1A, 0x00, 0xE0, 0x00, 0x17, 0x00, 0xFC, 0xFF, 0xF7,
-       0xFF, 0x60, 0x00, 0xF7, 0x00, 0xAC, 0xFE, 0x43, 0xFB, 0x18, 0x01,
-       0x24, 0x13, 0x0D, 0x21, 0x9C, 0x1A, 0x8A, 0x07, 0xF0, 0xFB, 0xEF,
-       0xFC, 0x82, 0x00, 0xBD, 0x00, 0x05, 0x00, 0xFF, 0xFF, 0xF9, 0xFF,
-       0x88, 0x00, 0xD9, 0x00, 0xED, 0xFD, 0x4E, 0xFB, 0xA2, 0x03, 0x8F,
-       0x16, 0x88, 0x21, 0x90, 0x17, 0x80, 0x04, 0x65, 0xFB, 0xB1, 0xFD,
-       0xC9, 0x00, 0x95, 0x00, 0xFB, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x02,
-       0x00, 0xB1, 0x00, 0x9C, 0x00, 0x29, 0xFD, 0xBA, 0xFB, 0x91, 0x06,
-       0xB6, 0x19, 0x47, 0x21, 0x36, 0x14, 0xD4, 0x01, 0x3D, 0xFB, 0x72,
-       0xFE, 0xF0, 0x00, 0x6C, 0x00, 0xF7, 0xFF, 0xFD, 0xFF, 0x11, 0x00,
-       0xD6, 0x00, 0x3D, 0x00, 0x71, 0xFC, 0x93, 0xFC, 0xD1, 0x09, 0x78,
-       0x1C, 0x4C, 0x20, 0xB1, 0x10, 0x98, 0xFF, 0x6A, 0xFB, 0x27, 0xFF,
-       0xFC, 0x00, 0x46, 0x00, 0xF7, 0xFF, 0xFA, 0xFF, 0x28, 0x00, 0xF1,
-       0x00, 0xBE, 0xFF, 0xD4, 0xFB, 0xE2, 0xFD, 0x46, 0x0D, 0xB7, 0x1E,
-       0xA3, 0x1E, 0x24, 0x0D, 0xD3, 0xFD, 0xD9, 0xFB, 0xC3, 0xFF, 0xF0,
-       0x00, 0x27, 0x00, 0xFA, 0xFF, 0xF7, 0xFF, 0x48, 0x00, 0xFC, 0x00,
-       0x20, 0xFF, 0x67, 0xFB, 0xAC, 0xFF, 0xD4, 0x10, 0x59, 0x20, 0x5F,
-       0x1C, 0xAF, 0x09, 0x88, 0xFC, 0x77, 0xFC, 0x42, 0x00, 0xD5, 0x00,
-       0x10, 0x00, 0xFD, 0xFF, 0xF7, 0xFF, 0x6D, 0x00, 0xEF, 0x00, 0x6B,
-       0xFE, 0x3D, 0xFB, 0xED, 0x01, 0x59, 0x14, 0x4D, 0x21, 0x99, 0x19,
-       0x73, 0x06, 0xB4, 0xFB, 0x31, 0xFD, 0x9F, 0x00, 0xB0, 0x00, 0x01,
-       0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFB, 0xFF, 0x96, 0x00, 0xC7, 0x00,
-       0xA9, 0xFD, 0x68, 0xFB, 0x9C, 0x04, 0xB0, 0x17, 0x86, 0x21, 0x6E,
-       0x16, 0x87, 0x03, 0x4C, 0xFB, 0xF5, 0xFD, 0xDA, 0x00, 0x86, 0x00,
-       0xF9, 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0xBF, 0x00, 0x7F, 0x00, 0xE7,
-       0xFC, 0xF8, 0xFB, 0xA9, 0x07, 0xB8, 0x1A, 0x04, 0x21, 0x02, 0x13,
-       0x01, 0x01, 0x44, 0xFB, 0xB3, 0xFE, 0xF7, 0x00, 0x5E, 0x00, 0xF7,
-       0xFF, 0xFC, 0xFF, 0x18, 0x00, 0xE1, 0x00, 0x15, 0x00, 0x36, 0xFC,
-       0xF9, 0xFC, 0xFF, 0x0A, 0x4F, 0x1D, 0xCC, 0x1F, 0x76, 0x0F, 0xED,
-       0xFE, 0x8A, 0xFB, 0x60, 0xFF, 0xFA, 0x00, 0x3B, 0x00, 0xF8, 0xFF,
-       0xF9, 0xFF, 0x32, 0x00, 0xF7, 0x00, 0x8A, 0xFF, 0xA8, 0xFB, 0x73,
-       0xFE, 0x80, 0x0E, 0x5A, 0x1F, 0xEB, 0x1D, 0xED, 0x0B, 0x53, 0xFD,
-       0x0C, 0xFC, 0xF3, 0xFF, 0xE8, 0x00, 0x1E, 0x00, 0xFB, 0xFF, 0xF7,
-       0xFF, 0x54, 0x00, 0xFA, 0x00, 0xE4, 0xFE, 0x50, 0xFB, 0x66, 0x00,
-       0x0F, 0x12, 0xC2, 0x20, 0x77, 0x1B, 0x89, 0x08, 0x32, 0xFC, 0xB5,
-       0xFC, 0x66, 0x00, 0xC9, 0x00, 0x0A, 0x00, 0xFE, 0xFF, 0xF8, 0xFF,
-       0x7B, 0x00, 0xE5, 0x00, 0x29, 0xFE, 0x41, 0xFB, 0xCF, 0x02, 0x87,
-       0x15, 0x76, 0x21, 0x8A, 0x18, 0x66, 0x05, 0x84, 0xFB, 0x74, 0xFD,
-       0xB7, 0x00, 0xA2, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFE,
-       0xFF, 0xA5, 0x00, 0xB2, 0x00, 0x65, 0xFD, 0x8E, 0xFB, 0xA1, 0x05,
-       0xC7, 0x18, 0x6F, 0x21, 0x45, 0x15, 0x9B, 0x02, 0x40, 0xFB, 0x38,
-       0xFE, 0xE7, 0x00, 0x78, 0x00, 0xF8, 0xFF, 0xFE, 0xFF, 0x0B, 0x00,
-       0xCC, 0x00, 0x5E, 0x00, 0xA7, 0xFC, 0x44, 0xFC, 0xCA, 0x08, 0xAC,
-       0x1B, 0xAD, 0x20, 0xC9, 0x11, 0x3B, 0x00, 0x54, 0xFB, 0xF1, 0xFE,
-       0xFB, 0x00, 0x51, 0x00, 0xF7, 0xFF, 0xFB, 0xFF, 0x20, 0x00, 0xEA,
-       0x00, 0xE8, 0xFF, 0x00, 0xFC, 0x6E, 0xFD, 0x32, 0x0C, 0x16, 0x1E,
-       0x38, 0x1F, 0x3A, 0x0E, 0x51, 0xFE, 0xB1, 0xFB, 0x96, 0xFF, 0xF6,
-       0x00, 0x30, 0x00, 0xF9, 0xFF, 0xF8, 0xFF, 0x3D, 0x00, 0xFA, 0x00,
-       0x54, 0xFF, 0x82, 0xFB, 0x12, 0xFF, 0xBC, 0x0F, 0xEA, 0x1F, 0x21,
-       0x1D, 0xBB, 0x0A, 0xE1, 0xFC, 0x43, 0xFC, 0x1E, 0x00, 0xDF, 0x00,
-       0x16, 0x00, 0xFC, 0xFF, 0xF7, 0xFF, 0x61, 0x00, 0xF6, 0x00, 0xA5,
-       0xFE, 0x42, 0xFB, 0x2F, 0x01, 0x47, 0x13, 0x15, 0x21, 0x80, 0x1A,
-       0x6A, 0x07, 0xE9, 0xFB, 0xF6, 0xFC, 0x86, 0x00, 0xBC, 0x00, 0x05,
-       0x00, 0xFF, 0xFF, 0xFA, 0xFF, 0x8A, 0x00, 0xD7, 0x00, 0xE6, 0xFD,
-       0x51, 0xFB, 0xBD, 0x03, 0xB0, 0x16, 0x89, 0x21, 0x71, 0x17, 0x63,
-       0x04, 0x61, 0xFB, 0xB8, 0xFD, 0xCB, 0x00, 0x93, 0x00, 0xFB, 0xFF,
-       0x00, 0x00, 0xFF, 0xFF, 0x02, 0x00, 0xB3, 0x00, 0x99, 0x00, 0x22,
-       0xFD, 0xC0, 0xFB, 0xB0, 0x06, 0xD4, 0x19, 0x41, 0x21, 0x14, 0x14,
-       0xBC, 0x01, 0x3D, 0xFB, 0x7A, 0xFE, 0xF1, 0x00, 0x6A, 0x00, 0xF7,
-       0xFF, 0xFD, 0xFF, 0x12, 0x00, 0xD7, 0x00, 0x39, 0x00, 0x6A, 0xFC,
-       0x9D, 0xFC, 0xF2, 0x09, 0x91, 0x1C, 0x3F, 0x20, 0x8E, 0x10, 0x84,
-       0xFF, 0x6D, 0xFB, 0x2D, 0xFF, 0xFC, 0x00, 0x45, 0x00, 0xF7, 0xFF,
-       0xFA, 0xFF, 0x29, 0x00, 0xF2, 0x00, 0xB8, 0xFF, 0xCF, 0xFB, 0xF1,
-       0xFD, 0x69, 0x0D, 0xCA, 0x1E, 0x90, 0x1E, 0x01, 0x0D, 0xC4, 0xFD,
-       0xDF, 0xFB, 0xC9, 0xFF, 0xF0, 0x00, 0x26, 0x00, 0xFA, 0xFF, 0xF7,
-       0xFF, 0x49, 0x00, 0xFC, 0x00, 0x1A, 0xFF, 0x64, 0xFB, 0xC0, 0xFF,
-       0xF7, 0x10, 0x66, 0x20, 0x46, 0x1C, 0x8E, 0x09, 0x7E, 0xFC, 0x7E,
-       0xFC, 0x46, 0x00, 0xD4, 0x00, 0x0F, 0x00, 0xFD, 0xFF, 0xF7, 0xFF,
-       0x6F, 0x00, 0xEE, 0x00, 0x64, 0xFE, 0x3D, 0xFB, 0x05, 0x02, 0x7B,
-       0x14, 0x53, 0x21, 0x7C, 0x19, 0x54, 0x06, 0xAE, 0xFB, 0x38, 0xFD,
-       0xA1, 0x00, 0xAE, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFC,
-       0xFF, 0x98, 0x00, 0xC5, 0x00, 0xA2, 0xFD, 0x6C, 0xFB, 0xB8, 0x04,
-       0xCF, 0x17, 0x85, 0x21, 0x4E, 0x16, 0x6C, 0x03, 0x4A, 0xFB, 0xFC,
-       0xFD, 0xDC, 0x00, 0x85, 0x00, 0xF9, 0xFF, 0xFF, 0xFF, 0x07, 0x00,
-       0xC0, 0x00, 0x7B, 0x00, 0xE0, 0xFC, 0x00, 0xFC, 0xC9, 0x07, 0xD3,
-       0x1A, 0xFC, 0x20, 0xDF, 0x12, 0xEA, 0x00, 0x46, 0xFB, 0xBA, 0xFE,
-       0xF8, 0x00, 0x5D, 0x00, 0xF7, 0xFF, 0xFC, 0xFF, 0x19, 0x00, 0xE2,
-       0x00, 0x10, 0x00, 0x30, 0xFC, 0x05, 0xFD, 0x21, 0x0B, 0x66, 0x1D,
-       0xBD, 0x1F, 0x53, 0x0F, 0xDB, 0xFE, 0x8E, 0xFB, 0x66, 0xFF, 0xFA,
-       0x00, 0x3A, 0x00, 0xF8, 0xFF, 0xF9, 0xFF, 0x34, 0x00, 0xF7, 0x00,
-       0x84, 0xFF, 0xA4, 0xFB, 0x84, 0xFE, 0xA3, 0x0E, 0x6C, 0x1F, 0xD6,
-       0x1D, 0xCB, 0x0B, 0x45, 0xFD, 0x12, 0xFC, 0xF8, 0xFF, 0xE7, 0x00,
-       0x1D, 0x00, 0xFB, 0xFF, 0xF7, 0xFF, 0x56, 0x00, 0xFA, 0x00, 0xDD,
-       0xFE, 0x4E, 0xFB, 0x7C, 0x00, 0x32, 0x12, 0xCC, 0x20, 0x5C, 0x1B,
-       0x69, 0x08, 0x29, 0xFC, 0xBC, 0xFC, 0x69, 0x00, 0xC7, 0x00, 0x09,
-       0x00, 0xFE, 0xFF, 0xF8, 0xFF, 0x7D, 0x00, 0xE3, 0x00, 0x21, 0xFE,
-       0x43, 0xFB, 0xE9, 0x02, 0xA9, 0x15, 0x79, 0x21, 0x6B, 0x18, 0x48,
-       0x05, 0x80, 0xFB, 0x7C, 0xFD, 0xB9, 0x00, 0xA0, 0x00, 0xFD, 0xFF,
-       0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xA6, 0x00, 0xAF, 0x00, 0x5E,
-       0xFD, 0x93, 0xFB, 0xBE, 0x05, 0xE5, 0x18, 0x6B, 0x21, 0x23, 0x15,
-       0x82, 0x02, 0x3F, 0xFB, 0x3F, 0xFE, 0xE9, 0x00, 0x77, 0x00, 0xF8,
-       0xFF, 0xFE, 0xFF, 0x0C, 0x00, 0xCD, 0x00, 0x5A, 0x00, 0xA0, 0xFC,
-       0x4D, 0xFC, 0xEA, 0x08, 0xC6, 0x1B, 0xA1, 0x20, 0xA6, 0x11, 0x26,
-       0x00, 0x57, 0xFB, 0xF8, 0xFE, 0xFB, 0x00, 0x50, 0x00, 0xF7, 0xFF,
-       0xFB, 0xFF, 0x21, 0x00, 0xEB, 0x00, 0xE3, 0xFF, 0xFA, 0xFB, 0x7C,
-       0xFD, 0x54, 0x0C, 0x2B, 0x1E, 0x26, 0x1F, 0x17, 0x0E, 0x41, 0xFE,
-       0xB6, 0xFB, 0x9C, 0xFF, 0xF5, 0x00, 0x2F, 0x00, 0xF9, 0xFF, 0xF8,
-       0xFF, 0x3F, 0x00, 0xFB, 0x00, 0x4D, 0xFF, 0x7F, 0xFB, 0x24, 0xFF,
-       0xDF, 0x0F, 0xF9, 0x1F, 0x09, 0x1D, 0x99, 0x0A, 0xD5, 0xFC, 0x49,
-       0xFC, 0x23, 0x00, 0xDD, 0x00, 0x16, 0x00, 0xFC, 0xFF, 0xF7, 0xFF,
-       0x63, 0x00, 0xF5, 0x00, 0x9E, 0xFE, 0x41, 0xFB, 0x46, 0x01, 0x69,
-       0x13, 0x1D, 0x21, 0x63, 0x1A, 0x4B, 0x07, 0xE2, 0xFB, 0xFD, 0xFC,
-       0x89, 0x00, 0xBA, 0x00, 0x04, 0x00, 0xFF, 0xFF, 0xFA, 0xFF, 0x8B,
-       0x00, 0xD5, 0x00, 0xDE, 0xFD, 0x53, 0xFB, 0xD9, 0x03, 0xD0, 0x16,
-       0x8A, 0x21, 0x51, 0x17, 0x47, 0x04, 0x5E, 0xFB, 0xC0, 0xFD, 0xCD,
-       0x00, 0x92, 0x00, 0xFB, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x02, 0x00,
-       0xB4, 0x00, 0x96, 0x00, 0x1B, 0xFD, 0xC7, 0xFB, 0xCF, 0x06, 0xF0,
-       0x19, 0x3A, 0x21, 0xF2, 0x13, 0xA4, 0x01, 0x3E, 0xFB, 0x81, 0xFE,
-       0xF2, 0x00, 0x69, 0x00, 0xF7, 0xFF, 0xFD, 0xFF, 0x12, 0x00, 0xD9,
-       0x00, 0x35, 0x00, 0x63, 0xFC, 0xA8, 0xFC, 0x13, 0x0A, 0xA9, 0x1C,
-       0x32, 0x20, 0x6B, 0x10, 0x71, 0xFF, 0x71, 0xFB, 0x34, 0xFF, 0xFB,
-       0x00, 0x44, 0x00, 0xF8, 0xFF, 0xFA, 0xFF, 0x2B, 0x00, 0xF3, 0x00,
-       0xB3, 0xFF, 0xCA, 0xFB, 0x01, 0xFE, 0x8C, 0x0D, 0xDD, 0x1E, 0x7C,
-       0x1E, 0xDE, 0x0C, 0xB5, 0xFD, 0xE4, 0xFB, 0xCE, 0xFF, 0xEF, 0x00,
-       0x25, 0x00, 0xFA, 0xFF, 0xF7, 0xFF, 0x4A, 0x00, 0xFC, 0x00, 0x13,
-       0xFF, 0x61, 0xFB, 0xD4, 0xFF, 0x1A, 0x11, 0x72, 0x20, 0x2D, 0x1C,
-       0x6D, 0x09, 0x74, 0xFC, 0x85, 0xFC, 0x4A, 0x00, 0xD2, 0x00, 0x0F,
-       0x00, 0xFD, 0xFF, 0xF7, 0xFF, 0x70, 0x00, 0xED, 0x00, 0x5D, 0xFE,
-       0x3D, 0xFB, 0x1E, 0x02, 0x9C, 0x14, 0x58, 0x21, 0x5E, 0x19, 0x36,
-       0x06, 0xA8, 0xFB, 0x40, 0xFD, 0xA4, 0x00, 0xAD, 0x00, 0x00, 0x00,
-       0xFF, 0xFF, 0x00, 0x00, 0xFC, 0xFF, 0x9A, 0x00, 0xC3, 0x00, 0x9A,
-       0xFD, 0x6F, 0xFB, 0xD5, 0x04, 0xEF, 0x17, 0x83, 0x21, 0x2D, 0x16,
-       0x52, 0x03, 0x49, 0xFB, 0x04, 0xFE, 0xDD, 0x00, 0x83, 0x00, 0xF9,
-       0xFF, 0xFF, 0xFF, 0x07, 0x00, 0xC2, 0x00, 0x78, 0x00, 0xD9, 0xFC,
-       0x08, 0xFC, 0xE9, 0x07, 0xEF, 0x1A, 0xF3, 0x20, 0xBC, 0x12, 0xD4,
-       0x00, 0x47, 0xFB, 0xC1, 0xFE, 0xF8, 0x00, 0x5B, 0x00, 0xF7, 0xFF,
-       0xFC, 0xFF, 0x1A, 0x00, 0xE3, 0x00, 0x0B, 0x00, 0x2A, 0xFC, 0x12,
-       0xFD, 0x42, 0x0B, 0x7D, 0x1D, 0xAD, 0x1F, 0x2F, 0x0F, 0xC9, 0xFE,
-       0x92, 0xFB, 0x6C, 0xFF, 0xF9, 0x00, 0x38, 0x00, 0xF8, 0xFF, 0xF9,
-       0xFF, 0x35, 0x00, 0xF8, 0x00, 0x7E, 0xFF, 0x9F, 0xFB, 0x95, 0xFE,
-       0xC6, 0x0E, 0x7C, 0x1F, 0xC0, 0x1D, 0xA9, 0x0B, 0x38, 0xFD, 0x18,
-       0xFC, 0xFD, 0xFF, 0xE6, 0x00, 0x1D, 0x00, 0xFB, 0xFF, 0xF7, 0xFF,
-       0x57, 0x00, 0xFA, 0x00, 0xD6, 0xFE, 0x4C, 0xFB, 0x92, 0x00, 0x54,
-       0x12, 0xD6, 0x20, 0x41, 0x1B, 0x49, 0x08, 0x20, 0xFC, 0xC3, 0xFC,
-       0x6D, 0x00, 0xC6, 0x00, 0x09, 0x00, 0xFE, 0xFF, 0xF8, 0xFF, 0x7E,
-       0x00, 0xE2, 0x00, 0x1A, 0xFE, 0x44, 0xFB, 0x03, 0x03, 0xCA, 0x15,
-       0x7C, 0x21, 0x4C, 0x18, 0x2B, 0x05, 0x7B, 0xFB, 0x83, 0xFD, 0xBC,
-       0x00, 0x9E, 0x00, 0xFD, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,
-       0xA8, 0x00, 0xAD, 0x00, 0x56, 0xFD, 0x98, 0xFB, 0xDC, 0x05, 0x04,
-       0x19, 0x66, 0x21, 0x02, 0x15, 0x69, 0x02, 0x3E, 0xFB, 0x47, 0xFE,
-       0xEA, 0x00, 0x75, 0x00, 0xF8, 0xFF, 0xFE, 0xFF, 0x0D, 0x00, 0xCE,
-       0x00, 0x56, 0x00, 0x99, 0xFC, 0x56, 0xFC, 0x0B, 0x09, 0xE0, 0x1B,
-       0x96, 0x20, 0x83, 0x11, 0x11, 0x00, 0x59, 0xFB, 0xFF, 0xFE, 0xFB,
-       0x00, 0x4E, 0x00, 0xF7, 0xFF, 0xFB, 0xFF, 0x22, 0x00, 0xEC, 0x00,
-       0xDE, 0xFF, 0xF5, 0xFB, 0x8A, 0xFD, 0x77, 0x0C, 0x3F, 0x1E, 0x14,
-       0x1F, 0xF5, 0x0D, 0x31, 0xFE, 0xBB, 0xFB, 0xA2, 0xFF, 0xF5, 0x00,
-       0x2E, 0x00, 0xF9, 0xFF, 0xF8, 0xFF, 0x40, 0x00, 0xFB, 0x00, 0x47,
-       0xFF, 0x7B, 0xFB, 0x37, 0xFF, 0x02, 0x10, 0x07, 0x20, 0xF2, 0x1C,
-       0x78, 0x0A, 0xCA, 0xFC, 0x50, 0xFC, 0x27, 0x00, 0xDC, 0x00, 0x15,
-       0x00, 0xFC, 0xFF, 0xF7, 0xFF, 0x64, 0x00, 0xF5, 0x00, 0x97, 0xFE,
-       0x40, 0xFB, 0x5D, 0x01, 0x8B, 0x13, 0x25, 0x21, 0x47, 0x1A, 0x2C,
-       0x07, 0xDB, 0xFB, 0x05, 0xFD, 0x8C, 0x00, 0xB9, 0x00, 0x04, 0x00,
-       0xFF, 0xFF, 0xFA, 0xFF, 0x8D, 0x00, 0xD3, 0x00, 0xD6, 0xFD, 0x56,
-       0xFB, 0xF4, 0x03, 0xF0, 0x16, 0x8A, 0x21, 0x31, 0x17, 0x2B, 0x04,
-       0x5B, 0xFB, 0xC7, 0xFD, 0xCF, 0x00, 0x90, 0x00, 0xFA, 0xFF, 0x00,
-       0x00, 0xFF, 0xFF, 0x03, 0x00, 0xB6, 0x00, 0x92, 0x00, 0x13, 0xFD,
-       0xCD, 0xFB, 0xEE, 0x06, 0x0D, 0x1A, 0x33, 0x21, 0xD0, 0x13, 0x8C,
-       0x01, 0x3E, 0xFB, 0x88, 0xFE, 0xF3, 0x00, 0x67, 0x00, 0xF7, 0xFF,
-       0x06, 0x00, 0x1D, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0xA1, 0x02, 0xA6,
-       0xF8, 0x56, 0x02, 0xA5, 0x28, 0xA5, 0x28, 0x56, 0x02, 0xA6, 0xF8,
-       0xA1, 0x02, 0xFE, 0x00, 0x03, 0xFF, 0x1D, 0x00, 0x06, 0x00, 0x00,
-       0x00, 0x21, 0x00, 0xA6, 0xFF, 0x3F, 0xFF, 0x0B, 0x03, 0x42, 0xFE,
-       0x3E, 0xF8, 0x7F, 0x15, 0xAC, 0x30, 0x7F, 0x15, 0x3E, 0xF8, 0x42,
-       0xFE, 0x0B, 0x03, 0x3F, 0xFF, 0xA6, 0xFF, 0x21, 0x00, 0x00, 0x00,
-       0xFA, 0xFF, 0xCE, 0xFF, 0x14, 0x01, 0x00, 0xFD, 0x35, 0x06, 0xD5,
-       0xF4, 0xDA, 0x15, 0x92, 0x40, 0xAE, 0xFE, 0xF3, 0xFC, 0x68, 0x03,
-       0x86, 0xFD, 0x51, 0x01, 0x8B, 0xFF, 0x11, 0x00, 0x01, 0x00, 0xEC,
-       0xFF, 0xF9, 0xFF, 0xC6, 0x00, 0x55, 0xFD, 0x35, 0x06, 0x90, 0xF3,
-       0xE5, 0x1C, 0x6B, 0x3D, 0x71, 0xFA, 0x34, 0xFF, 0x46, 0x02, 0xFF,
-       0xFD, 0x2D, 0x01, 0x90, 0xFF, 0x10, 0x00, 0x03, 0x00, 0xDB, 0xFF,
-       0x2D, 0x00, 0x60, 0x00, 0xE1, 0xFD, 0xCE, 0x05, 0xED, 0xF2, 0xF3,
-       0x23, 0x20, 0x39, 0x22, 0xF7, 0x44, 0x01, 0x1F, 0x01, 0x89, 0xFE,
-       0xFB, 0x00, 0x9C, 0xFF, 0x0D, 0x00, 0x06, 0x00, 0xC9, 0xFF, 0x68,
-       0x00, 0xE5, 0xFF, 0xA0, 0xFE, 0xFB, 0x04, 0x0C, 0xF3, 0xC5, 0x2A,
-       0xD8, 0x33, 0xC9, 0xF4, 0x0B, 0x03, 0x05, 0x00, 0x1A, 0xFF, 0xC1,
-       0x00, 0xAD, 0xFF, 0x0A, 0x00, 0x09, 0x00, 0xB5, 0xFF, 0xA5, 0x00,
-       0x5C, 0xFF, 0x8C, 0xFF, 0xBF, 0x03, 0x06, 0xF4, 0x22, 0x31, 0xC8,
-       0x2D, 0x63, 0xF3, 0x76, 0x04, 0x08, 0xFF, 0xA7, 0xFF, 0x84, 0x00,
-       0xC0, 0xFF, 0x07, 0x00, 0x0C, 0x00, 0xA4, 0xFF, 0xE1, 0x00, 0xCB,
-       0xFE, 0x9B, 0x00, 0x21, 0x02, 0xEE, 0xF5, 0xCD, 0x36, 0x24, 0x27,
-       0xE1, 0xF2, 0x7A, 0x05, 0x33, 0xFE, 0x2A, 0x00, 0x47, 0x00, 0xD3,
-       0xFF, 0x04, 0x00, 0x0F, 0x00, 0x95, 0xFF, 0x17, 0x01, 0x3D, 0xFE,
-       0xBD, 0x01, 0x30, 0x00, 0xCC, 0xF8, 0x92, 0x3B, 0x2A, 0x20, 0x2E,
-       0xF3, 0x12, 0x06, 0x8F, 0xFD, 0x9A, 0x00, 0x10, 0x00, 0xE5, 0xFF,
-       0x02, 0x00, 0x10, 0x00, 0x8C, 0xFF, 0x42, 0x01, 0xBB, 0xFD, 0xE4,
-       0x02, 0x01, 0xFE, 0x9C, 0xFC, 0x45, 0x3F, 0x16, 0x19, 0x2D, 0xF4,
-       0x41, 0x06, 0x21, 0xFD, 0xF3, 0x00, 0xE0, 0xFF, 0xF4, 0xFF, 0x01,
-       0x00, 0x10, 0x00, 0x8B, 0xFF, 0x5D, 0x01, 0x4F, 0xFD, 0xFB, 0x03,
-       0xB2, 0xFB, 0x53, 0x01, 0xC2, 0x41, 0x24, 0x12, 0xBA, 0xF5, 0x0F,
-       0x06, 0xE9, 0xFC, 0x33, 0x01, 0xBB, 0xFF, 0x00, 0x00, 0x00, 0x00,
-       0x0D, 0x00, 0x93, 0xFF, 0x63, 0x01, 0x04, 0xFD, 0xEF, 0x04, 0x62,
-       0xF9, 0xD7, 0x06, 0xF2, 0x42, 0x8D, 0x0B, 0xB0, 0xF7, 0x87, 0x05,
-       0xE6, 0xFC, 0x58, 0x01, 0xA0, 0xFF, 0x09, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x07, 0x00, 0xA5, 0xFF, 0x52, 0x01, 0xE2, 0xFC, 0xAD, 0x05,
-       0x35, 0xF7, 0x08, 0x0D, 0xCB, 0x42, 0x81, 0x05, 0xE8, 0xF9, 0xBB,
-       0x04, 0x12, 0xFD, 0x64, 0x01, 0x90, 0xFF, 0x0E, 0x00, 0x00, 0x00,
-       0xFE, 0xFF, 0xC2, 0xFF, 0x27, 0x01, 0xF1, 0xFC, 0x22, 0x06, 0x54,
-       0xF5, 0xB8, 0x13, 0x4A, 0x41, 0x29, 0x00, 0x3C, 0xFC, 0xBD, 0x03,
-       0x66, 0xFD, 0x58, 0x01, 0x8A, 0xFF, 0x11, 0x00, 0x01, 0x00, 0xF1,
-       0xFF, 0xEB, 0xFF, 0xE1, 0x00, 0x35, 0xFD, 0x40, 0x06, 0xE4, 0xF3,
-       0xB7, 0x1A, 0x85, 0x3E, 0xA6, 0xFB, 0x86, 0xFE, 0xA0, 0x02, 0xD7,
-       0xFD, 0x39, 0x01, 0x8E, 0xFF, 0x10, 0x00, 0x03, 0x00, 0xE1, 0xFF,
-       0x1C, 0x00, 0x82, 0x00, 0xB0, 0xFD, 0xF9, 0x05, 0x0C, 0xF3, 0xCB,
-       0x21, 0x8F, 0x3A, 0x0D, 0xF8, 0xA9, 0x00, 0x79, 0x01, 0x5D, 0xFE,
-       0x0B, 0x01, 0x98, 0xFF, 0x0E, 0x00, 0x05, 0x00, 0xCE, 0xFF, 0x55,
-       0x00, 0x0D, 0x00, 0x60, 0xFE, 0x48, 0x05, 0xEC, 0xF2, 0xB6, 0x28,
-       0x91, 0x35, 0x68, 0xF5, 0x88, 0x02, 0x5A, 0x00, 0xED, 0xFE, 0xD4,
-       0x00, 0xA8, 0xFF, 0x0B, 0x00, 0x08, 0x00, 0xBB, 0xFF, 0x92, 0x00,
-       0x87, 0xFF, 0x3F, 0xFF, 0x2B, 0x04, 0xA1, 0xF3, 0x3D, 0x2F, 0xB8,
-       0x2F, 0xB8, 0xF3, 0x11, 0x04, 0x52, 0xFF, 0x7C, 0xFF, 0x97, 0x00,
-       0xBA, 0xFF, 0x08, 0x00, 0x0B, 0x00, 0xA9, 0xFF, 0xCF, 0x00, 0xF8,
-       0xFE, 0x44, 0x00, 0xAA, 0x02, 0x3E, 0xF5, 0x24, 0x35, 0x3B, 0x29,
-       0xF2, 0xF2, 0x35, 0x05, 0x70, 0xFE, 0x03, 0x00, 0x5A, 0x00, 0xCD,
-       0xFF, 0x05, 0x00, 0x0E, 0x00, 0x99, 0xFF, 0x07, 0x01, 0x68, 0xFE,
-       0x63, 0x01, 0xD0, 0x00, 0xD0, 0xF7, 0x35, 0x3A, 0x55, 0x22, 0x02,
-       0xF3, 0xEF, 0x05, 0xBC, 0xFD, 0x7A, 0x00, 0x20, 0x00, 0xDF, 0xFF,
-       0x03, 0x00, 0x10, 0x00, 0x8E, 0xFF, 0x36, 0x01, 0xE1, 0xFD, 0x8A,
-       0x02, 0xB2, 0xFE, 0x56, 0xFB, 0x40, 0x3E, 0x42, 0x1B, 0xCE, 0xF3,
-       0x3E, 0x06, 0x3D, 0xFD, 0xDB, 0x00, 0xEE, 0xFF, 0xF0, 0xFF, 0x01,
-       0x00, 0x11, 0x00, 0x8A, 0xFF, 0x57, 0x01, 0x6D, 0xFD, 0xA8, 0x03,
-       0x69, 0xFC, 0xC8, 0xFF, 0x20, 0x41, 0x40, 0x14, 0x33, 0xF5, 0x28,
-       0x06, 0xF5, 0xFC, 0x22, 0x01, 0xC5, 0xFF, 0xFD, 0xFF, 0x00, 0x00,
-       0x0F, 0x00, 0x8F, 0xFF, 0x64, 0x01, 0x17, 0xFD, 0xA9, 0x04, 0x16,
-       0xFA, 0x10, 0x05, 0xB8, 0x42, 0x87, 0x0D, 0x0D, 0xF7, 0xB9, 0x05,
-       0xE2, 0xFC, 0x50, 0x01, 0xA7, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x0A, 0x00, 0x9E, 0xFF, 0x5A, 0x01, 0xE8, 0xFC, 0x7A, 0x05,
-       0xDA, 0xF7, 0x10, 0x0B, 0xFB, 0x42, 0x4B, 0x07, 0x35, 0xF9, 0x00,
-       0x05, 0x00, 0xFD, 0x63, 0x01, 0x94, 0xFF, 0x0D, 0x00, 0x00, 0x00,
-       0x01, 0x00, 0xB8, 0xFF, 0x37, 0x01, 0xE7, 0xFC, 0x07, 0x06, 0xDE,
-       0xF5, 0x9F, 0x11, 0xE4, 0x41, 0xB8, 0x01, 0x84, 0xFB, 0x0F, 0x04,
-       0x48, 0xFD, 0x5E, 0x01, 0x8B, 0xFF, 0x10, 0x00, 0x01, 0x00, 0xF5,
-       0xFF, 0xDD, 0xFF, 0xF9, 0x00, 0x1B, 0xFD, 0x41, 0x06, 0x47, 0xF4,
-       0x8B, 0x18, 0x81, 0x3F, 0xF1, 0xFC, 0xD5, 0xFD, 0xFA, 0x02, 0xB2,
-       0xFD, 0x45, 0x01, 0x8C, 0xFF, 0x11, 0x00, 0x02, 0x00, 0xE6, 0xFF,
-       0x0C, 0x00, 0xA2, 0x00, 0x85, 0xFD, 0x1A, 0x06, 0x3C, 0xF3, 0x9F,
-       0x1F, 0xE6, 0x3B, 0x0E, 0xF9, 0x07, 0x00, 0xD4, 0x01, 0x33, 0xFE,
-       0x1B, 0x01, 0x94, 0xFF, 0x0F, 0x00, 0x04, 0x00, 0xD4, 0xFF, 0x43,
-       0x00, 0x33, 0x00, 0x25, 0xFE, 0x89, 0x05, 0xE0, 0xF2, 0x9C, 0x26,
-       0x33, 0x37, 0x1E, 0xF6, 0xFD, 0x01, 0xB0, 0x00, 0xC0, 0xFE, 0xE6,
-       0x00, 0xA2, 0xFF, 0x0C, 0x00, 0x07, 0x00, 0xC1, 0xFF, 0x7F, 0x00,
-       0xB2, 0xFF, 0xF6, 0xFE, 0x8E, 0x04, 0x51, 0xF3, 0x49, 0x2D, 0x98,
-       0x31, 0x23, 0xF4, 0xA2, 0x03, 0xA0, 0xFF, 0x51, 0xFF, 0xAA, 0x00,
-       0xB4, 0xFF, 0x09, 0x00, 0x0A, 0x00, 0xAE, 0xFF, 0xBD, 0x00, 0x25,
-       0xFF, 0xF1, 0xFF, 0x2B, 0x03, 0xA5, 0xF4, 0x68, 0x33, 0x48, 0x2B,
-       0x17, 0xF3, 0xE7, 0x04, 0xB1, 0xFE, 0xDB, 0xFF, 0x6C, 0x00, 0xC7,
-       0xFF, 0x06, 0x00, 0x0D, 0x00, 0x9E, 0xFF, 0xF7, 0x00, 0x94, 0xFE,
-       0x09, 0x01, 0x6A, 0x01, 0xEB, 0xF6, 0xC1, 0x38, 0x7D, 0x24, 0xE8,
-       0xF2, 0xC1, 0x05, 0xEE, 0xFD, 0x57, 0x00, 0x31, 0x00, 0xDA, 0xFF,
-       0x03, 0x00, 0x10, 0x00, 0x91, 0xFF, 0x29, 0x01, 0x09, 0xFE, 0x2F,
-       0x02, 0x5F, 0xFF, 0x27, 0xFA, 0x20, 0x3D, 0x70, 0x1D, 0x7D, 0xF3,
-       0x31, 0x06, 0x5E, 0xFD, 0xBF, 0x00, 0xFD, 0xFF, 0xEB, 0xFF, 0x02,
-       0x00, 0x11, 0x00, 0x8B, 0xFF, 0x4E, 0x01, 0x8E, 0xFD, 0x52, 0x03,
-       0x20, 0xFD, 0x52, 0xFE, 0x60, 0x40, 0x63, 0x16, 0xB7, 0xF4, 0x39,
-       0x06, 0x05, 0xFD, 0x0F, 0x01, 0xD1, 0xFF, 0xF9, 0xFF, 0x00, 0x00,
-       0x10, 0x00, 0x8D, 0xFF, 0x62, 0x01, 0x2E, 0xFD, 0x5E, 0x04, 0xCC,
-       0xFA, 0x5B, 0x03, 0x5E, 0x42, 0x8E, 0x0F, 0x71, 0xF6, 0xE4, 0x05,
-       0xE2, 0xFC, 0x45, 0x01, 0xAF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x0B, 0x00, 0x99, 0xFF, 0x60, 0x01, 0xF2, 0xFC, 0x40, 0x05,
-       0x85, 0xF8, 0x26, 0x09, 0x0C, 0x43, 0x26, 0x09, 0x85, 0xF8, 0x40,
-       0x05, 0xF2, 0xFC, 0x60, 0x01, 0x99, 0xFF, 0x0B, 0x00, 0x00, 0x00,
-       0x04, 0x00, 0xAF, 0xFF, 0x45, 0x01, 0xE2, 0xFC, 0xE4, 0x05, 0x71,
-       0xF6, 0x8E, 0x0F, 0x5E, 0x42, 0x5B, 0x03, 0xCC, 0xFA, 0x5E, 0x04,
-       0x2E, 0xFD, 0x62, 0x01, 0x8D, 0xFF, 0x10, 0x00, 0x00, 0x00, 0xF9,
-       0xFF, 0xD1, 0xFF, 0x0F, 0x01, 0x05, 0xFD, 0x39, 0x06, 0xB7, 0xF4,
-       0x63, 0x16, 0x60, 0x40, 0x52, 0xFE, 0x20, 0xFD, 0x52, 0x03, 0x8E,
-       0xFD, 0x4E, 0x01, 0x8B, 0xFF, 0x11, 0x00, 0x02, 0x00, 0xEB, 0xFF,
-       0xFD, 0xFF, 0xBF, 0x00, 0x5E, 0xFD, 0x31, 0x06, 0x7D, 0xF3, 0x70,
-       0x1D, 0x20, 0x3D, 0x27, 0xFA, 0x5F, 0xFF, 0x2F, 0x02, 0x09, 0xFE,
-       0x29, 0x01, 0x91, 0xFF, 0x10, 0x00, 0x03, 0x00, 0xDA, 0xFF, 0x31,
-       0x00, 0x57, 0x00, 0xEE, 0xFD, 0xC1, 0x05, 0xE8, 0xF2, 0x7D, 0x24,
-       0xC1, 0x38, 0xEB, 0xF6, 0x6A, 0x01, 0x09, 0x01, 0x94, 0xFE, 0xF7,
-       0x00, 0x9E, 0xFF, 0x0D, 0x00, 0x06, 0x00, 0xC7, 0xFF, 0x6C, 0x00,
-       0xDB, 0xFF, 0xB1, 0xFE, 0xE7, 0x04, 0x17, 0xF3, 0x48, 0x2B, 0x68,
-       0x33, 0xA5, 0xF4, 0x2B, 0x03, 0xF1, 0xFF, 0x25, 0xFF, 0xBD, 0x00,
-       0xAE, 0xFF, 0x0A, 0x00, 0x09, 0x00, 0xB4, 0xFF, 0xAA, 0x00, 0x51,
-       0xFF, 0xA0, 0xFF, 0xA2, 0x03, 0x23, 0xF4, 0x98, 0x31, 0x49, 0x2D,
-       0x51, 0xF3, 0x8E, 0x04, 0xF6, 0xFE, 0xB2, 0xFF, 0x7F, 0x00, 0xC1,
-       0xFF, 0x07, 0x00, 0x0C, 0x00, 0xA2, 0xFF, 0xE6, 0x00, 0xC0, 0xFE,
-       0xB0, 0x00, 0xFD, 0x01, 0x1E, 0xF6, 0x33, 0x37, 0x9C, 0x26, 0xE0,
-       0xF2, 0x89, 0x05, 0x25, 0xFE, 0x33, 0x00, 0x43, 0x00, 0xD4, 0xFF,
-       0x04, 0x00, 0x0F, 0x00, 0x94, 0xFF, 0x1B, 0x01, 0x33, 0xFE, 0xD4,
-       0x01, 0x07, 0x00, 0x0E, 0xF9, 0xE6, 0x3B, 0x9F, 0x1F, 0x3C, 0xF3,
-       0x1A, 0x06, 0x85, 0xFD, 0xA2, 0x00, 0x0C, 0x00, 0xE6, 0xFF, 0x02,
-       0x00, 0x11, 0x00, 0x8C, 0xFF, 0x45, 0x01, 0xB2, 0xFD, 0xFA, 0x02,
-       0xD5, 0xFD, 0xF1, 0xFC, 0x81, 0x3F, 0x8B, 0x18, 0x47, 0xF4, 0x41,
-       0x06, 0x1B, 0xFD, 0xF9, 0x00, 0xDD, 0xFF, 0xF5, 0xFF, 0x01, 0x00,
-       0x10, 0x00, 0x8B, 0xFF, 0x5E, 0x01, 0x48, 0xFD, 0x0F, 0x04, 0x84,
-       0xFB, 0xB8, 0x01, 0xE4, 0x41, 0x9F, 0x11, 0xDE, 0xF5, 0x07, 0x06,
-       0xE7, 0xFC, 0x37, 0x01, 0xB8, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x0D,
-       0x00, 0x94, 0xFF, 0x63, 0x01, 0x00, 0xFD, 0x00, 0x05, 0x35, 0xF9,
-       0x4B, 0x07, 0xFB, 0x42, 0x10, 0x0B, 0xDA, 0xF7, 0x7A, 0x05, 0xE8,
-       0xFC, 0x5A, 0x01, 0x9E, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x07, 0x00, 0xA7, 0xFF, 0x50, 0x01, 0xE2, 0xFC, 0xB9, 0x05, 0x0D,
-       0xF7, 0x87, 0x0D, 0xB8, 0x42, 0x10, 0x05, 0x16, 0xFA, 0xA9, 0x04,
-       0x17, 0xFD, 0x64, 0x01, 0x8F, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFD,
-       0xFF, 0xC5, 0xFF, 0x22, 0x01, 0xF5, 0xFC, 0x28, 0x06, 0x33, 0xF5,
-       0x40, 0x14, 0x20, 0x41, 0xC8, 0xFF, 0x69, 0xFC, 0xA8, 0x03, 0x6D,
-       0xFD, 0x57, 0x01, 0x8A, 0xFF, 0x11, 0x00, 0x01, 0x00, 0xF0, 0xFF,
-       0xEE, 0xFF, 0xDB, 0x00, 0x3D, 0xFD, 0x3E, 0x06, 0xCE, 0xF3, 0x42,
-       0x1B, 0x40, 0x3E, 0x56, 0xFB, 0xB2, 0xFE, 0x8A, 0x02, 0xE1, 0xFD,
-       0x36, 0x01, 0x8E, 0xFF, 0x10, 0x00, 0x03, 0x00, 0xDF, 0xFF, 0x20,
-       0x00, 0x7A, 0x00, 0xBC, 0xFD, 0xEF, 0x05, 0x02, 0xF3, 0x55, 0x22,
-       0x35, 0x3A, 0xD0, 0xF7, 0xD0, 0x00, 0x63, 0x01, 0x68, 0xFE, 0x07,
-       0x01, 0x99, 0xFF, 0x0E, 0x00, 0x05, 0x00, 0xCD, 0xFF, 0x5A, 0x00,
-       0x03, 0x00, 0x70, 0xFE, 0x35, 0x05, 0xF2, 0xF2, 0x3B, 0x29, 0x24,
-       0x35, 0x3E, 0xF5, 0xAA, 0x02, 0x44, 0x00, 0xF8, 0xFE, 0xCF, 0x00,
-       0xA9, 0xFF, 0x0B, 0x00, 0x08, 0x00, 0xBA, 0xFF, 0x97, 0x00, 0x7C,
-       0xFF, 0x52, 0xFF, 0x11, 0x04, 0xB8, 0xF3, 0xB8, 0x2F, 0x3D, 0x2F,
-       0xA1, 0xF3, 0x2B, 0x04, 0x3F, 0xFF, 0x87, 0xFF, 0x92, 0x00, 0xBB,
-       0xFF, 0x08, 0x00, 0x0B, 0x00, 0xA8, 0xFF, 0xD4, 0x00, 0xED, 0xFE,
-       0x5A, 0x00, 0x88, 0x02, 0x68, 0xF5, 0x91, 0x35, 0xB6, 0x28, 0xEC,
-       0xF2, 0x48, 0x05, 0x60, 0xFE, 0x0D, 0x00, 0x55, 0x00, 0xCE, 0xFF,
-       0x05, 0x00, 0x0E, 0x00, 0x98, 0xFF, 0x0B, 0x01, 0x5D, 0xFE, 0x79,
-       0x01, 0xA9, 0x00, 0x0D, 0xF8, 0x8F, 0x3A, 0xCB, 0x21, 0x0C, 0xF3,
-       0xF9, 0x05, 0xB0, 0xFD, 0x82, 0x00, 0x1C, 0x00, 0xE1, 0xFF, 0x03,
-       0x00, 0x10, 0x00, 0x8E, 0xFF, 0x39, 0x01, 0xD7, 0xFD, 0xA0, 0x02,
-       0x86, 0xFE, 0xA6, 0xFB, 0x85, 0x3E, 0xB7, 0x1A, 0xE4, 0xF3, 0x40,
-       0x06, 0x35, 0xFD, 0xE1, 0x00, 0xEB, 0xFF, 0xF1, 0xFF, 0x01, 0x00,
-       0x11, 0x00, 0x8A, 0xFF, 0x58, 0x01, 0x66, 0xFD, 0xBD, 0x03, 0x3C,
-       0xFC, 0x29, 0x00, 0x4A, 0x41, 0xB8, 0x13, 0x54, 0xF5, 0x22, 0x06,
-       0xF1, 0xFC, 0x27, 0x01, 0xC2, 0xFF, 0xFE, 0xFF, 0x00, 0x00, 0x0E,
-       0x00, 0x90, 0xFF, 0x64, 0x01, 0x12, 0xFD, 0xBB, 0x04, 0xE8, 0xF9,
-       0x81, 0x05, 0xCB, 0x42, 0x08, 0x0D, 0x35, 0xF7, 0xAD, 0x05, 0xE2,
-       0xFC, 0x52, 0x01, 0xA5, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x09, 0x00, 0xA0, 0xFF, 0x58, 0x01, 0xE6, 0xFC, 0x87, 0x05, 0xB0,
-       0xF7, 0x8D, 0x0B, 0xF2, 0x42, 0xD7, 0x06, 0x62, 0xF9, 0xEF, 0x04,
-       0x04, 0xFD, 0x63, 0x01, 0x93, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0xBB, 0xFF, 0x33, 0x01, 0xE9, 0xFC, 0x0F, 0x06, 0xBA, 0xF5,
-       0x24, 0x12, 0xC2, 0x41, 0x53, 0x01, 0xB2, 0xFB, 0xFB, 0x03, 0x4F,
-       0xFD, 0x5D, 0x01, 0x8B, 0xFF, 0x10, 0x00, 0x01, 0x00, 0xF4, 0xFF,
-       0xE0, 0xFF, 0xF3, 0x00, 0x21, 0xFD, 0x41, 0x06, 0x2D, 0xF4, 0x16,
-       0x19, 0x45, 0x3F, 0x9C, 0xFC, 0x01, 0xFE, 0xE4, 0x02, 0xBB, 0xFD,
-       0x42, 0x01, 0x8C, 0xFF, 0x10, 0x00, 0x02, 0x00, 0xE5, 0xFF, 0x10,
-       0x00, 0x9A, 0x00, 0x8F, 0xFD, 0x12, 0x06, 0x2E, 0xF3, 0x2A, 0x20,
-       0x92, 0x3B, 0xCC, 0xF8, 0x30, 0x00, 0xBD, 0x01, 0x3D, 0xFE, 0x17,
-       0x01, 0x95, 0xFF, 0x0F, 0x00, 0x04, 0x00, 0xD3, 0xFF, 0x47, 0x00,
-       0x2A, 0x00, 0x33, 0xFE, 0x7A, 0x05, 0xE1, 0xF2, 0x24, 0x27, 0xCD,
-       0x36, 0xEE, 0xF5, 0x21, 0x02, 0x9B, 0x00, 0xCB, 0xFE, 0xE1, 0x00,
-       0xA4, 0xFF, 0x0C, 0x00, 0x07, 0x00, 0xC0, 0xFF, 0x84, 0x00, 0xA7,
-       0xFF, 0x08, 0xFF, 0x76, 0x04, 0x63, 0xF3, 0xC8, 0x2D, 0x22, 0x31,
-       0x06, 0xF4, 0xBF, 0x03, 0x8C, 0xFF, 0x5C, 0xFF, 0xA5, 0x00, 0xB5,
-       0xFF, 0x09, 0x00, 0x0A, 0x00, 0xAD, 0xFF, 0xC1, 0x00, 0x1A, 0xFF,
-       0x05, 0x00, 0x0B, 0x03, 0xC9, 0xF4, 0xD8, 0x33, 0xC5, 0x2A, 0x0C,
-       0xF3, 0xFB, 0x04, 0xA0, 0xFE, 0xE5, 0xFF, 0x68, 0x00, 0xC9, 0xFF,
-       0x06, 0x00, 0x0D, 0x00, 0x9C, 0xFF, 0xFB, 0x00, 0x89, 0xFE, 0x1F,
-       0x01, 0x44, 0x01, 0x22, 0xF7, 0x20, 0x39, 0xF3, 0x23, 0xED, 0xF2,
-       0xCE, 0x05, 0xE1, 0xFD, 0x60, 0x00, 0x2D, 0x00, 0xDB, 0xFF, 0x03,
-       0x00, 0x10, 0x00, 0x90, 0xFF, 0x2D, 0x01, 0xFF, 0xFD, 0x46, 0x02,
-       0x34, 0xFF, 0x71, 0xFA, 0x6B, 0x3D, 0xE5, 0x1C, 0x90, 0xF3, 0x35,
-       0x06, 0x55, 0xFD, 0xC6, 0x00, 0xF9, 0xFF, 0xEC, 0xFF, 0x01, 0x00,
-       0x11, 0x00, 0x8B, 0xFF, 0x51, 0x01, 0x86, 0xFD, 0x68, 0x03, 0xF3,
-       0xFC, 0xAE, 0xFE, 0x92, 0x40, 0xDA, 0x15, 0xD5, 0xF4, 0x35, 0x06,
-       0x00, 0xFD, 0x14, 0x01, 0xCE, 0xFF, 0xFA, 0xFF, 0x00, 0x00, 0x0F,
-       0x00, 0x8D, 0xFF, 0x63, 0x01, 0x28, 0xFD, 0x71, 0x04, 0x9E, 0xFA,
-       0xC7, 0x03, 0x79, 0x42, 0x0B, 0x0F, 0x97, 0xF6, 0xDA, 0x05, 0xE2,
-       0xFC, 0x48, 0x01, 0xAD, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x0B, 0x00, 0x9A, 0xFF, 0x5F, 0x01, 0xEF, 0xFC, 0x4F, 0x05, 0x5A,
-       0xF8, 0x9F, 0x09, 0x0A, 0x43, 0xAE, 0x08, 0xB1, 0xF8, 0x30, 0x05,
-       0xF5, 0xFC, 0x61, 0x01, 0x97, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x03,
-       0x00, 0xB1, 0xFF, 0x41, 0x01, 0xE3, 0xFC, 0xED, 0x05, 0x4C, 0xF6,
-       0x11, 0x10, 0x42, 0x42, 0xF1, 0x02, 0xFA, 0xFA, 0x4B, 0x04, 0x34,
-       0xFD, 0x61, 0x01, 0x8C, 0xFF, 0x10, 0x00, 0x01, 0x00, 0xF8, 0xFF,
-       0xD4, 0xFF, 0x0A, 0x01, 0x0A, 0xFD, 0x3C, 0x06, 0x9A, 0xF4, 0xED,
-       0x16, 0x2A, 0x40, 0xF8, 0xFD, 0x4D, 0xFD, 0x3C, 0x03, 0x97, 0xFD,
-       0x4C, 0x01, 0x8B, 0xFF, 0x11, 0x00, 0x02, 0x00, 0xEA, 0xFF, 0x00,
-       0x00, 0xB8, 0x00, 0x67, 0xFD, 0x2C, 0x06, 0x6B, 0xF3, 0xFC, 0x1D,
-       0xD3, 0x3C, 0xDF, 0xF9, 0x89, 0xFF, 0x18, 0x02, 0x13, 0xFE, 0x26,
-       0x01, 0x92, 0xFF, 0x0F, 0x00, 0x04, 0x00, 0xD9, 0xFF, 0x36, 0x00,
-       0x4E, 0x00, 0xFB, 0xFD, 0xB4, 0x05, 0xE4, 0xF2, 0x04, 0x25, 0x5F,
-       0x38, 0xB6, 0xF6, 0x90, 0x01, 0xF3, 0x00, 0x9F, 0xFE, 0xF3, 0x00,
-       0x9F, 0xFF, 0x0D, 0x00, 0x06, 0x00, 0xC6, 0xFF, 0x71, 0x00, 0xD1,
-       0xFF, 0xC2, 0xFE, 0xD1, 0x04, 0x23, 0xF3, 0xC9, 0x2B, 0xF5, 0x32,
-       0x83, 0xF4, 0x49, 0x03, 0xDC, 0xFF, 0x30, 0xFF, 0xB8, 0x00, 0xB0,
-       0xFF, 0x0A, 0x00, 0x09, 0x00, 0xB3, 0xFF, 0xAE, 0x00, 0x46, 0xFF,
-       0xB4, 0xFF, 0x85, 0x03, 0x42, 0xF4, 0x0E, 0x32, 0xCA, 0x2C, 0x41,
-       0xF3, 0xA5, 0x04, 0xE4, 0xFE, 0xBC, 0xFF, 0x7A, 0x00, 0xC3, 0xFF,
-       0x07, 0x00, 0x0D, 0x00, 0xA1, 0xFF, 0xEA, 0x00, 0xB5, 0xFE, 0xC6,
-       0x00, 0xD9, 0x01, 0x4F, 0xF6, 0x99, 0x37, 0x16, 0x26, 0xE0, 0xF2,
-       0x98, 0x05, 0x16, 0xFE, 0x3C, 0x00, 0x3F, 0x00, 0xD6, 0xFF, 0x04,
-       0x00, 0x0F, 0x00, 0x93, 0xFF, 0x1F, 0x01, 0x28, 0xFE, 0xEB, 0x01,
-       0xDD, 0xFF, 0x52, 0xF9, 0x36, 0x3C, 0x13, 0x1F, 0x4B, 0xF3, 0x20,
-       0x06, 0x7B, 0xFD, 0xA9, 0x00, 0x08, 0x00, 0xE7, 0xFF, 0x02, 0x00,
-       0x11, 0x00, 0x8C, 0xFF, 0x47, 0x01, 0xA9, 0xFD, 0x10, 0x03, 0xA8,
-       0xFD, 0x47, 0xFD, 0xBB, 0x3F, 0x01, 0x18, 0x62, 0xF4, 0x40, 0x06,
-       0x15, 0xFD, 0xFF, 0x00, 0xDA, 0xFF, 0xF6, 0xFF, 0x01, 0x00, 0x10,
-       0x00, 0x8B, 0xFF, 0x5F, 0x01, 0x41, 0xFD, 0x23, 0x04, 0x56, 0xFB,
-       0x1F, 0x02, 0x06, 0x42, 0x19, 0x11, 0x02, 0xF6, 0xFF, 0x05, 0xE5,
-       0xFC, 0x3B, 0x01, 0xB6, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x0D, 0x00,
-       0x95, 0xFF, 0x62, 0x01, 0xFC, 0xFC, 0x10, 0x05, 0x09, 0xF9, 0xC1,
-       0x07, 0x03, 0x43, 0x94, 0x0A, 0x05, 0xF8, 0x6C, 0x05, 0xEA, 0xFC,
-       0x5C, 0x01, 0x9D, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
-       0x00, 0xA9, 0xFF, 0x4D, 0x01, 0xE1, 0xFC, 0xC4, 0x05, 0xE6, 0xF6,
-       0x08, 0x0E, 0xA5, 0x42, 0xA1, 0x04, 0x43, 0xFA, 0x97, 0x04, 0x1D,
-       0xFD, 0x64, 0x01, 0x8F, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0xFF,
-       0xC8, 0xFF, 0x1E, 0x01, 0xF8, 0xFC, 0x2D, 0x06, 0x13, 0xF5, 0xC8,
-       0x14, 0xF2, 0x40, 0x69, 0xFF, 0x97, 0xFC, 0x92, 0x03, 0x75, 0xFD,
-       0x55, 0x01, 0x8A, 0xFF, 0x11, 0x00, 0x01, 0x00, 0xEF, 0xFF, 0xF2,
-       0xFF, 0xD4, 0x00, 0x45, 0xFD, 0x3B, 0x06, 0xB8, 0xF3, 0xCE, 0x1B,
-       0xFB, 0x3D, 0x08, 0xFB, 0xDE, 0xFE, 0x73, 0x02, 0xEB, 0xFD, 0x33,
-       0x01, 0x8F, 0xFF, 0x10, 0x00, 0x03, 0x00, 0xDE, 0xFF, 0x25, 0x00,
-       0x71, 0x00, 0xC8, 0xFD, 0xE5, 0x05, 0xFA, 0xF2, 0xDF, 0x22, 0xDB,
-       0x39, 0x94, 0xF7, 0xF7, 0x00, 0x4C, 0x01, 0x73, 0xFE, 0x03, 0x01,
-       0x9A, 0xFF, 0x0E, 0x00, 0x05, 0x00, 0xCC, 0xFF, 0x5E, 0x00, 0xF9,
-       0xFF, 0x80, 0xFE, 0x23, 0x05, 0xF9, 0xF2, 0xC0, 0x29, 0xB8, 0x34,
-       0x16, 0xF5, 0xCB, 0x02, 0x2F, 0x00, 0x03, 0xFF, 0xCA, 0x00, 0xAA,
-       0xFF, 0x0B, 0x00, 0x08, 0x00, 0xB8, 0xFF, 0x9B, 0x00, 0x72, 0xFF,
-       0x65, 0xFF, 0xF6, 0x03, 0xD1, 0xF3, 0x31, 0x30, 0xC1, 0x2E, 0x8B,
-       0xF3, 0x45, 0x04, 0x2D, 0xFF, 0x92, 0xFF, 0x8D, 0x00, 0xBD, 0xFF,
-       0x08, 0x00, 0x0C, 0x00, 0xA6, 0xFF, 0xD8, 0x00, 0xE2, 0xFE, 0x6F,
-       0x00, 0x66, 0x02, 0x93, 0xF5, 0xFB, 0x35, 0x31, 0x28, 0xE7, 0xF2,
-       0x59, 0x05, 0x51, 0xFE, 0x17, 0x00, 0x50, 0x00, 0xD0, 0xFF, 0x05,
-       0x00, 0x0E, 0x00, 0x97, 0xFF, 0x0F, 0x01, 0x53, 0xFE, 0x90, 0x01,
-       0x81, 0x00, 0x4B, 0xF8, 0xE6, 0x3A, 0x3F, 0x21, 0x16, 0xF3, 0x02,
-       0x06, 0xA5, 0xFD, 0x8A, 0x00, 0x18, 0x00, 0xE2, 0xFF, 0x02, 0x00,
-       0x10, 0x00, 0x8D, 0xFF, 0x3C, 0x01, 0xCE, 0xFD, 0xB7, 0x02, 0x5A,
-       0xFE, 0xF7, 0xFB, 0xC6, 0x3E, 0x2C, 0x1A, 0xFC, 0xF3, 0x41, 0x06,
-       0x2E, 0xFD, 0xE7, 0x00, 0xE7, 0xFF, 0xF2, 0xFF, 0x01, 0x00, 0x10,
-       0x00, 0x8B, 0xFF, 0x5A, 0x01, 0x5E, 0xFD, 0xD2, 0x03, 0x0E, 0xFC,
-       0x8B, 0x00, 0x75, 0x41, 0x32, 0x13, 0x75, 0xF5, 0x1C, 0x06, 0xEE,
-       0xFC, 0x2B, 0x01, 0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0E, 0x00,
-       0x91, 0xFF, 0x64, 0x01, 0x0D, 0xFD, 0xCD, 0x04, 0xBB, 0xF9, 0xF2,
-       0x05, 0xD9, 0x42, 0x88, 0x0C, 0x5E, 0xF7, 0xA1, 0x05, 0xE3, 0xFC,
-       0x54, 0x01, 0xA3, 0xFF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
-       0x00, 0xA2, 0xFF, 0x56, 0x01, 0xE5, 0xFC, 0x94, 0x05, 0x87, 0xF7,
-       0x0A, 0x0C, 0xE6, 0x42, 0x64, 0x06, 0x8E, 0xF9, 0xDE, 0x04, 0x09,
-       0xFD, 0x64, 0x01, 0x92, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0xBD, 0xFF, 0x2F, 0x01, 0xEC, 0xFC, 0x16, 0x06, 0x98, 0xF5, 0xAB,
-       0x12, 0x9C, 0x41, 0xEE, 0x00, 0xE0, 0xFB, 0xE6, 0x03, 0x57, 0xFD,
-       0x5B, 0x01, 0x8B, 0xFF, 0x10, 0x00, 0x01, 0x00, 0xF3, 0xFF, 0xE4,
-       0xFF, 0xED, 0x00, 0x27, 0xFD, 0x41, 0x06, 0x14, 0xF4, 0xA1, 0x19,
-       0x06, 0x3F, 0x49, 0xFC, 0x2E, 0xFE, 0xCD, 0x02, 0xC4, 0xFD, 0x3F,
-       0x01, 0x8D, 0xFF, 0x10, 0x00, 0x02, 0x00, 0xE3, 0xFF, 0x14, 0x00,
-       0x92, 0x00, 0x9A, 0xFD, 0x0A, 0x06, 0x22, 0xF3, 0xB4, 0x20, 0x3C,
-       0x3B, 0x8B, 0xF8, 0x58, 0x00, 0xA7, 0x01, 0x48, 0xFE, 0x13, 0x01,
-       0x96, 0xFF, 0x0F, 0x00, 0x04, 0x00, 0xD1, 0xFF, 0x4C, 0x00, 0x20,
-       0x00, 0x42, 0xFE, 0x6A, 0x05, 0xE3, 0xF2, 0xAB, 0x27, 0x66, 0x36,
-       0xC0, 0xF5, 0x44, 0x02, 0x85, 0x00, 0xD7, 0xFE, 0xDD, 0x00, 0xA5,
-       0xFF, 0x0C, 0x00, 0x07, 0x00, 0xBE, 0xFF, 0x89, 0x00, 0x9D, 0xFF,
-       0x1A, 0xFF, 0x5E, 0x04, 0x76, 0xF3, 0x45, 0x2E, 0xAA, 0x30, 0xEB,
-       0xF3, 0xDB, 0x03, 0x79, 0xFF, 0x67, 0xFF, 0xA0, 0x00, 0xB7, 0xFF,
-       0x09, 0x00, 0x0B, 0x00, 0xAC, 0xFF, 0xC6, 0x00, 0x0E, 0xFF, 0x1A,
-       0x00, 0xEB, 0x02, 0xEF, 0xF4, 0x49, 0x34, 0x43, 0x2A, 0x02, 0xF3,
-       0x0F, 0x05, 0x90, 0xFE, 0xEF, 0xFF, 0x63, 0x00, 0xCA, 0xFF, 0x06,
-       0x00, 0x0E, 0x00, 0x9B, 0xFF, 0xFF, 0x00, 0x7E, 0xFE, 0x36, 0x01,
-       0x1E, 0x01, 0x5B, 0xF7, 0x7E, 0x39, 0x69, 0x23, 0xF3, 0xF2, 0xD9,
-       0x05, 0xD4, 0xFD, 0x69, 0x00, 0x29, 0x00, 0xDD, 0xFF, 0x03, 0x00,
-       0x10, 0x00, 0x90, 0xFF, 0x30, 0x01, 0xF5, 0xFD, 0x5C, 0x02, 0x09,
-       0xFF, 0xBC, 0xFA, 0xB5, 0x3D, 0x5A, 0x1C, 0xA3, 0xF3, 0x38, 0x06,
-       0x4D, 0xFD, 0xCD, 0x00, 0xF5, 0xFF, 0xED, 0xFF, 0x01, 0x00, 0x11,
-       0x00, 0x8B, 0xFF, 0x53, 0x01, 0x7E, 0xFD, 0x7D, 0x03, 0xC5, 0xFC,
-       0x0B, 0xFF, 0xC3, 0x40, 0x51, 0x15, 0xF4, 0xF4, 0x31, 0x06, 0xFC,
-       0xFC, 0x19, 0x01, 0xCB, 0xFF, 0xFB, 0xFF, 0x00, 0x00, 0x0F, 0x00,
-       0x8E, 0xFF, 0x63, 0x01, 0x22, 0xFD, 0x84, 0x04, 0x71, 0xFA, 0x34,
-       0x04, 0x90, 0x42, 0x89, 0x0E, 0xBE, 0xF6, 0xCF, 0x05, 0xE1, 0xFC,
-       0x4A, 0x01, 0xAB, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B,
-       0x00, 0x9B, 0xFF, 0x5D, 0x01, 0xEC, 0xFC, 0x5D, 0x05, 0x2F, 0xF8,
-       0x19, 0x0A, 0x07, 0x43, 0x37, 0x08, 0xDD, 0xF8, 0x21, 0x05, 0xF8,
-       0xFC, 0x62, 0x01, 0x96, 0xFF, 0x0C, 0x00, 0x00, 0x00, 0x03, 0x00,
-       0xB4, 0xFF, 0x3E, 0x01, 0xE4, 0xFC, 0xF6, 0x05, 0x26, 0xF6, 0x95,
-       0x10, 0x26, 0x42, 0x87, 0x02, 0x28, 0xFB, 0x37, 0x04, 0x3B, 0xFD,
-       0x60, 0x01, 0x8C, 0xFF, 0x10, 0x00, 0x01, 0x00, 0xF7, 0xFF, 0xD7,
-       0xFF, 0x04, 0x01, 0x0F, 0xFD, 0x3E, 0x06, 0x7D, 0xF4, 0x76, 0x17,
-       0xF4, 0x3F, 0x9F, 0xFD, 0x7B, 0xFD, 0x26, 0x03, 0xA0, 0xFD, 0x4A,
-       0x01, 0x8B, 0xFF, 0x11, 0x00, 0x02, 0x00, 0xE9, 0xFF, 0x04, 0x00,
-       0xB1, 0x00, 0x71, 0xFD, 0x26, 0x06, 0x5A, 0xF3, 0x88, 0x1E, 0x87,
-       0x3C, 0x98, 0xF9, 0xB3, 0xFF, 0x02, 0x02, 0x1E, 0xFE, 0x22, 0x01,
-       0x93, 0xFF, 0x0F, 0x00, 0x04, 0x00, 0xD7, 0xFF, 0x3A, 0x00, 0x45,
-       0x00, 0x09, 0xFE, 0xA7, 0x05, 0xE1, 0xF2, 0x8D, 0x25, 0xFD, 0x37,
-       0x82, 0xF6, 0xB5, 0x01, 0xDC, 0x00, 0xAA, 0xFE, 0xEE, 0x00, 0xA0,
-       0xFF, 0x0D, 0x00, 0x06, 0x00, 0xC4, 0xFF, 0x76, 0x00, 0xC7, 0xFF,
-       0xD3, 0xFE, 0xBC, 0x04, 0x31, 0xF3, 0x4A, 0x2C, 0x83, 0x32, 0x61,
-       0xF4, 0x68, 0x03, 0xC8, 0xFF, 0x3B, 0xFF, 0xB3, 0x00, 0xB1, 0xFF,
-       0x0A, 0x00, 0x0A, 0x00, 0xB1, 0xFF, 0xB3, 0x00, 0x3B, 0xFF, 0xC8,
-       0xFF, 0x68, 0x03, 0x61, 0xF4, 0x83, 0x32, 0x4A, 0x2C, 0x31, 0xF3,
-       0xBC, 0x04, 0xD3, 0xFE, 0xC7, 0xFF, 0x76, 0x00, 0xC4, 0xFF, 0x06,
-       0x00, 0x0D, 0x00, 0xA0, 0xFF, 0xEE, 0x00, 0xAA, 0xFE, 0xDC, 0x00,
-       0xB5, 0x01, 0x82, 0xF6, 0xFD, 0x37, 0x8D, 0x25, 0xE1, 0xF2, 0xA7,
-       0x05, 0x09, 0xFE, 0x45, 0x00, 0x3A, 0x00, 0xD7, 0xFF, 0x04, 0x00,
-       0x0F, 0x00, 0x93, 0xFF, 0x22, 0x01, 0x1E, 0xFE, 0x02, 0x02, 0xB3,
-       0xFF, 0x98, 0xF9, 0x87, 0x3C, 0x88, 0x1E, 0x5A, 0xF3, 0x26, 0x06,
-       0x71, 0xFD, 0xB1, 0x00, 0x04, 0x00, 0xE9, 0xFF, 0x02, 0x00, 0x11,
-       0x00, 0x8B, 0xFF, 0x4A, 0x01, 0xA0, 0xFD, 0x26, 0x03, 0x7B, 0xFD,
-       0x9F, 0xFD, 0xF4, 0x3F, 0x76, 0x17, 0x7D, 0xF4, 0x3E, 0x06, 0x0F,
-       0xFD, 0x04, 0x01, 0xD7, 0xFF, 0xF7, 0xFF, 0x01, 0x00, 0x10, 0x00,
-       0x8C, 0xFF, 0x60, 0x01, 0x3B, 0xFD, 0x37, 0x04, 0x28, 0xFB, 0x87,
-       0x02, 0x26, 0x42, 0x95, 0x10, 0x26, 0xF6, 0xF6, 0x05, 0xE4, 0xFC,
-       0x3E, 0x01, 0xB4, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x96,
-       0xFF, 0x62, 0x01, 0xF8, 0xFC, 0x21, 0x05, 0xDD, 0xF8, 0x37, 0x08,
-       0x07, 0x43, 0x19, 0x0A, 0x2F, 0xF8, 0x5D, 0x05, 0xEC, 0xFC, 0x5D,
-       0x01, 0x9B, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
-       0xAB, 0xFF, 0x4A, 0x01, 0xE1, 0xFC, 0xCF, 0x05, 0xBE, 0xF6, 0x89,
-       0x0E, 0x90, 0x42, 0x34, 0x04, 0x71, 0xFA, 0x84, 0x04, 0x22, 0xFD,
-       0x63, 0x01, 0x8E, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0xFB, 0xFF, 0xCB,
-       0xFF, 0x19, 0x01, 0xFC, 0xFC, 0x31, 0x06, 0xF4, 0xF4, 0x51, 0x15,
-       0xC3, 0x40, 0x0B, 0xFF, 0xC5, 0xFC, 0x7D, 0x03, 0x7E, 0xFD, 0x53,
-       0x01, 0x8B, 0xFF, 0x11, 0x00, 0x01, 0x00, 0xED, 0xFF, 0xF5, 0xFF,
-       0xCD, 0x00, 0x4D, 0xFD, 0x38, 0x06, 0xA3, 0xF3, 0x5A, 0x1C, 0xB5,
-       0x3D, 0xBC, 0xFA, 0x09, 0xFF, 0x5C, 0x02, 0xF5, 0xFD, 0x30, 0x01,
-       0x90, 0xFF, 0x10, 0x00, 0x03, 0x00, 0xDD, 0xFF, 0x29, 0x00, 0x69,
-       0x00, 0xD4, 0xFD, 0xD9, 0x05, 0xF3, 0xF2, 0x69, 0x23, 0x7E, 0x39,
-       0x5B, 0xF7, 0x1E, 0x01, 0x36, 0x01, 0x7E, 0xFE, 0xFF, 0x00, 0x9B,
-       0xFF, 0x0E, 0x00, 0x06, 0x00, 0xCA, 0xFF, 0x63, 0x00, 0xEF, 0xFF,
-       0x90, 0xFE, 0x0F, 0x05, 0x02, 0xF3, 0x43, 0x2A, 0x49, 0x34, 0xEF,
-       0xF4, 0xEB, 0x02, 0x1A, 0x00, 0x0E, 0xFF, 0xC6, 0x00, 0xAC, 0xFF,
-       0x0B, 0x00, 0x09, 0x00, 0xB7, 0xFF, 0xA0, 0x00, 0x67, 0xFF, 0x79,
-       0xFF, 0xDB, 0x03, 0xEB, 0xF3, 0xAA, 0x30, 0x45, 0x2E, 0x76, 0xF3,
-       0x5E, 0x04, 0x1A, 0xFF, 0x9D, 0xFF, 0x89, 0x00, 0xBE, 0xFF, 0x07,
-       0x00, 0x0C, 0x00, 0xA5, 0xFF, 0xDD, 0x00, 0xD7, 0xFE, 0x85, 0x00,
-       0x44, 0x02, 0xC0, 0xF5, 0x66, 0x36, 0xAB, 0x27, 0xE3, 0xF2, 0x6A,
-       0x05, 0x42, 0xFE, 0x20, 0x00, 0x4C, 0x00, 0xD1, 0xFF, 0x04, 0x00,
-       0x0F, 0x00, 0x96, 0xFF, 0x13, 0x01, 0x48, 0xFE, 0xA7, 0x01, 0x58,
-       0x00, 0x8B, 0xF8, 0x3C, 0x3B, 0xB4, 0x20, 0x22, 0xF3, 0x0A, 0x06,
-       0x9A, 0xFD, 0x92, 0x00, 0x14, 0x00, 0xE3, 0xFF, 0x02, 0x00, 0x10,
-       0x00, 0x8D, 0xFF, 0x3F, 0x01, 0xC4, 0xFD, 0xCD, 0x02, 0x2E, 0xFE,
-       0x49, 0xFC, 0x06, 0x3F, 0xA1, 0x19, 0x14, 0xF4, 0x41, 0x06, 0x27,
-       0xFD, 0xED, 0x00, 0xE4, 0xFF, 0xF3, 0xFF, 0x01, 0x00, 0x10, 0x00,
-       0x8B, 0xFF, 0x5B, 0x01, 0x57, 0xFD, 0xE6, 0x03, 0xE0, 0xFB, 0xEE,
-       0x00, 0x9C, 0x41, 0xAB, 0x12, 0x98, 0xF5, 0x16, 0x06, 0xEC, 0xFC,
-       0x2F, 0x01, 0xBD, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x92,
-       0xFF, 0x64, 0x01, 0x09, 0xFD, 0xDE, 0x04, 0x8E, 0xF9, 0x64, 0x06,
-       0xE6, 0x42, 0x0A, 0x0C, 0x87, 0xF7, 0x94, 0x05, 0xE5, 0xFC, 0x56,
-       0x01, 0xA2, 0xFF, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
-       0xA3, 0xFF, 0x54, 0x01, 0xE3, 0xFC, 0xA1, 0x05, 0x5E, 0xF7, 0x88,
-       0x0C, 0xD9, 0x42, 0xF2, 0x05, 0xBB, 0xF9, 0xCD, 0x04, 0x0D, 0xFD,
-       0x64, 0x01, 0x91, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0,
-       0xFF, 0x2B, 0x01, 0xEE, 0xFC, 0x1C, 0x06, 0x75, 0xF5, 0x32, 0x13,
-       0x75, 0x41, 0x8B, 0x00, 0x0E, 0xFC, 0xD2, 0x03, 0x5E, 0xFD, 0x5A,
-       0x01, 0x8B, 0xFF, 0x10, 0x00, 0x01, 0x00, 0xF2, 0xFF, 0xE7, 0xFF,
-       0xE7, 0x00, 0x2E, 0xFD, 0x41, 0x06, 0xFC, 0xF3, 0x2C, 0x1A, 0xC6,
-       0x3E, 0xF7, 0xFB, 0x5A, 0xFE, 0xB7, 0x02, 0xCE, 0xFD, 0x3C, 0x01,
-       0x8D, 0xFF, 0x10, 0x00, 0x02, 0x00, 0xE2, 0xFF, 0x18, 0x00, 0x8A,
-       0x00, 0xA5, 0xFD, 0x02, 0x06, 0x16, 0xF3, 0x3F, 0x21, 0xE6, 0x3A,
-       0x4B, 0xF8, 0x81, 0x00, 0x90, 0x01, 0x53, 0xFE, 0x0F, 0x01, 0x97,
-       0xFF, 0x0E, 0x00, 0x05, 0x00, 0xD0, 0xFF, 0x50, 0x00, 0x17, 0x00,
-       0x51, 0xFE, 0x59, 0x05, 0xE7, 0xF2, 0x31, 0x28, 0xFB, 0x35, 0x93,
-       0xF5, 0x66, 0x02, 0x6F, 0x00, 0xE2, 0xFE, 0xD8, 0x00, 0xA6, 0xFF,
-       0x0C, 0x00, 0x08, 0x00, 0xBD, 0xFF, 0x8D, 0x00, 0x92, 0xFF, 0x2D,
-       0xFF, 0x45, 0x04, 0x8B, 0xF3, 0xC1, 0x2E, 0x31, 0x30, 0xD1, 0xF3,
-       0xF6, 0x03, 0x65, 0xFF, 0x72, 0xFF, 0x9B, 0x00, 0xB8, 0xFF, 0x08,
-       0x00, 0x0B, 0x00, 0xAA, 0xFF, 0xCA, 0x00, 0x03, 0xFF, 0x2F, 0x00,
-       0xCB, 0x02, 0x16, 0xF5, 0xB8, 0x34, 0xC0, 0x29, 0xF9, 0xF2, 0x23,
-       0x05, 0x80, 0xFE, 0xF9, 0xFF, 0x5E, 0x00, 0xCC, 0xFF, 0x05, 0x00,
-       0x0E, 0x00, 0x9A, 0xFF, 0x03, 0x01, 0x73, 0xFE, 0x4C, 0x01, 0xF7,
-       0x00, 0x94, 0xF7, 0xDB, 0x39, 0xDF, 0x22, 0xFA, 0xF2, 0xE5, 0x05,
-       0xC8, 0xFD, 0x71, 0x00, 0x25, 0x00, 0xDE, 0xFF, 0x03, 0x00, 0x10,
-       0x00, 0x8F, 0xFF, 0x33, 0x01, 0xEB, 0xFD, 0x73, 0x02, 0xDE, 0xFE,
-       0x08, 0xFB, 0xFB, 0x3D, 0xCE, 0x1B, 0xB8, 0xF3, 0x3B, 0x06, 0x45,
-       0xFD, 0xD4, 0x00, 0xF2, 0xFF, 0xEF, 0xFF, 0x01, 0x00, 0x11, 0x00,
-       0x8A, 0xFF, 0x55, 0x01, 0x75, 0xFD, 0x92, 0x03, 0x97, 0xFC, 0x69,
-       0xFF, 0xF2, 0x40, 0xC8, 0x14, 0x13, 0xF5, 0x2D, 0x06, 0xF8, 0xFC,
-       0x1E, 0x01, 0xC8, 0xFF, 0xFC, 0xFF, 0x00, 0x00, 0x0F, 0x00, 0x8F,
-       0xFF, 0x64, 0x01, 0x1D, 0xFD, 0x97, 0x04, 0x43, 0xFA, 0xA1, 0x04,
-       0xA5, 0x42, 0x08, 0x0E, 0xE6, 0xF6, 0xC4, 0x05, 0xE1, 0xFC, 0x4D,
-       0x01, 0xA9, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00,
-       0x9D, 0xFF, 0x5C, 0x01, 0xEA, 0xFC, 0x6C, 0x05, 0x05, 0xF8, 0x94,
-       0x0A, 0x03, 0x43, 0xC1, 0x07, 0x09, 0xF9, 0x10, 0x05, 0xFC, 0xFC,
-       0x62, 0x01, 0x95, 0xFF, 0x0D, 0x00, 0x00, 0x00, 0x02, 0x00, 0xB6,
-       0xFF, 0x3B, 0x01, 0xE5, 0xFC, 0xFF, 0x05, 0x02, 0xF6, 0x19, 0x11,
-       0x06, 0x42, 0x1F, 0x02, 0x56, 0xFB, 0x23, 0x04, 0x41, 0xFD, 0x5F,
-       0x01, 0x8B, 0xFF, 0x10, 0x00, 0x01, 0x00, 0xF6, 0xFF, 0xDA, 0xFF,
-       0xFF, 0x00, 0x15, 0xFD, 0x40, 0x06, 0x62, 0xF4, 0x01, 0x18, 0xBB,
-       0x3F, 0x47, 0xFD, 0xA8, 0xFD, 0x10, 0x03, 0xA9, 0xFD, 0x47, 0x01,
-       0x8C, 0xFF, 0x11, 0x00, 0x02, 0x00, 0xE7, 0xFF, 0x08, 0x00, 0xA9,
-       0x00, 0x7B, 0xFD, 0x20, 0x06, 0x4B, 0xF3, 0x13, 0x1F, 0x36, 0x3C,
-       0x52, 0xF9, 0xDD, 0xFF, 0xEB, 0x01, 0x28, 0xFE, 0x1F, 0x01, 0x93,
-       0xFF, 0x0F, 0x00, 0x04, 0x00, 0xD6, 0xFF, 0x3F, 0x00, 0x3C, 0x00,
-       0x16, 0xFE, 0x98, 0x05, 0xE0, 0xF2, 0x16, 0x26, 0x99, 0x37, 0x4F,
-       0xF6, 0xD9, 0x01, 0xC6, 0x00, 0xB5, 0xFE, 0xEA, 0x00, 0xA1, 0xFF,
-       0x0D, 0x00, 0x07, 0x00, 0xC3, 0xFF, 0x7A, 0x00, 0xBC, 0xFF, 0xE4,
-       0xFE, 0xA5, 0x04, 0x41, 0xF3, 0xCA, 0x2C, 0x0E, 0x32, 0x42, 0xF4,
-       0x85, 0x03, 0xB4, 0xFF, 0x46, 0xFF, 0xAE, 0x00, 0xB3, 0xFF, 0x09,
-       0x00, 0x0A, 0x00, 0xB0, 0xFF, 0xB8, 0x00, 0x30, 0xFF, 0xDC, 0xFF,
-       0x49, 0x03, 0x83, 0xF4, 0xF5, 0x32, 0xC9, 0x2B, 0x23, 0xF3, 0xD1,
-       0x04, 0xC2, 0xFE, 0xD1, 0xFF, 0x71, 0x00, 0xC6, 0xFF, 0x06, 0x00,
-       0x0D, 0x00, 0x9F, 0xFF, 0xF3, 0x00, 0x9F, 0xFE, 0xF3, 0x00, 0x90,
-       0x01, 0xB6, 0xF6, 0x5F, 0x38, 0x04, 0x25, 0xE4, 0xF2, 0xB4, 0x05,
-       0xFB, 0xFD, 0x4E, 0x00, 0x36, 0x00, 0xD9, 0xFF, 0x04, 0x00, 0x0F,
-       0x00, 0x92, 0xFF, 0x26, 0x01, 0x13, 0xFE, 0x18, 0x02, 0x89, 0xFF,
-       0xDF, 0xF9, 0xD3, 0x3C, 0xFC, 0x1D, 0x6B, 0xF3, 0x2C, 0x06, 0x67,
-       0xFD, 0xB8, 0x00, 0x00, 0x00, 0xEA, 0xFF, 0x02, 0x00, 0x11, 0x00,
-       0x8B, 0xFF, 0x4C, 0x01, 0x97, 0xFD, 0x3C, 0x03, 0x4D, 0xFD, 0xF8,
-       0xFD, 0x2A, 0x40, 0xED, 0x16, 0x9A, 0xF4, 0x3C, 0x06, 0x0A, 0xFD,
-       0x0A, 0x01, 0xD4, 0xFF, 0xF8, 0xFF, 0x01, 0x00, 0x10, 0x00, 0x8C,
-       0xFF, 0x61, 0x01, 0x34, 0xFD, 0x4B, 0x04, 0xFA, 0xFA, 0xF1, 0x02,
-       0x42, 0x42, 0x11, 0x10, 0x4C, 0xF6, 0xED, 0x05, 0xE3, 0xFC, 0x41,
-       0x01, 0xB1, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x97, 0xFF,
-       0x61, 0x01, 0xF5, 0xFC, 0x30, 0x05, 0xB1, 0xF8, 0xAE, 0x08, 0x0A,
-       0x43, 0x9F, 0x09, 0x5A, 0xF8, 0x4F, 0x05, 0xEF, 0xFC, 0x5F, 0x01,
-       0x9A, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xAD,
-       0xFF, 0x48, 0x01, 0xE2, 0xFC, 0xDA, 0x05, 0x97, 0xF6, 0x0B, 0x0F,
-       0x79, 0x42, 0xC7, 0x03, 0x9E, 0xFA, 0x71, 0x04, 0x28, 0xFD, 0x63,
-       0x01, 0x8D, 0xFF, 0x0F, 0x00 
-};
-
-static u16
-CoefficientSizes[] = {
-    /* Playback */
-    0x00C0, 0x5000, 0x0060, 0x2800, 0x0040, 0x0060, 0x1400, 0x0000,
-    /* Record */
-    0x0020, 0x1260, 0x0020, 0x1260, 0x0000, 0x0040, 0x1260, 0x0000,
-};
-
-#ifndef JUST_DATA
-
-static u16
-nm256_getStartOffset (u8 which)
-{
-    u16 offset = 0;
-
-    while (which-- > 0)
-       offset += CoefficientSizes[which];
-
-    return offset;
-}
-
-static void
-nm256_loadOneCoefficient (struct nm256_info *card, int devnum, u32 port, 
-                         u16 which)
-{
-    u32 coeffBuf = (which < 8) ? card->coeffBuf : card->allCoeffBuf;
-    u16 offset = nm256_getStartOffset (which);
-    u16 size = CoefficientSizes[which];
-
-    card->coeffsCurrent = 0;
-
-    if (nm256_debug)
-       printk (KERN_INFO "NM256: Loading coefficient buffer 0x%x-0x%x with coefficient %d, size %d, port 0x%x\n",
-               coeffBuf, coeffBuf + size - 1, which, size, port);
-    nm256_writeBuffer8 (card, coefficients + offset, 1, coeffBuf, size);
-    nm256_writePort32 (card, 2, port + 0, coeffBuf);
-    /* ???  Record seems to behave differently than playback.  */
-    if (devnum == 0)
-       size--;
-    nm256_writePort32 (card, 2, port + 4, coeffBuf + size);
-}
-
-static void
-nm256_loadAllCoefficients (struct nm256_info *card)
-{
-    nm256_writeBuffer8 (card, coefficients, 1, card->allCoeffBuf,
-                         NM_TOTAL_COEFF_COUNT * 4);
-    card->coeffsCurrent = 1;
-}
-
-static void
-nm256_loadCoefficient (struct nm256_info *card, int which, int number)
-{
-    static u16 addrs[3] = { 0x1c, 0x21c, 0x408 };
-    /* The enable register for the specified engine.  */
-    u32 poffset = (which == 1 ? 0x200 : 1);
-
-    if (nm256_readPort8 (card, 2, poffset) & 1) {
-       printk (KERN_ERR "NM256: Engine was enabled while loading coefficients!\n");
-       return;
-    }
-
-    /* The recording engine uses coefficient values 8-15.  */
-    if (which == 1)
-       number += 8;
-
-    if (! nm256_cachedCoefficients (card))
-       nm256_loadOneCoefficient (card, which, addrs[which], number);
-    else {
-       u32 base = card->allCoeffBuf;
-       u32 offset = nm256_getStartOffset (number);
-       u32 endOffset = offset + CoefficientSizes[number];
-
-       if (nm256_debug)
-           printk (KERN_DEBUG "loading coefficient %d at port 0x%x, offset %d (0x%x-0x%x)\n",
-                   number, addrs[which], offset, base + offset,
-                   base + endOffset - 1);
-
-       if (! card->coeffsCurrent)
-           nm256_loadAllCoefficients (card);
-
-       nm256_writePort32 (card, 2, addrs[which], base + offset);
-       nm256_writePort32 (card, 2, addrs[which] + 4, base + endOffset - 1);
-    }
-}
-
-#endif /* JUST_DATA */
-
-#endif
-\f
-/*
- * Local variables:
- *  c-basic-offset: 4
- * End:
- */
index fc273e55094480db93f3ad351c4e6aea49137c28..7781c13c147635b53b06756e31b0daae50b583c0 100644 (file)
@@ -34,7 +34,6 @@
 
 #include "sound_config.h"
 
-#include "opl3.h"
 #include "opl3_hw.h"
 
 #define MAX_VOICE      18
@@ -73,7 +72,6 @@ typedef struct opl_devinfo
        unsigned char   cmask;
 
        int             is_opl4;
-       int            *osp;
 } opl_devinfo;
 
 static struct opl_devinfo *devc = NULL;
@@ -144,7 +142,7 @@ static int opl3_ioctl(int dev, unsigned int cmd, void __user * arg)
        }
 }
 
-int opl3_detect(int ioaddr, int *osp)
+static int opl3_detect(int ioaddr)
 {
        /*
         * This function returns 1 if the FM chip is present at the given I/O port
@@ -182,7 +180,6 @@ int opl3_detect(int ioaddr, int *osp)
                goto cleanup_devc;
        }
 
-       devc->osp = osp;
        devc->base = ioaddr;
 
        /* Reset timers 1 and 2 */
@@ -1105,7 +1102,7 @@ static struct synth_operations opl3_operations =
        .setup_voice    = opl3_setup_voice
 };
 
-int opl3_init(int ioaddr, int *osp, struct module *owner)
+static int opl3_init(int ioaddr, struct module *owner)
 {
        int i;
        int me;
@@ -1194,9 +1191,6 @@ int opl3_init(int ioaddr, int *osp, struct module *owner)
        return me;
 }
 
-EXPORT_SYMBOL(opl3_init);
-EXPORT_SYMBOL(opl3_detect);
-
 static int me;
 
 static int io = -1;
@@ -1209,12 +1203,12 @@ static int __init init_opl3 (void)
 
        if (io != -1)   /* User loading pure OPL3 module */
        {
-               if (!opl3_detect(io, NULL))
+               if (!opl3_detect(io))
                {
                        return -ENODEV;
                }
 
-               me = opl3_init(io, NULL, THIS_MODULE);
+               me = opl3_init(io, THIS_MODULE);
        }
 
        return 0;
diff --git a/sound/oss/opl3.h b/sound/oss/opl3.h
deleted file mode 100644 (file)
index 0bc9a4b..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-
-int opl3_detect (int ioaddr, int *osp);
-int opl3_init(int ioaddr, int *osp, struct module *owner);
-
-void enable_opl3_mode(int left, int right, int both);
diff --git a/sound/oss/opl3sa2.c b/sound/oss/opl3sa2.c
deleted file mode 100644 (file)
index e20051f..0000000
+++ /dev/null
@@ -1,1020 +0,0 @@
-/*
- * sound/oss/opl3sa2.c
- *
- * A low level driver for Yamaha OPL3-SA2 and SA3 cards.
- * NOTE: All traces of the name OPL3-SAx have now (December 2000) been
- *       removed from the driver code, as an email exchange with Yamaha
- *       provided the information that the YMF-719 is indeed just a
- *       re-badged 715.
- *
- * Copyright 1998-2001 Scott Murray <scott@spiteful.org>
- *
- * Originally based on the CS4232 driver (in cs4232.c) by Hannu Savolainen
- * and others.  Now incorporates code/ideas from pss.c, also by Hannu
- * Savolainen.  Both of those files are distributed with the following
- * license:
- *
- * "Copyright (C) by Hannu Savolainen 1993-1997
- *
- *  OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
- *  Version 2 (June 1991). See the "COPYING" file distributed with this software
- *  for more info."
- *
- * As such, in accordance with the above license, this file, opl3sa2.c, is
- * distributed under the GNU GENERAL PUBLIC LICENSE (GPL) Version 2 (June 1991).
- * See the "COPYING" file distributed with this software for more information.
- *
- * Change History
- * --------------
- * Scott Murray            Original driver (Jun 14, 1998)
- * Paul J.Y. Lahaie        Changed probing / attach code order
- * Scott Murray            Added mixer support (Dec 03, 1998)
- * Scott Murray            Changed detection code to be more forgiving,
- *                         added force option as last resort,
- *                         fixed ioctl return values. (Dec 30, 1998)
- * Scott Murray            Simpler detection code should work all the time now
- *                         (with thanks to Ben Hutchings for the heuristic),
- *                         removed now unnecessary force option. (Jan 5, 1999)
- * Christoph Hellwig      Adapted to module_init/module_exit (Mar 4, 2000)
- * Scott Murray            Reworked SA2 versus SA3 mixer code, updated chipset
- *                         version detection code (again!). (Dec 5, 2000)
- * Scott Murray            Adjusted master volume mixer scaling. (Dec 6, 2000)
- * Scott Murray            Based on a patch by Joel Yliluoma (aka Bisqwit),
- *                         integrated wide mixer and adjusted mic, bass, treble
- *                         scaling. (Dec 6, 2000)
- * Scott Murray            Based on a patch by Peter Englmaier, integrated
- *                         ymode and loopback options. (Dec 6, 2000)
- * Scott Murray            Inspired by a patch by Peter Englmaier, and based on
- *                         what ALSA does, added initialization code for the
- *                         default DMA and IRQ settings. (Dec 6, 2000)
- * Scott Murray            Added some more checks to the card detection code,
- *                         based on what ALSA does. (Dec 12, 2000)
- * Scott Murray            Inspired by similar patches from John Fremlin,
- *                         Jim Radford, Mike Rolig, and Ingmar Steen, added 2.4
- *                         ISA PnP API support, mainly based on bits from
- *                         sb_card.c and awe_wave.c. (Dec 12, 2000)
- * Scott Murray            Some small cleanups to the init code output.
- *                         (Jan 7, 2001)
- * Zwane Mwaikambo        Added PM support. (Dec 4 2001)
- *
- * Adam Belay              Converted driver to new PnP Layer (Oct 12, 2002)
- * Zwane Mwaikambo        Code, data structure cleanups. (Feb 15 2002)
- * Zwane Mwaikambo        Free resources during auxiliary device probe
- *                        failures (Apr 29 2002)
- *   
- */
-
-#include <linux/pnp.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/delay.h>
-#include "sound_config.h"
-
-#include "ad1848.h"
-#include "mpu401.h"
-
-#define OPL3SA2_MODULE_NAME    "opl3sa2"
-#define PFX                    OPL3SA2_MODULE_NAME ": "
-
-/* Useful control port indexes: */
-#define OPL3SA2_PM          0x01
-#define OPL3SA2_SYS_CTRL     0x02
-#define OPL3SA2_IRQ_CONFIG   0x03
-#define OPL3SA2_DMA_CONFIG   0x06
-#define OPL3SA2_MASTER_LEFT  0x07
-#define OPL3SA2_MASTER_RIGHT 0x08
-#define OPL3SA2_MIC          0x09
-#define OPL3SA2_MISC         0x0A
-
-#define OPL3SA3_WIDE         0x14
-#define OPL3SA3_BASS         0x15
-#define OPL3SA3_TREBLE       0x16
-
-/* Useful constants: */
-#define DEFAULT_VOLUME 50
-#define DEFAULT_MIC    50
-#define DEFAULT_TIMBRE 0
-
-/* Power saving modes */
-#define OPL3SA2_PM_MODE0       0x00
-#define OPL3SA2_PM_MODE1       0x04    /* PSV */
-#define OPL3SA2_PM_MODE2       0x05    /* PSV | PDX */
-#define OPL3SA2_PM_MODE3       0x27    /* ADOWN | PSV | PDN | PDX */
-
-
-/* For checking against what the card returns: */
-#define VERSION_UNKNOWN 0
-#define VERSION_YMF711  1
-#define VERSION_YMF715  2
-#define VERSION_YMF715B 3
-#define VERSION_YMF715E 4
-/* also assuming that anything > 4 but <= 7 is a 715E */
-
-/* Chipset type constants for use below */
-#define CHIPSET_UNKNOWN -1
-#define CHIPSET_OPL3SA2 0
-#define CHIPSET_OPL3SA3 1
-static const char *CHIPSET_TABLE[] = {"OPL3-SA2", "OPL3-SA3"};
-
-#ifdef CONFIG_PNP
-#define OPL3SA2_CARDS_MAX 4
-#else
-#define OPL3SA2_CARDS_MAX 1
-#endif
-
-/* This should be pretty obvious */
-static int opl3sa2_cards_num;
-
-typedef struct {
-       /* device resources */
-       unsigned short cfg_port;
-       struct address_info cfg;
-       struct address_info cfg_mss;
-       struct address_info cfg_mpu;
-#ifdef CONFIG_PNP
-       /* PnP Stuff */
-       struct pnp_dev* pdev;
-       int activated;                  /* Whether said devices have been activated */
-#endif
-       unsigned int    card;
-       int             chipset;        /* What's my version(s)? */
-       char            *chipset_name;
-
-       /* mixer data */
-       int             mixer;
-       unsigned int    volume_l;
-       unsigned int    volume_r;
-       unsigned int    mic;
-       unsigned int    bass_l;
-       unsigned int    bass_r;
-       unsigned int    treble_l;
-       unsigned int    treble_r;
-       unsigned int    wide_l;
-       unsigned int    wide_r;
-} opl3sa2_state_t;
-static opl3sa2_state_t opl3sa2_state[OPL3SA2_CARDS_MAX];
-
-       
-
-/* Our parameters */
-static int __initdata io       = -1;
-static int __initdata mss_io   = -1;
-static int __initdata mpu_io   = -1;
-static int __initdata irq      = -1;
-static int __initdata dma      = -1;
-static int __initdata dma2     = -1;
-static int __initdata ymode    = -1;
-static int __initdata loopback = -1;
-
-#ifdef CONFIG_PNP
-/* PnP specific parameters */
-static int __initdata isapnp = 1;
-static int __initdata multiple = 1;
-
-/* Whether said devices have been activated */
-static int opl3sa2_activated[OPL3SA2_CARDS_MAX];
-#else
-static int __initdata isapnp; /* = 0 */
-static int __initdata multiple; /* = 0 */
-#endif
-
-MODULE_DESCRIPTION("Module for OPL3-SA2 and SA3 sound cards (uses AD1848 MSS driver).");
-MODULE_AUTHOR("Scott Murray <scott@spiteful.org>");
-MODULE_LICENSE("GPL");
-
-
-module_param(io, int, 0);
-MODULE_PARM_DESC(io, "Set I/O base of OPL3-SA2 or SA3 card (usually 0x370.  Address must be even and must be from 0x100 to 0xFFE)");
-
-module_param(mss_io, int, 0);
-MODULE_PARM_DESC(mss_io, "Set MSS (audio) I/O base (0x530, 0xE80, or other. Address must end in 0 or 4 and must be from 0x530 to 0xF48)");
-
-module_param(mpu_io, int, 0);
-MODULE_PARM_DESC(mpu_io, "Set MIDI I/O base (0x330 or other. Address must be even and must be from 0x300 to 0x334)");
-
-module_param(irq, int, 0);
-MODULE_PARM_DESC(irq, "Set MSS (audio) IRQ (5, 7, 9, 10, 11, 12)");
-
-module_param(dma, int, 0);
-MODULE_PARM_DESC(dma, "Set MSS (audio) first DMA channel (0, 1, 3)");
-
-module_param(dma2, int, 0);
-MODULE_PARM_DESC(dma2, "Set MSS (audio) second DMA channel (0, 1, 3)");
-
-module_param(ymode, int, 0);
-MODULE_PARM_DESC(ymode, "Set Yamaha 3D enhancement mode (0 = Desktop/Normal, 1 = Notebook PC (1), 2 = Notebook PC (2), 3 = Hi-Fi)");
-
-module_param(loopback, int, 0);
-MODULE_PARM_DESC(loopback, "Set A/D input source. Useful for echo cancellation (0 = Mic Rch (default), 1 = Mono output loopback)");
-
-#ifdef CONFIG_PNP
-module_param(isapnp, bool, 0);
-MODULE_PARM_DESC(isapnp, "When set to 0, ISA PnP support will be disabled");
-
-module_param(multiple, bool, 0);
-MODULE_PARM_DESC(multiple, "When set to 0, will not search for multiple cards");
-#endif
-
-
-/*
- * Standard read and write functions
-*/
-
-static inline void opl3sa2_write(unsigned short port,
-                                unsigned char  index,
-                                unsigned char  data)
-{
-       outb_p(index, port);
-       outb(data, port + 1);
-}
-
-
-static inline void opl3sa2_read(unsigned short port,
-                               unsigned char  index,
-                               unsigned char* data)
-{
-       outb_p(index, port);
-       *data = inb(port + 1);
-}
-
-
-/*
- * All of the mixer functions...
- */
-
-static void opl3sa2_set_volume(opl3sa2_state_t* devc, int left, int right)
-{
-       static unsigned char scale[101] = {
-               0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e,
-               0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0c,
-               0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b,
-               0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09,
-               0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08,
-               0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
-               0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
-               0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03,
-               0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01,
-               0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
-               0x00
-       };
-       unsigned char vol;
-
-       vol = scale[left];
-
-       /* If level is zero, turn on mute */
-       if(!left)
-               vol |= 0x80;
-
-       opl3sa2_write(devc->cfg_port, OPL3SA2_MASTER_LEFT, vol);
-
-       vol = scale[right];
-
-       /* If level is zero, turn on mute */
-       if(!right)
-               vol |= 0x80;
-
-       opl3sa2_write(devc->cfg_port, OPL3SA2_MASTER_RIGHT, vol);
-}
-
-
-static void opl3sa2_set_mic(opl3sa2_state_t* devc, int level)
-{
-       unsigned char vol = 0x1F;
-
-       if((level >= 0) && (level <= 100))
-               vol = 0x1F - (unsigned char) (32 * level / 101);
-
-       /* If level is zero, turn on mute */
-       if(!level)
-               vol |= 0x80;
-
-       opl3sa2_write(devc->cfg_port, OPL3SA2_MIC, vol);
-}
-
-
-static void opl3sa3_set_bass(opl3sa2_state_t* devc, int left, int right)
-{
-       unsigned char bass;
-
-       bass = left ? ((unsigned char) (8 * left / 101)) : 0; 
-       bass |= (right ? ((unsigned char) (8 * right / 101)) : 0) << 4;
-
-       opl3sa2_write(devc->cfg_port, OPL3SA3_BASS, bass);
-}
-
-
-static void opl3sa3_set_treble(opl3sa2_state_t* devc, int left, int right)
-{      
-       unsigned char treble;
-
-       treble = left ? ((unsigned char) (8 * left / 101)) : 0; 
-       treble |= (right ? ((unsigned char) (8 * right / 101)) : 0) << 4;
-
-       opl3sa2_write(devc->cfg_port, OPL3SA3_TREBLE, treble);
-}
-
-
-
-
-static void opl3sa2_mixer_reset(opl3sa2_state_t* devc)
-{
-       if (devc) {
-               opl3sa2_set_volume(devc, DEFAULT_VOLUME, DEFAULT_VOLUME);
-               devc->volume_l = devc->volume_r = DEFAULT_VOLUME;
-
-               opl3sa2_set_mic(devc, DEFAULT_MIC);
-               devc->mic = DEFAULT_MIC;
-
-               if (devc->chipset == CHIPSET_OPL3SA3) {
-                       opl3sa3_set_bass(devc, DEFAULT_TIMBRE, DEFAULT_TIMBRE);
-                       devc->bass_l = devc->bass_r = DEFAULT_TIMBRE;
-                       opl3sa3_set_treble(devc, DEFAULT_TIMBRE, DEFAULT_TIMBRE);
-                       devc->treble_l = devc->treble_r = DEFAULT_TIMBRE;
-               }
-       }
-}
-
-static inline void arg_to_vol_mono(unsigned int vol, int* value)
-{
-       int left;
-       
-       left = vol & 0x00ff;
-       if (left > 100)
-               left = 100;
-       *value = left;
-}
-
-
-static inline void arg_to_vol_stereo(unsigned int vol, int* aleft, int* aright)
-{
-       arg_to_vol_mono(vol, aleft);
-       arg_to_vol_mono(vol >> 8, aright);
-}
-
-
-static inline int ret_vol_mono(int vol)
-{
-       return ((vol << 8) | vol);
-}
-
-
-static inline int ret_vol_stereo(int left, int right)
-{
-       return ((right << 8) | left);
-}
-
-
-static int opl3sa2_mixer_ioctl(int dev, unsigned int cmd, void __user *arg)
-{
-       int retval, value, cmdf = cmd & 0xff;
-       int __user *p = (int __user *)arg;
-
-       opl3sa2_state_t* devc = &opl3sa2_state[dev];
-       
-       switch (cmdf) {
-               case SOUND_MIXER_VOLUME:
-               case SOUND_MIXER_MIC:
-               case SOUND_MIXER_DEVMASK:
-               case SOUND_MIXER_STEREODEVS: 
-               case SOUND_MIXER_RECMASK:
-               case SOUND_MIXER_RECSRC:
-               case SOUND_MIXER_CAPS: 
-                       break;
-
-               default:
-                       return -EINVAL;
-       }
-       
-       if (((cmd >> 8) & 0xff) != 'M')
-               return -EINVAL;
-               
-       retval = 0;
-       if (_SIOC_DIR (cmd) & _SIOC_WRITE) {
-               switch (cmdf) {
-                       case SOUND_MIXER_VOLUME:
-                               retval = get_user(value, (unsigned __user *) arg);
-                               if (retval)
-                                       break;
-                               arg_to_vol_stereo(value, &devc->volume_l, &devc->volume_r);
-                               opl3sa2_set_volume(devc, devc->volume_l, devc->volume_r);
-                               value = ret_vol_stereo(devc->volume_l, devc->volume_r);
-                               retval = put_user(value, p);
-                               break;
-                 
-                       case SOUND_MIXER_MIC:
-                               retval = get_user(value, (unsigned __user *) arg);
-                               if (retval)
-                                       break;
-                               arg_to_vol_mono(value, &devc->mic);
-                               opl3sa2_set_mic(devc, devc->mic);
-                               value = ret_vol_mono(devc->mic);
-                               retval = put_user(value, p);
-                               break;
-
-                       default:
-                               retval = -EINVAL;
-               }
-       }
-       else {
-               /*
-                * Return parameters
-                */
-               switch (cmdf) {
-                       case SOUND_MIXER_DEVMASK:
-                               retval = put_user(SOUND_MASK_VOLUME | SOUND_MASK_MIC, p);
-                               break;
-                 
-                       case SOUND_MIXER_STEREODEVS:
-                               retval = put_user(SOUND_MASK_VOLUME, p);
-                               break;
-                 
-                       case SOUND_MIXER_RECMASK:
-                               /* No recording devices */
-                               retval = put_user(0, p);
-                               break;
-
-                       case SOUND_MIXER_CAPS:
-                               retval = put_user(SOUND_CAP_EXCL_INPUT, p);
-                               break;
-
-                       case SOUND_MIXER_RECSRC:
-                               /* No recording source */
-                               retval = put_user(0, p);
-                               break;
-
-                       case SOUND_MIXER_VOLUME:
-                               value = ret_vol_stereo(devc->volume_l, devc->volume_r);
-                               retval = put_user(value, p);
-                               break;
-                         
-                       case SOUND_MIXER_MIC:
-                               value = ret_vol_mono(devc->mic);
-                               put_user(value, p);
-                               break;
-
-                       default:
-                               retval = -EINVAL;
-               }
-       }
-       return retval;
-}
-/* opl3sa2_mixer_ioctl end */
-
-
-static int opl3sa3_mixer_ioctl(int dev, unsigned int cmd, void __user * arg)
-{
-       int value, retval, cmdf = cmd & 0xff;
-
-       opl3sa2_state_t* devc = &opl3sa2_state[dev];
-
-       switch (cmdf) {
-       case SOUND_MIXER_BASS:
-               value = ret_vol_stereo(devc->bass_l, devc->bass_r);
-               retval = put_user(value, (int __user *) arg);
-               break;
-               
-       case SOUND_MIXER_TREBLE:
-               value = ret_vol_stereo(devc->treble_l, devc->treble_r);
-               retval = put_user(value, (int __user *) arg);
-               break;
-
-       case SOUND_MIXER_DIGITAL1:
-               value = ret_vol_stereo(devc->wide_l, devc->wide_r);
-               retval = put_user(value, (int __user *) arg);
-               break;
-
-       default:
-               retval = -EINVAL;
-       }
-       return retval;
-}
-/* opl3sa3_mixer_ioctl end */
-
-
-static struct mixer_operations opl3sa2_mixer_operations =
-{
-       .owner  = THIS_MODULE,
-       .id     = "OPL3-SA2",
-       .name   = "Yamaha OPL3-SA2",
-       .ioctl  = opl3sa2_mixer_ioctl
-};
-
-static struct mixer_operations opl3sa3_mixer_operations =
-{
-       .owner  = THIS_MODULE,
-       .id     = "OPL3-SA3",
-       .name   = "Yamaha OPL3-SA3",
-       .ioctl  = opl3sa3_mixer_ioctl
-};
-
-/* End of mixer-related stuff */
-
-
-/*
- * Component probe, attach, unload functions
- */
-
-static inline void __exit unload_opl3sa2_mpu(struct address_info *hw_config)
-{
-       unload_mpu401(hw_config);
-}
-
-
-static void __init attach_opl3sa2_mss(struct address_info* hw_config, struct resource *ports)
-{
-       int initial_mixers;
-
-       initial_mixers = num_mixers;
-       attach_ms_sound(hw_config, ports, THIS_MODULE); /* Slot 0 */
-       if (hw_config->slots[0] != -1) {
-               /* Did the MSS driver install? */
-               if(num_mixers == (initial_mixers + 1)) {
-                       /* The MSS mixer is installed, reroute mixers appropriately */
-                       AD1848_REROUTE(SOUND_MIXER_LINE1, SOUND_MIXER_CD);
-                       AD1848_REROUTE(SOUND_MIXER_LINE2, SOUND_MIXER_SYNTH);
-                       AD1848_REROUTE(SOUND_MIXER_LINE3, SOUND_MIXER_LINE);
-               }
-               else {
-                       printk(KERN_ERR PFX "MSS mixer not installed?\n");
-               }
-       }
-}
-
-
-static inline void __exit unload_opl3sa2_mss(struct address_info* hw_config)
-{
-       unload_ms_sound(hw_config);
-}
-
-
-static int __init probe_opl3sa2(struct address_info* hw_config, int card)
-{
-       unsigned char misc;
-       unsigned char tmp;
-       unsigned char version;
-
-       /*
-        * Try and allocate our I/O port range.
-        */
-       if (!request_region(hw_config->io_base, 2, OPL3SA2_MODULE_NAME)) {
-               printk(KERN_ERR PFX "Control I/O port %#x not free\n",
-                      hw_config->io_base);
-               goto out_nodev;
-       }
-
-       /*
-        * Check if writing to the read-only version bits of the miscellaneous
-        * register succeeds or not (it should not).
-        */
-       opl3sa2_read(hw_config->io_base, OPL3SA2_MISC, &misc);
-       opl3sa2_write(hw_config->io_base, OPL3SA2_MISC, misc ^ 0x07);
-       opl3sa2_read(hw_config->io_base, OPL3SA2_MISC, &tmp);
-       if(tmp != misc) {
-               printk(KERN_ERR PFX "Control I/O port %#x is not a YMF7xx chipset!\n",
-                      hw_config->io_base);
-               goto out_region;
-       }
-
-       /*
-        * Check if the MIC register is accessible.
-        */
-       opl3sa2_read(hw_config->io_base, OPL3SA2_MIC, &tmp);
-       opl3sa2_write(hw_config->io_base, OPL3SA2_MIC, 0x8a);
-       opl3sa2_read(hw_config->io_base, OPL3SA2_MIC, &tmp);
-       if((tmp & 0x9f) != 0x8a) {
-               printk(KERN_ERR
-                      PFX "Control I/O port %#x is not a YMF7xx chipset!\n",
-                      hw_config->io_base);
-               goto out_region;
-       }
-       opl3sa2_write(hw_config->io_base, OPL3SA2_MIC, tmp);
-
-       /*
-        * Determine chipset type (SA2 or SA3)
-        *
-        * This is done by looking at the chipset version in the lower 3 bits
-        * of the miscellaneous register.
-        */
-       version = misc & 0x07;
-       printk(KERN_DEBUG PFX "Chipset version = %#x\n", version);
-       switch (version) {
-               case 0:
-                       opl3sa2_state[card].chipset = CHIPSET_UNKNOWN;
-                       printk(KERN_ERR
-                              PFX "Unknown Yamaha audio controller version\n");
-                       break;
-
-               case VERSION_YMF711:
-                       opl3sa2_state[card].chipset = CHIPSET_OPL3SA2;
-                       printk(KERN_INFO PFX "Found OPL3-SA2 (YMF711)\n");
-                       break;
-
-               case VERSION_YMF715:
-                       opl3sa2_state[card].chipset = CHIPSET_OPL3SA3;
-                       printk(KERN_INFO
-                              PFX "Found OPL3-SA3 (YMF715 or YMF719)\n");
-                       break;
-
-               case VERSION_YMF715B:
-                       opl3sa2_state[card].chipset = CHIPSET_OPL3SA3;
-                       printk(KERN_INFO
-                              PFX "Found OPL3-SA3 (YMF715B or YMF719B)\n");
-                       break;
-
-               case VERSION_YMF715E:
-               default:
-                       opl3sa2_state[card].chipset = CHIPSET_OPL3SA3;
-                       printk(KERN_INFO
-                              PFX "Found OPL3-SA3 (YMF715E or YMF719E)\n");
-                       break;
-       }
-
-       if (opl3sa2_state[card].chipset != CHIPSET_UNKNOWN) {
-               /* Generate a pretty name */
-               opl3sa2_state[card].chipset_name = (char *)CHIPSET_TABLE[opl3sa2_state[card].chipset];
-               return 0;
-       }
-
-out_region:
-       release_region(hw_config->io_base, 2);
-out_nodev:
-       return -ENODEV;
-}
-
-
-static void __init attach_opl3sa2(struct address_info* hw_config, int card)
-{
-       /* Initialize IRQ configuration to IRQ-B: -, IRQ-A: WSS+MPU+OPL3 */
-       opl3sa2_write(hw_config->io_base, OPL3SA2_IRQ_CONFIG, 0x0d);
-
-       /* Initialize DMA configuration */
-       if(hw_config->dma2 == hw_config->dma) {
-               /* Want DMA configuration DMA-B: -, DMA-A: WSS-P+WSS-R */
-               opl3sa2_write(hw_config->io_base, OPL3SA2_DMA_CONFIG, 0x03);
-       }
-       else {
-               /* Want DMA configuration DMA-B: WSS-R, DMA-A: WSS-P */
-               opl3sa2_write(hw_config->io_base, OPL3SA2_DMA_CONFIG, 0x21);
-       }
-}
-
-
-static void __init attach_opl3sa2_mixer(struct address_info *hw_config, int card)
-{
-       struct mixer_operations* mixer_operations;
-       opl3sa2_state_t* devc = &opl3sa2_state[card];
-
-       /* Install master mixer */
-       if (devc->chipset == CHIPSET_OPL3SA3) {
-               mixer_operations = &opl3sa3_mixer_operations;
-       }
-       else {
-               mixer_operations = &opl3sa2_mixer_operations;
-       }
-
-       devc->cfg_port = hw_config->io_base;
-       devc->mixer = sound_install_mixer(MIXER_DRIVER_VERSION,
-                                         mixer_operations->name,
-                                         mixer_operations,
-                                         sizeof(struct mixer_operations),
-                                         devc);
-       if(devc->mixer < 0) {
-               printk(KERN_ERR PFX "Could not install %s master mixer\n",
-                        mixer_operations->name);
-       }
-       else {
-                       opl3sa2_mixer_reset(devc);
-
-       }
-}
-
-
-static void opl3sa2_clear_slots(struct address_info* hw_config)
-{
-       int i;
-
-       for(i = 0; i < 6; i++) {
-               hw_config->slots[i] = -1;
-       }
-}
-
-
-static void __init opl3sa2_set_ymode(struct address_info* hw_config, int ymode)
-{
-       /*
-        * Set the Yamaha 3D enhancement mode (aka Ymersion) if asked to and
-        * it's supported.
-        *
-        * 0: Desktop (aka normal)   5-12 cm speakers
-        * 1: Notebook PC mode 1     3 cm speakers
-        * 2: Notebook PC mode 2     1.5 cm speakers
-        * 3: Hi-fi                  16-38 cm speakers
-        */
-       if(ymode >= 0 && ymode <= 3) {
-               unsigned char sys_ctrl;
-
-               opl3sa2_read(hw_config->io_base, OPL3SA2_SYS_CTRL, &sys_ctrl);
-               sys_ctrl = (sys_ctrl & 0xcf) | ((ymode & 3) << 4);
-               opl3sa2_write(hw_config->io_base, OPL3SA2_SYS_CTRL, sys_ctrl);
-       }
-       else {
-               printk(KERN_ERR PFX "not setting ymode, it must be one of 0,1,2,3\n");
-       }
-}
-
-
-static void __init opl3sa2_set_loopback(struct address_info* hw_config, int loopback)
-{
-       if(loopback >= 0 && loopback <= 1) {
-               unsigned char misc;
-
-               opl3sa2_read(hw_config->io_base, OPL3SA2_MISC, &misc);
-               misc = (misc & 0xef) | ((loopback & 1) << 4);
-               opl3sa2_write(hw_config->io_base, OPL3SA2_MISC, misc);
-       }
-       else {
-               printk(KERN_ERR PFX "not setting loopback, it must be either 0 or 1\n");
-       }
-}
-
-
-static void __exit unload_opl3sa2(struct address_info* hw_config, int card)
-{
-        /* Release control ports */
-       release_region(hw_config->io_base, 2);
-
-       /* Unload mixer */
-       if(opl3sa2_state[card].mixer >= 0)
-               sound_unload_mixerdev(opl3sa2_state[card].mixer);
-
-}
-
-#ifdef CONFIG_PNP
-static struct pnp_device_id pnp_opl3sa2_list[] = {
-       {.id = "YMH0021", .driver_data = 0},
-       {.id = ""}
-};
-
-MODULE_DEVICE_TABLE(pnp, pnp_opl3sa2_list);
-
-static int opl3sa2_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
-{
-       int card = opl3sa2_cards_num;
-
-       /* we don't actually want to return an error as the user may have specified
-        * no multiple card search
-        */
-
-       if (opl3sa2_cards_num == OPL3SA2_CARDS_MAX)
-               return 0;
-       opl3sa2_activated[card] = 1;
-
-       /* Our own config: */
-       opl3sa2_state[card].cfg.io_base = pnp_port_start(dev, 4);
-       opl3sa2_state[card].cfg.irq     = pnp_irq(dev, 0);
-       opl3sa2_state[card].cfg.dma     = pnp_dma(dev, 0);
-       opl3sa2_state[card].cfg.dma2    = pnp_dma(dev, 1);
-
-       /* The MSS config: */
-       opl3sa2_state[card].cfg_mss.io_base      = pnp_port_start(dev, 1);
-       opl3sa2_state[card].cfg_mss.irq          = pnp_irq(dev, 0);
-       opl3sa2_state[card].cfg_mss.dma          = pnp_dma(dev, 0);
-       opl3sa2_state[card].cfg_mss.dma2         = pnp_dma(dev, 1);
-       opl3sa2_state[card].cfg_mss.card_subtype = 1; /* No IRQ or DMA setup */
-
-       opl3sa2_state[card].cfg_mpu.io_base       = pnp_port_start(dev, 3);
-       opl3sa2_state[card].cfg_mpu.irq           = pnp_irq(dev, 0);
-       opl3sa2_state[card].cfg_mpu.dma           = -1;
-       opl3sa2_state[card].cfg_mpu.dma2          = -1;
-       opl3sa2_state[card].cfg_mpu.always_detect = 1; /* It's there, so use shared IRQs */
-
-       /* Call me paranoid: */
-       opl3sa2_clear_slots(&opl3sa2_state[card].cfg);
-       opl3sa2_clear_slots(&opl3sa2_state[card].cfg_mss);
-       opl3sa2_clear_slots(&opl3sa2_state[card].cfg_mpu);
-
-       opl3sa2_state[card].pdev = dev;
-       opl3sa2_cards_num++;
-
-       return 0;
-}
-
-static struct pnp_driver opl3sa2_driver = {
-       .name           = "opl3sa2",
-       .id_table       = pnp_opl3sa2_list,
-       .probe          = opl3sa2_pnp_probe,
-};
-
-#endif /* CONFIG_PNP */
-
-/* End of component functions */
-
-/*
- * Install OPL3-SA2 based card(s).
- *
- * Need to have ad1848 and mpu401 loaded ready.
- */
-static int __init init_opl3sa2(void)
-{
-       int card, max;
-
-       /* Sanitize isapnp and multiple settings */
-       isapnp = isapnp != 0 ? 1 : 0;
-       multiple = multiple != 0 ? 1 : 0;
-
-       max = (multiple && isapnp) ? OPL3SA2_CARDS_MAX : 1;
-
-#ifdef CONFIG_PNP
-       if (isapnp){
-               pnp_register_driver(&opl3sa2_driver);
-               if(!opl3sa2_cards_num){
-                       printk(KERN_INFO PFX "No PnP cards found\n");
-                       isapnp = 0;
-               }
-               max = opl3sa2_cards_num;
-       }
-#endif
-
-       for (card = 0; card < max; card++) {
-               /* If a user wants an I/O then assume they meant it */
-               struct resource *ports;
-               int base;
-               
-               if (!isapnp) {
-                       if (io == -1 || irq == -1 || dma == -1 ||
-                           dma2 == -1 || mss_io == -1) {
-                               printk(KERN_ERR
-                                      PFX "io, mss_io, irq, dma, and dma2 must be set\n");
-                               return -EINVAL;
-                       }
-                       opl3sa2_cards_num++;
-
-                       /*
-                        * Our own config:
-                        * (NOTE: IRQ and DMA aren't used, so they're set to
-                        *  give pretty output from conf_printf. :)
-                        */
-                       opl3sa2_state[card].cfg.io_base = io;
-                       opl3sa2_state[card].cfg.irq     = irq;
-                       opl3sa2_state[card].cfg.dma     = dma;
-                       opl3sa2_state[card].cfg.dma2    = dma2;
-       
-                       /* The MSS config: */
-                       opl3sa2_state[card].cfg_mss.io_base      = mss_io;
-                       opl3sa2_state[card].cfg_mss.irq          = irq;
-                       opl3sa2_state[card].cfg_mss.dma          = dma;
-                       opl3sa2_state[card].cfg_mss.dma2         = dma2;
-                       opl3sa2_state[card].cfg_mss.card_subtype = 1; /* No IRQ or DMA setup */
-
-                       opl3sa2_state[card].cfg_mpu.io_base       = mpu_io;
-                       opl3sa2_state[card].cfg_mpu.irq           = irq;
-                       opl3sa2_state[card].cfg_mpu.dma           = -1;
-                       opl3sa2_state[card].cfg_mpu.always_detect = 1; /* Use shared IRQs */
-
-                       /* Call me paranoid: */
-                       opl3sa2_clear_slots(&opl3sa2_state[card].cfg);
-                       opl3sa2_clear_slots(&opl3sa2_state[card].cfg_mss);
-                       opl3sa2_clear_slots(&opl3sa2_state[card].cfg_mpu);
-               }
-
-               /* FIXME: leak */
-               if (probe_opl3sa2(&opl3sa2_state[card].cfg, card))
-                       return -ENODEV;
-
-               base = opl3sa2_state[card].cfg_mss.io_base;
-
-               if (!request_region(base, 4, "WSS config"))
-                       goto failed;
-
-               ports = request_region(base + 4, 4, "ad1848");
-               if (!ports)
-                       goto failed2;
-
-               if (!probe_ms_sound(&opl3sa2_state[card].cfg_mss, ports)) {
-                       /*
-                        * If one or more cards are already registered, don't
-                        * return an error but print a warning.  Note, this
-                        * should never really happen unless the hardware or
-                        * ISA PnP screwed up.
-                        */
-                       release_region(base + 4, 4);
-               failed2:
-                       release_region(base, 4);
-               failed:
-                       release_region(opl3sa2_state[card].cfg.io_base, 2);
-
-                       if (opl3sa2_cards_num) {
-                               printk(KERN_WARNING
-                                      PFX "There was a problem probing one "
-                                      " of the ISA PNP cards, continuing\n");
-                               opl3sa2_cards_num--;
-                               continue;
-                       } else
-                               return -ENODEV;
-               }
-
-               attach_opl3sa2(&opl3sa2_state[card].cfg, card);
-               conf_printf(opl3sa2_state[card].chipset_name, &opl3sa2_state[card].cfg);
-               attach_opl3sa2_mixer(&opl3sa2_state[card].cfg, card);
-               attach_opl3sa2_mss(&opl3sa2_state[card].cfg_mss, ports);
-
-               /* ewww =) */
-               opl3sa2_state[card].card = card;
-
-               /*
-                * Set the Yamaha 3D enhancement mode (aka Ymersion) if asked to and
-                * it's supported.
-                */
-               if (ymode != -1) {
-                       if (opl3sa2_state[card].chipset == CHIPSET_OPL3SA2) {
-                               printk(KERN_ERR
-                                      PFX "ymode not supported on OPL3-SA2\n");
-                       }
-                       else {
-                               opl3sa2_set_ymode(&opl3sa2_state[card].cfg, ymode);
-                       }
-               }
-
-
-               /* Set A/D input to Mono loopback if asked to. */
-               if (loopback != -1) {
-                       opl3sa2_set_loopback(&opl3sa2_state[card].cfg, loopback);
-               }
-               
-               /* Attach MPU if we've been asked to do so, failure isn't fatal */
-               if (opl3sa2_state[card].cfg_mpu.io_base != -1) {
-                       int base = opl3sa2_state[card].cfg_mpu.io_base;
-                       struct resource *ports;
-                       ports = request_region(base, 2, "mpu401");
-                       if (!ports)
-                               goto out;
-                       if (!probe_mpu401(&opl3sa2_state[card].cfg_mpu, ports)) {
-                               release_region(base, 2);
-                               goto out;
-                       }
-                       if (attach_mpu401(&opl3sa2_state[card].cfg_mpu, THIS_MODULE)) {
-                               printk(KERN_ERR PFX "failed to attach MPU401\n");
-                               opl3sa2_state[card].cfg_mpu.slots[1] = -1;
-                       }
-               }
-       }
-
-out:
-       if (isapnp) {
-               printk(KERN_NOTICE PFX "%d PnP card(s) found.\n", opl3sa2_cards_num);
-       }
-
-       return 0;
-}
-
-
-/*
- * Uninstall OPL3-SA2 based card(s).
- */
-static void __exit cleanup_opl3sa2(void)
-{
-       int card;
-
-       for(card = 0; card < opl3sa2_cards_num; card++) {
-               if (opl3sa2_state[card].cfg_mpu.slots[1] != -1) {
-                       unload_opl3sa2_mpu(&opl3sa2_state[card].cfg_mpu);
-               }
-               unload_opl3sa2_mss(&opl3sa2_state[card].cfg_mss);
-               unload_opl3sa2(&opl3sa2_state[card].cfg, card);
-#ifdef CONFIG_PNP
-               pnp_unregister_driver(&opl3sa2_driver);
-#endif
-       }
-}
-
-module_init(init_opl3sa2);
-module_exit(cleanup_opl3sa2);
-
-#ifndef MODULE
-static int __init setup_opl3sa2(char *str)
-{
-       /* io, irq, dma, dma2,... */
-#ifdef CONFIG_PNP
-       int ints[11];
-#else
-       int ints[9];
-#endif
-       str = get_options(str, ARRAY_SIZE(ints), ints);
-       
-       io       = ints[1];
-       irq      = ints[2];
-       dma      = ints[3];
-       dma2     = ints[4];
-       mss_io   = ints[5];
-       mpu_io   = ints[6];
-       ymode    = ints[7];
-       loopback = ints[8];
-#ifdef CONFIG_PNP
-       isapnp   = ints[9];
-       multiple = ints[10];
-#endif
-       return 1;
-}
-
-__setup("opl3sa2=", setup_opl3sa2);
-#endif
index be186a82e8d0489b5f6ca0050f208262b6dcf960..69b2e89fa1653d4b25b2e89563f6e2b7b59bd4e2 100644 (file)
@@ -5,3 +5,4 @@ gen_init_cpio
 initramfs_data.cpio
 initramfs_data.cpio.gz
 initramfs_list
+include